h3 1.6.5 → 1.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -257,23 +257,31 @@ function getRequestHeader(event, name) {
257
257
  return value;
258
258
  }
259
259
  const getHeader = getRequestHeader;
260
- function getRequestHost(event) {
261
- const xForwardedHost = event.node.req.headers["x-forwarded-host"];
262
- if (xForwardedHost) {
263
- return xForwardedHost;
260
+ function getRequestHost(event, opts = {}) {
261
+ if (opts.xForwardedHost) {
262
+ const xForwardedHost = event.node.req.headers["x-forwarded-host"];
263
+ if (xForwardedHost) {
264
+ return xForwardedHost;
265
+ }
264
266
  }
265
267
  return event.node.req.headers.host || "localhost";
266
268
  }
267
- function getRequestProtocol(event) {
268
- if (event.node.req.headers["x-forwarded-proto"] === "https") {
269
+ function getRequestProtocol(event, opts = {}) {
270
+ if (opts.xForwardedProto !== false && event.node.req.headers["x-forwarded-proto"] === "https") {
269
271
  return "https";
270
272
  }
271
273
  return event.node.req.connection.encrypted ? "https" : "http";
272
274
  }
273
- function getRequestURL(event) {
274
- const host = getRequestHost(event);
275
+ const DOUBLE_SLASH_RE = /[/\\]{2,}/g;
276
+ function getRequestPath(event) {
277
+ const path = (event.node.req.url || "/").replace(DOUBLE_SLASH_RE, "/");
278
+ return path;
279
+ }
280
+ function getRequestURL(event, opts = {}) {
281
+ const host = getRequestHost(event, opts);
275
282
  const protocol = getRequestProtocol(event);
276
- return new URL(event.path || "/", `${protocol}://${host}`);
283
+ const path = getRequestPath(event);
284
+ return new URL(path, `${protocol}://${host}`);
277
285
  }
278
286
 
279
287
  const RawBodySymbol = Symbol.for("h3RawBody");
@@ -1085,7 +1093,7 @@ class H3Event {
1085
1093
  this.node = { req, res };
1086
1094
  }
1087
1095
  get path() {
1088
- return this.req.url;
1096
+ return getRequestPath(this);
1089
1097
  }
1090
1098
  /** @deprecated Please use `event.node.req` instead. **/
1091
1099
  get req() {
@@ -1479,6 +1487,7 @@ exports.getQuery = getQuery;
1479
1487
  exports.getRequestHeader = getRequestHeader;
1480
1488
  exports.getRequestHeaders = getRequestHeaders;
1481
1489
  exports.getRequestHost = getRequestHost;
1490
+ exports.getRequestPath = getRequestPath;
1482
1491
  exports.getRequestProtocol = getRequestProtocol;
1483
1492
  exports.getRequestURL = getRequestURL;
1484
1493
  exports.getResponseHeader = getResponseHeader;
package/dist/index.d.ts CHANGED
@@ -108,7 +108,7 @@ declare class H3Event implements Pick<FetchEvent, "respondWith"> {
108
108
  node: NodeEventContext;
109
109
  context: H3EventContext;
110
110
  constructor(req: IncomingMessage, res: ServerResponse);
111
- get path(): string | undefined;
111
+ get path(): string;
112
112
  /** @deprecated Please use `event.node.req` instead. **/
113
113
  get req(): IncomingMessage;
114
114
  /** @deprecated Please use `event.node.res` instead. **/
@@ -333,9 +333,17 @@ declare function getRequestHeaders(event: H3Event): RequestHeaders;
333
333
  declare const getHeaders: typeof getRequestHeaders;
334
334
  declare function getRequestHeader(event: H3Event, name: string): RequestHeaders[string];
335
335
  declare const getHeader: typeof getRequestHeader;
336
- declare function getRequestHost(event: H3Event): string;
337
- declare function getRequestProtocol(event: H3Event): "https" | "http";
338
- declare function getRequestURL(event: H3Event): URL;
336
+ declare function getRequestHost(event: H3Event, opts?: {
337
+ xForwardedHost?: boolean;
338
+ }): string;
339
+ declare function getRequestProtocol(event: H3Event, opts?: {
340
+ xForwardedProto?: boolean;
341
+ }): "https" | "http";
342
+ declare function getRequestPath(event: H3Event): string;
343
+ declare function getRequestURL(event: H3Event, opts?: {
344
+ xForwardedHost?: boolean;
345
+ xForwardedProto?: boolean;
346
+ }): URL;
339
347
 
340
348
  declare function send(event: H3Event, data?: any, type?: string): Promise<void>;
341
349
  /**
@@ -402,4 +410,4 @@ interface CreateRouterOptions {
402
410
  }
403
411
  declare function createRouter(opts?: CreateRouterOptions): Router;
404
412
 
405
- export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, DynamicEventHandler, Encoding, EventHandler, EventHandlerResponse, H3CorsOptions, H3Error, H3Event, H3EventContext, H3Headers, H3Response, HTTPMethod, InputLayer, InputStack, Layer, LazyEventHandler, MIMES, Matcher, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, ProxyOptions, RequestHeaders, Router, RouterMethod, RouterUse, Session, SessionConfig, SessionData, Stack, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
413
+ export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, DynamicEventHandler, Encoding, EventHandler, EventHandlerResponse, H3CorsOptions, H3Error, H3Event, H3EventContext, H3Headers, H3Response, HTTPMethod, InputLayer, InputStack, Layer, LazyEventHandler, MIMES, Matcher, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, ProxyOptions, RequestHeaders, Router, RouterMethod, RouterUse, Session, SessionConfig, SessionData, Stack, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestPath, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
package/dist/index.mjs CHANGED
@@ -250,23 +250,31 @@ function getRequestHeader(event, name) {
250
250
  return value;
251
251
  }
252
252
  const getHeader = getRequestHeader;
253
- function getRequestHost(event) {
254
- const xForwardedHost = event.node.req.headers["x-forwarded-host"];
255
- if (xForwardedHost) {
256
- return xForwardedHost;
253
+ function getRequestHost(event, opts = {}) {
254
+ if (opts.xForwardedHost) {
255
+ const xForwardedHost = event.node.req.headers["x-forwarded-host"];
256
+ if (xForwardedHost) {
257
+ return xForwardedHost;
258
+ }
257
259
  }
258
260
  return event.node.req.headers.host || "localhost";
259
261
  }
260
- function getRequestProtocol(event) {
261
- if (event.node.req.headers["x-forwarded-proto"] === "https") {
262
+ function getRequestProtocol(event, opts = {}) {
263
+ if (opts.xForwardedProto !== false && event.node.req.headers["x-forwarded-proto"] === "https") {
262
264
  return "https";
263
265
  }
264
266
  return event.node.req.connection.encrypted ? "https" : "http";
265
267
  }
266
- function getRequestURL(event) {
267
- const host = getRequestHost(event);
268
+ const DOUBLE_SLASH_RE = /[/\\]{2,}/g;
269
+ function getRequestPath(event) {
270
+ const path = (event.node.req.url || "/").replace(DOUBLE_SLASH_RE, "/");
271
+ return path;
272
+ }
273
+ function getRequestURL(event, opts = {}) {
274
+ const host = getRequestHost(event, opts);
268
275
  const protocol = getRequestProtocol(event);
269
- return new URL(event.path || "/", `${protocol}://${host}`);
276
+ const path = getRequestPath(event);
277
+ return new URL(path, `${protocol}://${host}`);
270
278
  }
271
279
 
272
280
  const RawBodySymbol = Symbol.for("h3RawBody");
@@ -1078,7 +1086,7 @@ class H3Event {
1078
1086
  this.node = { req, res };
1079
1087
  }
1080
1088
  get path() {
1081
- return this.req.url;
1089
+ return getRequestPath(this);
1082
1090
  }
1083
1091
  /** @deprecated Please use `event.node.req` instead. **/
1084
1092
  get req() {
@@ -1434,4 +1442,4 @@ function createRouter(opts = {}) {
1434
1442
  return router;
1435
1443
  }
1436
1444
 
1437
- export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
1445
+ export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestPath, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "h3",
3
- "version": "1.6.5",
3
+ "version": "1.6.6",
4
4
  "description": "Tiny JavaScript Server",
5
5
  "repository": "unjs/h3",
6
6
  "license": "MIT",
@@ -19,6 +19,16 @@
19
19
  "files": [
20
20
  "dist"
21
21
  ],
22
+ "scripts": {
23
+ "build": "unbuild",
24
+ "dev": "vitest",
25
+ "lint": "eslint --cache --ext .ts,.js,.mjs,.cjs . && prettier -c src test playground",
26
+ "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test playground -w",
27
+ "play": "jiti ./playground/index.ts",
28
+ "profile": "0x -o -D .profile -P 'autocannon -c 100 -p 10 -d 40 http://localhost:$PORT' ./playground/server.cjs",
29
+ "release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags",
30
+ "test": "pnpm lint && vitest run --coverage"
31
+ },
22
32
  "dependencies": {
23
33
  "cookie-es": "^1.0.0",
24
34
  "defu": "^6.1.2",
@@ -31,34 +41,24 @@
31
41
  "devDependencies": {
32
42
  "0x": "^5.5.0",
33
43
  "@types/express": "^4.17.17",
34
- "@types/node": "^20.0.0",
44
+ "@types/node": "^20.1.4",
35
45
  "@types/supertest": "^2.0.12",
36
46
  "@vitest/coverage-c8": "^0.31.0",
37
47
  "autocannon": "^7.11.0",
38
48
  "changelogen": "^0.5.3",
39
49
  "connect": "^3.7.0",
40
- "eslint": "^8.39.0",
50
+ "eslint": "^8.40.0",
41
51
  "eslint-config-unjs": "^0.1.0",
42
52
  "express": "^4.18.2",
43
53
  "get-port": "^6.1.2",
44
54
  "jiti": "^1.18.2",
45
55
  "listhen": "^1.0.4",
46
- "node-fetch-native": "^1.1.0",
56
+ "node-fetch-native": "^1.1.1",
47
57
  "prettier": "^2.8.8",
48
58
  "supertest": "^6.3.3",
49
59
  "typescript": "^5.0.4",
50
60
  "unbuild": "^1.2.1",
51
61
  "vitest": "^0.31.0"
52
62
  },
53
- "packageManager": "pnpm@8.4.0",
54
- "scripts": {
55
- "build": "unbuild",
56
- "dev": "vitest",
57
- "lint": "eslint --cache --ext .ts,.js,.mjs,.cjs . && prettier -c src test playground",
58
- "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test playground -w",
59
- "play": "jiti ./playground/index.ts",
60
- "profile": "0x -o -D .profile -P 'autocannon -c 100 -p 10 -d 40 http://localhost:$PORT' ./playground/server.cjs",
61
- "release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags",
62
- "test": "pnpm lint && vitest run --coverage"
63
- }
63
+ "packageManager": "pnpm@8.5.1"
64
64
  }