@@ -94,6 +94,7 @@ import { ProjectEnvVariable, ProjectSettings } from '../../types';
94
94
import exposeSystemEnvs from './expose-system-envs' ;
95
95
import { treeKill } from '../tree-kill' ;
96
96
import { nodeHeadersToFetchHeaders } from './headers' ;
97
+ import { formatQueryString , parseQueryString } from './parse-query-string' ;
97
98
import {
98
99
errorToString ,
99
100
isErrnoException ,
@@ -1396,9 +1397,11 @@ export default class DevServer {
1396
1397
1397
1398
const getReqUrl = ( rr : RouteResult ) : string | undefined => {
1398
1399
if ( rr . dest ) {
1399
- if ( rr . uri_args ) {
1400
- const destParsed = url . parse ( rr . dest , true ) ;
1401
- Object . assign ( destParsed . query , rr . uri_args ) ;
1400
+ if ( rr . query ) {
1401
+ const destParsed = url . parse ( rr . dest ) ;
1402
+ const destQuery = parseQueryString ( destParsed . search ) ;
1403
+ Object . assign ( destQuery , rr . query ) ;
1404
+ destParsed . search = formatQueryString ( destQuery ) ;
1402
1405
return url . format ( destParsed ) ;
1403
1406
}
1404
1407
return rr . dest ;
@@ -1533,9 +1536,8 @@ export default class DevServer {
1533
1536
1534
1537
// Retain orginal pathname, but override query parameters from the rewrite
1535
1538
const beforeRewriteUrl = req . url || '/' ;
1536
- const rewriteUrlParsed = url . parse ( beforeRewriteUrl , true ) ;
1537
- delete rewriteUrlParsed . search ;
1538
- rewriteUrlParsed . query = url . parse ( rewritePath , true ) . query ;
1539
+ const rewriteUrlParsed = url . parse ( beforeRewriteUrl ) ;
1540
+ rewriteUrlParsed . search = url . parse ( rewritePath ) . search ;
1539
1541
req . url = url . format ( rewriteUrlParsed ) ;
1540
1542
debug (
1541
1543
`Rewrote incoming HTTP URL from "${ beforeRewriteUrl } " to "${ req . url } "`
@@ -1594,9 +1596,10 @@ export default class DevServer {
1594
1596
1595
1597
if ( routeResult . isDestUrl ) {
1596
1598
// Mix the `routes` result dest query params into the req path
1597
- const destParsed = url . parse ( routeResult . dest , true ) ;
1598
- delete destParsed . search ;
1599
- Object . assign ( destParsed . query , routeResult . uri_args ) ;
1599
+ const destParsed = url . parse ( routeResult . dest ) ;
1600
+ const destQuery = parseQueryString ( destParsed . search ) ;
1601
+ Object . assign ( destQuery , routeResult . query ) ;
1602
+ destParsed . search = formatQueryString ( destQuery ) ;
1600
1603
const destUrl = url . format ( destParsed ) ;
1601
1604
1602
1605
debug ( `ProxyPass: ${ destUrl } ` ) ;
@@ -1737,7 +1740,7 @@ export default class DevServer {
1737
1740
throw new Error ( 'Expected Route Result but none was found.' ) ;
1738
1741
}
1739
1742
1740
- const { dest, headers , uri_args } = routeResult ;
1743
+ const { dest, query , headers } = routeResult ;
1741
1744
1742
1745
// Set any headers defined in the matched `route` config
1743
1746
for ( const [ name , value ] of Object . entries ( headers ) ) {
@@ -1773,10 +1776,11 @@ export default class DevServer {
1773
1776
}
1774
1777
1775
1778
this . setResponseHeaders ( res , requestId ) ;
1776
- const origUrl = url . parse ( req . url || '/' , true ) ;
1777
- delete origUrl . search ;
1779
+ const origUrl = url . parse ( req . url || '/' ) ;
1780
+ const origQuery = parseQueryString ( origUrl . search ) ;
1778
1781
origUrl . pathname = dest ;
1779
- Object . assign ( origUrl . query , uri_args ) ;
1782
+ Object . assign ( origQuery , query ) ;
1783
+ origUrl . search = formatQueryString ( origQuery ) ;
1780
1784
req . url = url . format ( origUrl ) ;
1781
1785
return proxyPass ( req , res , upstream , this , requestId , false ) ;
1782
1786
}
@@ -1798,10 +1802,11 @@ export default class DevServer {
1798
1802
Array . isArray ( buildResult . routes ) &&
1799
1803
buildResult . routes . length > 0
1800
1804
) {
1801
- const origUrl = url . parse ( req . url || '/' , true ) ;
1802
- delete origUrl . search ;
1805
+ const origUrl = url . parse ( req . url || '/' ) ;
1806
+ const origQuery = parseQueryString ( origUrl . search ) ;
1803
1807
origUrl . pathname = dest ;
1804
- Object . assign ( origUrl . query , uri_args ) ;
1808
+ Object . assign ( origQuery , query ) ;
1809
+ origUrl . search = formatQueryString ( origQuery ) ;
1805
1810
const newUrl = url . format ( origUrl ) ;
1806
1811
debug (
1807
1812
`Checking build result's ${ buildResult . routes . length } \`routes\` to match ${ newUrl } `
@@ -1897,11 +1902,13 @@ export default class DevServer {
1897
1902
) ;
1898
1903
1899
1904
// Mix in the routing based query parameters
1900
- const parsed = url . parse ( req . url || '/' , true ) ;
1901
- Object . assign ( parsed . query , uri_args ) ;
1905
+ const origUrl = url . parse ( req . url || '/' ) ;
1906
+ const origQuery = parseQueryString ( origUrl . search ) ;
1907
+ Object . assign ( origQuery , query ) ;
1908
+ origUrl . search = formatQueryString ( origQuery ) ;
1902
1909
req . url = url . format ( {
1903
- pathname : parsed . pathname ,
1904
- query : parsed . query ,
1910
+ pathname : origUrl . pathname ,
1911
+ search : origUrl . search ,
1905
1912
} ) ;
1906
1913
1907
1914
// Add the Vercel platform proxy request headers
@@ -2017,11 +2024,13 @@ export default class DevServer {
2017
2024
requestId = generateRequestId ( this . podId , true ) ;
2018
2025
2019
2026
// Mix the `routes` result dest query params into the req path
2020
- const parsed = url . parse ( req . url || '/' , true ) ;
2021
- Object . assign ( parsed . query , uri_args ) ;
2027
+ const origUrl = url . parse ( req . url || '/' ) ;
2028
+ const origQuery = parseQueryString ( origUrl . search ) ;
2029
+ Object . assign ( origQuery , query ) ;
2030
+ origUrl . search = formatQueryString ( origQuery ) ;
2022
2031
const path = url . format ( {
2023
- pathname : parsed . pathname ,
2024
- query : parsed . query ,
2032
+ pathname : origUrl . pathname ,
2033
+ search : origUrl . search ,
2025
2034
} ) ;
2026
2035
2027
2036
const body = await rawBody ( req ) ;
0 commit comments