1
1
import { type QRL } from '@qwik.dev/core' ;
2
- import { _serialize , _UNINITIALIZED , _verifySerializable } from '@qwik.dev/core/internal' ;
2
+ import { _serialize , _verifySerializable } from '@qwik.dev/core/internal' ;
3
3
import type { Render , RenderToStringResult } from '@qwik.dev/core/server' ;
4
4
import { QACTION_KEY , QFN_KEY } from '../../runtime/src/constants' ;
5
5
import {
@@ -13,25 +13,26 @@ import {
13
13
type RouteModule ,
14
14
} from '../../runtime/src/types' ;
15
15
import { HttpStatus } from './http-status-codes' ;
16
+ import {
17
+ executeLoader ,
18
+ loaderDataHandler ,
19
+ runValidators ,
20
+ singleLoaderHandler ,
21
+ } from './loader-endpoints' ;
22
+ import { qDataHandler } from './qdata-endpoints' ;
16
23
import {
17
24
RequestEvShareQData ,
18
25
RequestEvShareServerTiming ,
19
26
RequestEvSharedActionId ,
20
27
RequestRouteName ,
21
28
getRequestLoaders ,
22
29
getRequestMode ,
30
+ recognizeRequest ,
23
31
type RequestEventInternal ,
24
32
} from './request-event' ;
25
33
import { getQwikRouterServerData } from './response-page' ;
26
34
import type { ErrorCodes , RequestEvent , RequestEventBase , RequestHandler } from './types' ;
27
- import { IsQData , QDATA_JSON } from './user-response' ;
28
- import {
29
- executeLoader ,
30
- singleLoaderHandler ,
31
- runValidators ,
32
- loaderDataHandler ,
33
- } from './loader-endpoints' ;
34
- import { qDataHandler } from './qdata-endpoints' ;
35
+ import { IsQData , IsQLoader , IsQLoaderData , OriginalQDataName } from './user-response' ;
35
36
// Import separately to avoid duplicate imports in the vite dev server
36
37
import { RedirectMessage , ServerError } from '@qwik.dev/router/middleware/request-handler' ;
37
38
@@ -80,24 +81,21 @@ export const resolveRequestHandlers = (
80
81
requestHandlers . unshift ( csrfCheckMiddleware ) ;
81
82
}
82
83
}
84
+ requestHandlers . push ( handleRedirect ) ;
83
85
if ( isPageRoute ) {
84
86
// server$
85
87
if ( method === 'POST' || method === 'GET' ) {
86
88
requestHandlers . push ( pureServerFunction ) ;
87
89
}
88
90
89
- requestHandlers . push ( fixTrailingSlash ) ;
90
- requestHandlers . push ( loaderDataHandler ( routeLoaders ) ) ;
91
- requestHandlers . push ( singleLoaderHandler ( routeLoaders ) ) ;
92
- requestHandlers . push ( qDataHandler ) ;
93
- }
94
- requestHandlers . push ( handleRedirect ) ;
95
-
96
- if ( isPageRoute ) {
97
91
requestHandlers . push ( ( ev ) => {
98
92
// Set the current route name
99
93
ev . sharedMap . set ( RequestRouteName , routeName ) ;
100
94
} ) ;
95
+ requestHandlers . push ( fixTrailingSlash ) ;
96
+ requestHandlers . push ( loaderDataHandler ( routeLoaders ) ) ;
97
+ requestHandlers . push ( singleLoaderHandler ( routeLoaders ) ) ;
98
+ requestHandlers . push ( qDataHandler ) ;
101
99
requestHandlers . push ( actionsMiddleware ( routeActions ) ) ;
102
100
requestHandlers . push ( loadersMiddleware ( routeLoaders ) ) ;
103
101
requestHandlers . push ( renderHandler ) ;
@@ -313,7 +311,8 @@ async function pureServerFunction(ev: RequestEvent) {
313
311
function fixTrailingSlash ( ev : RequestEvent ) {
314
312
const { basePathname, originalUrl, sharedMap } = ev ;
315
313
const { pathname, search } = originalUrl ;
316
- const isQData = sharedMap . has ( IsQData ) ;
314
+ const isQData =
315
+ sharedMap . has ( IsQData ) || sharedMap . has ( IsQLoaderData ) || sharedMap . has ( IsQLoader ) ;
317
316
if ( ! isQData && pathname !== basePathname && ! pathname . endsWith ( '.html' ) ) {
318
317
// only check for slash redirect on pages
319
318
if ( ! globalThis . __NO_TRAILING_SLASH__ ) {
@@ -357,8 +356,11 @@ export function isLastModulePageRoute(routeModules: RouteModule[]) {
357
356
358
357
export function getPathname ( url : URL ) {
359
358
url = new URL ( url ) ;
360
- if ( url . pathname . endsWith ( QDATA_JSON ) ) {
361
- url . pathname = url . pathname . slice ( 0 , - QDATA_JSON . length ) ;
359
+
360
+ const qDataInfo = recognizeRequest ( url . pathname ) ;
361
+
362
+ if ( qDataInfo ) {
363
+ url . pathname = url . pathname . slice ( 0 , - qDataInfo . trimLength ) ;
362
364
}
363
365
if ( ! globalThis . __NO_TRAILING_SLASH__ ) {
364
366
if ( ! url . pathname . endsWith ( '/' ) ) {
@@ -417,7 +419,10 @@ export function renderQwikMiddleware(render: Render) {
417
419
if ( requestEv . headersSent ) {
418
420
return ;
419
421
}
420
- const isPageDataReq = requestEv . sharedMap . has ( IsQData ) ;
422
+ const isPageDataReq =
423
+ requestEv . sharedMap . has ( IsQData ) ||
424
+ requestEv . sharedMap . has ( IsQLoaderData ) ||
425
+ requestEv . sharedMap . has ( IsQLoader ) ;
421
426
if ( isPageDataReq ) {
422
427
return ;
423
428
}
@@ -469,7 +474,10 @@ export function renderQwikMiddleware(render: Render) {
469
474
}
470
475
471
476
export async function handleRedirect ( requestEv : RequestEvent ) {
472
- const isPageDataReq = requestEv . sharedMap . has ( IsQData ) ;
477
+ const isPageDataReq =
478
+ requestEv . sharedMap . has ( IsQData ) ||
479
+ requestEv . sharedMap . has ( IsQLoaderData ) ||
480
+ requestEv . sharedMap . has ( IsQLoader ) ;
473
481
if ( ! isPageDataReq ) {
474
482
return ;
475
483
}
@@ -490,7 +498,7 @@ export async function handleRedirect(requestEv: RequestEvent) {
490
498
const isRedirect = status >= 301 && status <= 308 && location ;
491
499
492
500
if ( isRedirect ) {
493
- const adaptedLocation = makeQDataPath ( location ) ;
501
+ const adaptedLocation = makeQDataPath ( location , requestEv . sharedMap ) ;
494
502
if ( adaptedLocation ) {
495
503
requestEv . headers . set ( 'Location' , adaptedLocation ) ;
496
504
requestEv . getWritableStream ( ) . close ( ) ;
@@ -502,12 +510,16 @@ export async function handleRedirect(requestEv: RequestEvent) {
502
510
}
503
511
}
504
512
505
- function makeQDataPath ( href : string ) {
513
+ function makeQDataPath ( href : string , sharedMap : Map < string , unknown > ) {
506
514
if ( href . startsWith ( '/' ) ) {
507
- const append = QDATA_JSON ;
508
515
const url = new URL ( href , 'http://localhost' ) ;
509
-
510
516
const pathname = url . pathname . endsWith ( '/' ) ? url . pathname . slice ( 0 , - 1 ) : url . pathname ;
517
+ const append = sharedMap . get ( OriginalQDataName ) as string ;
518
+
519
+ if ( ! append ) {
520
+ return undefined ;
521
+ }
522
+
511
523
return pathname + ( append . startsWith ( '/' ) ? '' : '/' ) + append + url . search ;
512
524
} else {
513
525
return undefined ;
0 commit comments