drill trailingSlash
This commit is contained in:
parent
d0e513f214
commit
daa5bab85a
4 changed files with 27 additions and 7 deletions
|
@ -23,13 +23,14 @@ function parsePathname(pathname: string, host: string | undefined, port: number)
|
||||||
|
|
||||||
export function createServer(
|
export function createServer(
|
||||||
{ client, port, host, removeBase }: CreateServerOptions,
|
{ client, port, host, removeBase }: CreateServerOptions,
|
||||||
handler: http.RequestListener
|
handler: http.RequestListener,
|
||||||
|
trailingSlash: string
|
||||||
) {
|
) {
|
||||||
const listener: http.RequestListener = (req, res) => {
|
const listener: http.RequestListener = (req, res) => {
|
||||||
if (req.url) {
|
if (req.url) {
|
||||||
let pathname: string | undefined = removeBase(req.url);
|
let pathname: string | undefined = removeBase(req.url);
|
||||||
pathname = pathname[0] === '/' ? pathname : '/' + pathname;
|
pathname = pathname[0] === '/' ? pathname : '/' + pathname;
|
||||||
const encodedURI = parsePathname(pathname, host, port);
|
let encodedURI = parsePathname(pathname, host, port);
|
||||||
|
|
||||||
if (!encodedURI) {
|
if (!encodedURI) {
|
||||||
res.writeHead(400);
|
res.writeHead(400);
|
||||||
|
@ -37,7 +38,21 @@ export function createServer(
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
const stream = send(req, encodedURI, {
|
let pathForSend = encodedURI;
|
||||||
|
|
||||||
|
if (trailingSlash === 'never') {
|
||||||
|
if (pathname.endsWith('/')) {
|
||||||
|
encodedURI = parsePathname(pathname.substring(0, pathname.length - 1), host, port);
|
||||||
|
if (!encodedURI) {
|
||||||
|
res.writeHead(400);
|
||||||
|
res.end('Bad request.');
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pathForSend = encodedURI + '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
const stream = send(req, pathForSend, {
|
||||||
root: fileURLToPath(client),
|
root: fileURLToPath(client),
|
||||||
dotfiles: pathname.startsWith('/.well-known/') ? 'allow' : 'deny',
|
dotfiles: pathname.startsWith('/.well-known/') ? 'allow' : 'deny',
|
||||||
});
|
});
|
||||||
|
@ -64,9 +79,11 @@ export function createServer(
|
||||||
location = req.url + '/';
|
location = req.url + '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!pathForSend.endsWith('/')) {
|
||||||
res.statusCode = 301;
|
res.statusCode = 301;
|
||||||
res.setHeader('Location', location);
|
res.setHeader('Location', location);
|
||||||
res.end(location);
|
res.end(location);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
stream.on('file', () => {
|
stream.on('file', () => {
|
||||||
forwardError = true;
|
forwardError = true;
|
||||||
|
|
|
@ -46,6 +46,7 @@ export default function createIntegration(userOptions: UserOptions): AstroIntegr
|
||||||
server: config.build.server?.toString(),
|
server: config.build.server?.toString(),
|
||||||
host: config.server.host,
|
host: config.server.host,
|
||||||
port: config.server.port,
|
port: config.server.port,
|
||||||
|
trailingSlash: config.trailingSlash,
|
||||||
};
|
};
|
||||||
setAdapter(getAdapter(_options));
|
setAdapter(getAdapter(_options));
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,8 @@ export default function startServer(app: NodeApp, options: Options) {
|
||||||
host,
|
host,
|
||||||
removeBase: app.removeBase.bind(app),
|
removeBase: app.removeBase.bind(app),
|
||||||
},
|
},
|
||||||
handler
|
handler,
|
||||||
|
options.trailingSlash
|
||||||
);
|
);
|
||||||
|
|
||||||
const protocol = server.server instanceof https.Server ? 'https' : 'http';
|
const protocol = server.server instanceof https.Server ? 'https' : 'http';
|
||||||
|
|
|
@ -15,6 +15,7 @@ export interface Options extends UserOptions {
|
||||||
port: number;
|
port: number;
|
||||||
server: string;
|
server: string;
|
||||||
client: string;
|
client: string;
|
||||||
|
trailingSlash: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type RequestHandlerParams = [
|
export type RequestHandlerParams = [
|
||||||
|
|
Loading…
Reference in a new issue