@@ -31,6 +31,16 @@ const postBPage = createComponent(async (result: any, props: any, slots: any) =>
3131 return render `<h1>Post B</h1><h2>${ email } </h2>` ;
3232} ) ;
3333
34+ function createRequestWithHostProvidedBody ( method : 'GET' | 'HEAD' , url : string ) {
35+ const request = new Request ( url , {
36+ method : 'POST' ,
37+ body : 'x' ,
38+ headers : { 'content-length' : '1' , 'content-type' : 'text/plain' } ,
39+ } ) ;
40+ Object . defineProperty ( request , 'method' , { value : method } ) ;
41+ return request ;
42+ }
43+
3444describe ( 'Rewrites via App - basic' , ( ) => {
3545 const app = createTestApp ( [
3646 createPage ( rewriteTo ( '/' ) , { route : '/reroute' } ) ,
@@ -125,6 +135,86 @@ describe('Rewrites via App - POST body forwarding', () => {
125135 } ) ;
126136} ) ;
127137
138+ describe ( 'Rewrites via App - GET and HEAD body handling' , ( ) => {
139+ const rewrittenRequests : Request [ ] = [ ] ;
140+ const targetPage = createComponent ( ( result : any , props : any , slots : any ) => {
141+ const Astro = result . createAstro ( props , slots ) ;
142+ rewrittenRequests . push ( Astro . request ) ;
143+ return render `<h1>Target</h1>` ;
144+ } ) ;
145+ const app = createTestApp ( [
146+ createPage ( rewriteTo ( '/target' ) , { route : '/source' } ) ,
147+ createPage ( targetPage , { route : '/target' } ) ,
148+ ] ) ;
149+
150+ for ( const method of [ 'GET' , 'HEAD' ] as const ) {
151+ it ( `omits a host-provided ${ method } body from the rewritten request` , async ( ) => {
152+ rewrittenRequests . length = 0 ;
153+ const res = await app . render (
154+ createRequestWithHostProvidedBody ( method , 'http://example.com/source' ) ,
155+ ) ;
156+
157+ assert . equal ( res . status , 200 ) ;
158+ const rewrittenRequest = rewrittenRequests . at ( - 1 ) ;
159+ assert . ok ( rewrittenRequest ) ;
160+ assert . equal ( rewrittenRequest . method , method ) ;
161+ assert . equal ( rewrittenRequest . body , null ) ;
162+ } ) ;
163+ }
164+ } ) ;
165+
166+ describe ( 'Rewrites via App - GET and HEAD body handling in middleware sequences' , ( ) => {
167+ const sequencedRequests : Request [ ] = [ ] ;
168+ const first = async ( _context : APIContext , next : MiddlewareNext ) => next ( '/post/post-b' ) ;
169+ const second = async ( context : APIContext , next : MiddlewareNext ) => {
170+ sequencedRequests . push ( context . request ) ;
171+ return next ( ) ;
172+ } ;
173+ const app = createTestApp (
174+ [
175+ createPage (
176+ createComponent ( ( ) => render `` ) ,
177+ { route : '/source' } ,
178+ ) ,
179+ createPage ( postBPage , { route : '/post/post-b' } ) ,
180+ ] ,
181+ { middleware : ( ) => ( { onRequest : sequence ( first , second ) } ) } ,
182+ ) ;
183+
184+ for ( const method of [ 'GET' , 'HEAD' ] as const ) {
185+ it ( `omits a host-provided ${ method } body before running the next middleware` , async ( ) => {
186+ sequencedRequests . length = 0 ;
187+ const res = await app . render (
188+ createRequestWithHostProvidedBody ( method , 'http://example.com/source' ) ,
189+ ) ;
190+
191+ assert . equal ( res . status , 200 ) ;
192+ const sequencedRequest = sequencedRequests . at ( - 1 ) ;
193+ assert . ok ( sequencedRequest ) ;
194+ assert . equal ( sequencedRequest . method , method ) ;
195+ assert . equal ( sequencedRequest . body , null ) ;
196+ } ) ;
197+ }
198+
199+ it ( 'preserves a POST body through the sequenced and final rewritten requests' , async ( ) => {
200+ sequencedRequests . length = 0 ;
201+ const res = await app . render (
202+ new Request ( 'http://example.com/source' , {
203+ method : 'POST' ,
204+ body : JSON . stringify ( { email : 'example@example.com' } ) ,
205+ headers : { 'content-type' : 'application/json' } ,
206+ } ) ,
207+ ) ;
208+
209+ assert . equal ( res . status , 200 ) ;
210+ const $ = cheerio . load ( await res . text ( ) ) ;
211+ assert . match ( $ ( 'h2' ) . text ( ) , / e x a m p l e @ e x a m p l e .c o m / ) ;
212+ const sequencedRequest = sequencedRequests . at ( - 1 ) ;
213+ assert . ok ( sequencedRequest ) ;
214+ assert . deepEqual ( await sequencedRequest . json ( ) , { email : 'example@example.com' } ) ;
215+ } ) ;
216+ } ) ;
217+
128218describe ( 'Rewrites via App - URL and Request payloads' , ( ) => {
129219 const app = createTestApp ( [
130220 createPage (
0 commit comments