Skip to content

Commit

Permalink
fix: the development server was unable to correctly consume the "publ…
Browse files Browse the repository at this point in the history
…icPath" configuration (#1334)
  • Loading branch information
huanyu.why committed Jul 12, 2024
1 parent ea2376b commit da6d209
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 3 deletions.
18 changes: 15 additions & 3 deletions crates/mako/src/dev/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use {hyper, hyper_staticfile, hyper_tungstenite, open};

use crate::compiler::{Compiler, Context};
use crate::plugin::{PluginGenerateEndParams, PluginGenerateStats};
use crate::utils::tokio_runtime;
use crate::utils::{process_req_url, tokio_runtime};

pub struct DevServer {
root: PathBuf,
Expand Down Expand Up @@ -124,15 +124,27 @@ impl DevServer {
staticfile: hyper_staticfile::Static,
txws: broadcast::Sender<WsMessage>,
) -> Result<hyper::Response<Body>> {
let path = req.uri().path();
let mut path = req.uri().path().to_string();
let public_path = &context.config.public_path;
if !public_path.is_empty() {
path = match process_req_url(public_path, &path) {
Ok(p) => p,
Err(_) => {
return Ok(hyper::Response::builder()
.status(hyper::StatusCode::BAD_REQUEST)
.body(hyper::Body::from("Bad Request"))
.unwrap());
}
};
}
let path_without_slash_start = path.trim_start_matches('/');
let not_found_response = || {
hyper::Response::builder()
.status(hyper::StatusCode::NOT_FOUND)
.body(hyper::Body::empty())
.unwrap()
};
match path {
match path.as_str() {
"/__/hmr-ws" => {
if hyper_tungstenite::is_upgrade_request(&req) {
debug!("new websocket connection");
Expand Down
45 changes: 45 additions & 0 deletions crates/mako/src/utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,48 @@ impl ParseRegex for Option<String> {
})
}
}

pub fn process_req_url(public_path: &str, req_url: &str) -> Result<String> {
let public_path = format!("/{}/", public_path.trim_matches('/'));
if req_url.starts_with(&public_path) {
return Ok(req_url[public_path.len() - 1..].to_string());
}
Ok(req_url.to_string())
}

#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_process_req_url() {
assert_eq!(
process_req_url("/public/", "/public/index.html").unwrap(),
"/index.html"
);
assert_eq!(
process_req_url("public/", "/public/index.html").unwrap(),
"/index.html"
);
assert_eq!(
process_req_url("/public/foo/", "/public/foo/index.html").unwrap(),
"/index.html"
);
assert_eq!(
process_req_url("public/foo/", "/public/foo/index.html").unwrap(),
"/index.html"
);
assert_eq!(process_req_url("/", "/index.html").unwrap(), "/index.html");
assert_eq!(
process_req_url("/#/", "/#/index.html").unwrap(),
"/index.html"
);
assert_eq!(
process_req_url("/公共路径/", "/公共路径/index.html").unwrap(),
"/index.html"
);
assert_eq!(
process_req_url("公共路径/", "/公共路径/index.html").unwrap(),
"/index.html"
);
}
}
16 changes: 16 additions & 0 deletions packages/bundler-mako/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,22 @@ exports.dev = async function (opts) {

const outputPath = path.resolve(opts.cwd, opts.config.outputPath || 'dist');

function processReqURL(publicPath, reqURL) {
if (!publicPath.startsWith('/')) {
publicPath = '/' + publicPath;
}
if (reqURL.startsWith(publicPath)) {
return reqURL.slice(publicPath.length - 1);
} else {
return reqURL;
}
}
if (opts.config.publicPath) {
app.use((req, res, next) => {
req.url = processReqURL(opts.config.publicPath, req.url);
next();
});
}
// serve dist files
app.use(express.static(outputPath));

Expand Down

0 comments on commit da6d209

Please sign in to comment.