diff --git a/src/event/event.ts b/src/event/event.ts index fde7c76f..dc4e9490 100644 --- a/src/event/event.ts +++ b/src/event/event.ts @@ -1,7 +1,12 @@ import type { IncomingHttpHeaders } from "node:http"; import type { H3EventContext, HTTPMethod } from "../types"; import type { NodeIncomingMessage, NodeServerResponse } from "../node"; -import { MIMES, sanitizeStatusCode, sanitizeStatusMessage } from "../utils"; +import { + MIMES, + getRequestURL, + sanitizeStatusCode, + sanitizeStatusMessage, +} from "../utils"; import { H3Response } from "./response"; const DOUBLE_SLASH_RE = /[/\\]{2,}/g; // TODO: Dedup from request.ts @@ -22,6 +27,7 @@ export class H3Event implements Pick { _method: HTTPMethod | undefined; _headers: Headers | undefined; _path: string | undefined; + _url: URL | undefined; // Response _handled = false; @@ -45,6 +51,13 @@ export class H3Event implements Pick { return this._path; } + get url() { + if (!this._url) { + this._url = getRequestURL(this); + } + return this._url; + } + get handled(): boolean { return ( this._handled || this.node.res.writableEnded || this.node.res.headersSent diff --git a/src/utils/request.ts b/src/utils/request.ts index cbeac3d0..cc28186d 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -124,6 +124,6 @@ export function getRequestURL( ) { const host = getRequestHost(event, opts); const protocol = getRequestProtocol(event); - const path = getRequestPath(event); + const path = event.path; return new URL(path, `${protocol}://${host}`); } diff --git a/test/event.test.ts b/test/event.test.ts index ce2bab0a..ac48cddc 100644 --- a/test/event.test.ts +++ b/test/event.test.ts @@ -49,4 +49,15 @@ describe("Event", () => { expect(headers.find(([key]) => key === "x-test")[1]).toBe("works"); expect(headers.find(([key]) => key === "cookie")[1]).toBe("a; b"); }); + + it("can get request url", async () => { + app.use( + "/", + eventHandler((event) => { + return event.url; + }) + ); + const result = await request.get("/hello"); + expect(result.text).toMatch(/http:\/\/127.0.0.1:\d+\/hello/); + }); });