@@ -132,7 +132,16 @@ async def _download_request(self, request: Request, spider: Spider) -> Response:
132132 if not isinstance (page , Page ):
133133 page = await self ._create_page (request )
134134 await page .unroute ("**" )
135- await page .route ("**" , self ._make_request_handler (scrapy_request = request ))
135+ await page .route (
136+ "**" ,
137+ self ._make_request_handler (
138+ url = request .url ,
139+ method = request .method ,
140+ headers = request .headers .to_unicode_dict (),
141+ body = request .body ,
142+ encoding = getattr (request , "encoding" , None ),
143+ ),
144+ )
136145
137146 try :
138147 result = await self ._download_request_with_page (request , page )
@@ -186,28 +195,23 @@ def close_browser_context_callback() -> None:
186195
187196 return close_browser_context_callback
188197
189- def _make_request_handler (self , scrapy_request : Request ) -> Callable :
198+ def _make_request_handler (
199+ self , url : str , method : str , headers : dict , body : Optional [bytes ], encoding : str = "utf8"
200+ ) -> Callable :
190201 def request_handler (route : Route , pw_request : PlaywrightRequest ) -> None :
191202 """Override request headers, method and body."""
192- if pw_request .url == scrapy_request .url :
193- overrides = {
194- "method" : scrapy_request .method ,
195- "headers" : {
196- key .decode ("utf-8" ).lower (): value [0 ].decode ("utf-8" )
197- for key , value in scrapy_request .headers .items ()
198- },
199- }
200- if scrapy_request .body :
201- overrides ["post_data" ] = scrapy_request .body .decode (scrapy_request .encoding )
203+ if pw_request .url == url :
204+ overrides : dict = {"method" : method , "headers" : headers }
205+ if body is not None :
206+ overrides ["post_data" ] = body .decode (encoding )
202207 # otherwise this fails with playwright.helper.Error: NS_ERROR_NET_RESET
203208 if self .browser_type == "firefox" :
204209 overrides ["headers" ]["host" ] = urlparse (pw_request .url ).netloc
205210 else :
206211 overrides = {"headers" : pw_request .headers .copy ()}
207212 # override user agent, for consistency with other requests
208- if scrapy_request .headers .get ("user-agent" ):
209- user_agent = scrapy_request .headers ["user-agent" ].decode ("utf-8" )
210- overrides ["headers" ]["user-agent" ] = user_agent
213+ if headers .get ("user-agent" ):
214+ overrides ["headers" ]["user-agent" ] = headers ["user-agent" ]
211215 asyncio .create_task (route .continue_ (** overrides ))
212216 # increment stats
213217 self .stats .inc_value ("playwright/request_count" )
0 commit comments