Skip to content

Commit 8da9b93

Browse files
committed
CR fixes -2-
1 parent f9239a9 commit 8da9b93

File tree

9 files changed

+108
-69
lines changed

9 files changed

+108
-69
lines changed

packages/docs/src/routes/api/qwik-city-middleware-request-handler/api.json

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,23 @@
261261
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-city/src/middleware/request-handler/cookie.ts",
262262
"mdFile": "qwik-city.mergeheaderscookies.md"
263263
},
264+
{
265+
"name": "pathname",
266+
"id": "rewritemessage-pathname",
267+
"hierarchy": [
268+
{
269+
"name": "RewriteMessage",
270+
"id": "rewritemessage-pathname"
271+
},
272+
{
273+
"name": "pathname",
274+
"id": "rewritemessage-pathname"
275+
}
276+
],
277+
"kind": "Property",
278+
"content": "```typescript\nreadonly pathname: string;\n```",
279+
"mdFile": "qwik-city.rewritemessage.pathname.md"
280+
},
264281
{
265282
"name": "RedirectMessage",
266283
"id": "redirectmessage",
@@ -411,7 +428,7 @@
411428
}
412429
],
413430
"kind": "Class",
414-
"content": "```typescript\nexport declare class RewriteMessage extends AbortMessage \n```\n**Extends:** [AbortMessage](#abortmessage)",
431+
"content": "```typescript\nexport declare class RewriteMessage extends AbortMessage \n```\n**Extends:** [AbortMessage](#abortmessage)\n\n\n<table><thead><tr><th>\n\nConstructor\n\n\n</th><th>\n\nModifiers\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[(constructor)(pathname)](#)\n\n\n</td><td>\n\n\n</td><td>\n\nConstructs a new instance of the `RewriteMessage` class\n\n\n</td></tr>\n</tbody></table>\n\n\n<table><thead><tr><th>\n\nProperty\n\n\n</th><th>\n\nModifiers\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[pathname](#rewritemessage-pathname)\n\n\n</td><td>\n\n`readonly`\n\n\n</td><td>\n\nstring\n\n\n</td><td>\n\n\n</td></tr>\n</tbody></table>",
415432
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-city/src/middleware/request-handler/rewrite-handler.ts",
416433
"mdFile": "qwik-city.rewritemessage.md"
417434
},

packages/docs/src/routes/api/qwik-city-middleware-request-handler/index.mdx

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,12 @@ Headers
717717

718718
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-city/src/middleware/request-handler/cookie.ts)
719719

720+
## pathname
721+
722+
```typescript
723+
readonly pathname: string;
724+
```
725+
720726
## RedirectMessage
721727

722728
```typescript
@@ -1512,6 +1518,66 @@ export declare class RewriteMessage extends AbortMessage
15121518
15131519
**Extends:** [AbortMessage](#abortmessage)
15141520
1521+
<table><thead><tr><th>
1522+
1523+
Constructor
1524+
1525+
</th><th>
1526+
1527+
Modifiers
1528+
1529+
</th><th>
1530+
1531+
Description
1532+
1533+
</th></tr></thead>
1534+
<tbody><tr><td>
1535+
1536+
[(constructor)(pathname)](#)
1537+
1538+
</td><td>
1539+
1540+
</td><td>
1541+
1542+
Constructs a new instance of the `RewriteMessage` class
1543+
1544+
</td></tr>
1545+
</tbody></table>
1546+
1547+
<table><thead><tr><th>
1548+
1549+
Property
1550+
1551+
</th><th>
1552+
1553+
Modifiers
1554+
1555+
</th><th>
1556+
1557+
Type
1558+
1559+
</th><th>
1560+
1561+
Description
1562+
1563+
</th></tr></thead>
1564+
<tbody><tr><td>
1565+
1566+
[pathname](#rewritemessage-pathname)
1567+
1568+
</td><td>
1569+
1570+
`readonly`
1571+
1572+
</td><td>
1573+
1574+
string
1575+
1576+
</td><td>
1577+
1578+
</td></tr>
1579+
</tbody></table>
1580+
15151581
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-city/src/middleware/request-handler/rewrite-handler.ts)
15161582
15171583
## ServerError

packages/qwik-city/src/middleware/request-handler/middleware.request-handler.api.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ export interface ResolveValue {
178178

179179
// @public (undocumented)
180180
export class RewriteMessage extends AbortMessage {
181+
constructor(pathname: string);
182+
// (undocumented)
183+
readonly pathname: string;
181184
}
182185

183186
// @public (undocumented)

packages/qwik-city/src/middleware/request-handler/request-event.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export const RequestRouteName = '@routeName';
3737
export const RequestEvSharedActionId = '@actionId';
3838
export const RequestEvSharedActionFormData = '@actionFormData';
3939
export const RequestEvSharedNonce = '@nonce';
40+
export const RequestEvIsRewrite = '@rewrite';
4041

4142
export function createRequestEvent(
4243
serverRequestEv: ServerRequestEvent,
@@ -249,19 +250,8 @@ export function createRequestEvent(
249250
if (pathname.startsWith('http')) {
250251
throw new Error('Rewrite does not support absolute urls');
251252
}
252-
253-
const rewriteUrl = new URL(url);
254-
rewriteUrl.pathname = pathname;
255-
256-
// Fix consecutive slashes - e.g //path//to//page -> /path/to/page
257-
const fixedPathname = rewriteUrl.pathname.replace(/(^|[^:])\/{2,}/g, '$1/');
258-
if (rewriteUrl.pathname !== fixedPathname) {
259-
console.warn(`Rewrite URL ${rewriteUrl.pathname} is invalid, fixing to ${fixedPathname}`);
260-
rewriteUrl.pathname = fixedPathname;
261-
}
262-
263-
headers.set('Rewrite-Location', rewriteUrl.toString());
264-
return new RewriteMessage();
253+
sharedMap.set(RequestEvIsRewrite, true);
254+
return new RewriteMessage(pathname.replace(/\/+/g, '/'));
265255
},
266256

267257
defer: (returnData) => {

packages/qwik-city/src/middleware/request-handler/resolve-request-handlers.ts

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import type {
1414
} from '../../runtime/src/types';
1515
import { HttpStatus } from './http-status-codes';
1616
import { RedirectMessage } from './redirect-handler';
17-
import { RewriteMessage } from './rewrite-handler';
1817
import {
1918
RequestEvQwikSerializer,
19+
RequestEvIsRewrite,
2020
RequestEvSharedActionId,
2121
RequestRouteName,
2222
getRequestLoaders,
@@ -79,7 +79,6 @@ export const resolveRequestHandlers = (
7979
}
8080
const routeModules = route[2];
8181
requestHandlers.push(handleRedirect);
82-
requestHandlers.push(handleRewrite);
8382
_resolveRequestHandlers(
8483
routeLoaders,
8584
routeActions,
@@ -536,39 +535,6 @@ export async function handleRedirect(requestEv: RequestEvent) {
536535
}
537536
}
538537

539-
export async function handleRewrite(requestEv: RequestEvent) {
540-
const isPageDataReq = requestEv.sharedMap.has(IsQData);
541-
if (!isPageDataReq) {
542-
return;
543-
}
544-
try {
545-
await requestEv.next();
546-
} catch (err) {
547-
if (!(err instanceof RewriteMessage)) {
548-
throw err;
549-
}
550-
}
551-
552-
if (requestEv.headersSent) {
553-
return;
554-
}
555-
556-
const status = requestEv.status();
557-
const location = requestEv.headers.get('Rewrite-Location');
558-
const isRewrite = status === 200 && location;
559-
560-
if (isRewrite) {
561-
const adaptedLocation = makeQDataPath(location);
562-
563-
if (adaptedLocation) {
564-
requestEv.headers.set('Rewrite-Location', adaptedLocation);
565-
return;
566-
} else {
567-
requestEv.status(200);
568-
}
569-
}
570-
}
571-
572538
export async function renderQData(requestEv: RequestEvent) {
573539
const isPageDataReq = requestEv.sharedMap.has(IsQData);
574540
if (!isPageDataReq) {
@@ -582,7 +548,6 @@ export async function renderQData(requestEv: RequestEvent) {
582548

583549
const status = requestEv.status();
584550
const redirectLocation = requestEv.headers.get('Location');
585-
const rewriteLocation = requestEv.headers.get('Rewrite-Location');
586551
const trailingSlash = getRequestTrailingSlash(requestEv);
587552

588553
const requestHeaders: Record<string, string> = {};
@@ -595,7 +560,7 @@ export async function renderQData(requestEv: RequestEvent) {
595560
status: status !== 200 ? status : 200,
596561
href: getPathname(requestEv.url, trailingSlash),
597562
redirect: redirectLocation ?? undefined,
598-
rewrite: rewriteLocation ?? undefined,
563+
isRewrite: requestEv.sharedMap.get(RequestEvIsRewrite),
599564
};
600565
const writer = requestEv.getWritableStream().getWriter();
601566
const qwikSerializer = (requestEv as RequestEventInternal)[RequestEvQwikSerializer];
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { AbortMessage } from './redirect-handler';
22

33
/** @public */
4-
export class RewriteMessage extends AbortMessage {}
4+
export class RewriteMessage extends AbortMessage {
5+
constructor(readonly pathname: string) {
6+
super();
7+
}
8+
}

packages/qwik-city/src/middleware/request-handler/user-response.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,8 @@ async function runNext(
6868
resolve: (value: any) => void
6969
) {
7070
let rewriteAttempt = 1;
71-
let didRewrite = false;
7271

7372
async function _runNext() {
74-
didRewrite = false;
75-
7673
try {
7774
// Run all middlewares
7875
await requestEv.next();
@@ -85,7 +82,12 @@ async function runNext(
8582
throw new Error(`Rewrite failed - Max rewrite attempts reached: ${rewriteAttempt - 1}`);
8683
}
8784

88-
didRewrite = true;
85+
rewriteAttempt += 1;
86+
const url = new URL(requestEv.url);
87+
url.pathname = e.pathname;
88+
const { loadedRoute, requestHandlers } = await rebuildRouteInfo(url);
89+
requestEv.resetRoute(loadedRoute, requestHandlers, url);
90+
return await _runNext();
8991
} else if (e instanceof ServerError) {
9092
if (!requestEv.headersSent) {
9193
const status = e.status as StatusCodes;
@@ -117,6 +119,7 @@ async function runNext(
117119
console.error('Unable to render error page');
118120
}
119121
}
122+
120123
return e;
121124
}
122125
}
@@ -125,16 +128,7 @@ async function runNext(
125128
}
126129

127130
try {
128-
let runResult = await _runNext();
129-
if (didRewrite) {
130-
rewriteAttempt += 1;
131-
const url = new URL(requestEv.headers.get('Rewrite-Location')!);
132-
const { loadedRoute, requestHandlers } = await rebuildRouteInfo(url);
133-
requestEv.resetRoute(loadedRoute, requestHandlers, url);
134-
runResult = await _runNext();
135-
}
136-
137-
return runResult;
131+
return await _runNext();
138132
} finally {
139133
if (!requestEv.isDirty()) {
140134
resolve(null);

packages/qwik-city/src/runtime/src/qwik-city-component.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,15 +346,15 @@ export const QwikCityProvider = component$<QwikCityProps>((props) => {
346346
const newURL = new URL(newHref, trackUrl);
347347
if (!isSamePath(newURL, trackUrl)) {
348348
// Change our path to the canonical path in the response unless rewrite.
349-
if (!pageData.rewrite) {
349+
if (!pageData.isRewrite) {
350350
trackUrl = newURL;
351351
}
352352

353353
loadRoutePromise = loadRoute(
354354
qwikCity.routes,
355355
qwikCity.menus,
356356
qwikCity.cacheModules,
357-
newURL.pathname // Load the canonical path.
357+
newURL.pathname // Load the actual required path.
358358
);
359359
}
360360

packages/qwik-city/src/runtime/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ export interface ClientPageData extends Omit<EndpointResponse, 'status'> {
311311
status: number;
312312
href: string;
313313
redirect?: string;
314-
rewrite?: string;
314+
isRewrite?: boolean;
315315
}
316316

317317
/** @public */

0 commit comments

Comments
 (0)