6565from crawlee .storages import Dataset , KeyValueStore , RequestQueue
6666
6767from ._context_pipeline import ContextPipeline
68+ from ._context_utils import swaped_context
6869from ._logging_utils import (
6970 get_one_line_error_summary_if_possible ,
7071 reduce_asyncio_timeout_error_to_relevant_traceback_parts ,
@@ -1315,8 +1316,6 @@ async def _add_requests(
13151316 async def _commit_request_handler_result (
13161317 self ,
13171318 context : BasicCrawlingContext ,
1318- original_request : Request ,
1319- original_session : Session | None = None ,
13201319 ) -> None :
13211320 """Commit request handler result for the input `context`. Result is taken from `_context_result_map`."""
13221321 result = self ._context_result_map [context ]
@@ -1329,8 +1328,8 @@ async def _commit_request_handler_result(
13291328
13301329 await self ._commit_key_value_store_changes (result , get_kvs = self .get_key_value_store )
13311330
1332- result .sync_session ( sync_session = original_session )
1333- result .sync_request ( sync_request = original_request )
1331+ result .apply_session_changes ( target = context . session )
1332+ result .apply_request_changes ( target = context . request )
13341333
13351334 @staticmethod
13361335 async def _commit_key_value_store_changes (
@@ -1419,14 +1418,14 @@ async def __run_task_function(self) -> None:
14191418 try :
14201419 request .state = RequestState .REQUEST_HANDLER
14211420
1422- self ._check_request_collision (context .request , context .session )
1423-
14241421 try :
1425- await self ._run_request_handler (context = context )
1422+ with swaped_context (context , request , session ):
1423+ self ._check_request_collision (request , session )
1424+ await self ._run_request_handler (context = context )
14261425 except asyncio .TimeoutError as e :
14271426 raise RequestHandlerError (e , context ) from e
14281427
1429- await self ._commit_request_handler_result (context , original_request = request , original_session = session )
1428+ await self ._commit_request_handler_result (context )
14301429 await wait_for (
14311430 lambda : request_manager .mark_request_as_handled (request ),
14321431 timeout = self ._internal_timeout ,
@@ -1438,13 +1437,13 @@ async def __run_task_function(self) -> None:
14381437
14391438 request .state = RequestState .DONE
14401439
1441- if context . session and context . session .is_usable :
1442- context . session .mark_good ()
1440+ if session and session .is_usable :
1441+ session .mark_good ()
14431442
14441443 self ._statistics .record_request_processing_finish (request .unique_key )
14451444
14461445 except RequestCollisionError as request_error :
1447- context . request .no_retry = True
1446+ request .no_retry = True
14481447 await self ._handle_request_error (context , request_error )
14491448
14501449 except RequestHandlerError as primary_error :
@@ -1459,7 +1458,7 @@ async def __run_task_function(self) -> None:
14591458 await self ._handle_request_error (primary_error .crawling_context , primary_error .wrapped_exception )
14601459
14611460 except SessionError as session_error :
1462- if not context . session :
1461+ if not session :
14631462 raise RuntimeError ('SessionError raised in a crawling context without a session' ) from session_error
14641463
14651464 if self ._error_handler :
@@ -1469,16 +1468,17 @@ async def __run_task_function(self) -> None:
14691468 exc_only = '' .join (traceback .format_exception_only (session_error )).strip ()
14701469 self ._logger .warning ('Encountered "%s", rotating session and retrying...' , exc_only )
14711470
1472- context .session .retire ()
1471+ if session :
1472+ session .retire ()
14731473
14741474 # Increment session rotation count.
1475- context . request .session_rotation_count = (context . request .session_rotation_count or 0 ) + 1
1475+ request .session_rotation_count = (request .session_rotation_count or 0 ) + 1
14761476
14771477 await request_manager .reclaim_request (request )
14781478 await self ._statistics .error_tracker_retry .add (error = session_error , context = context )
14791479 else :
14801480 await wait_for (
1481- lambda : request_manager .mark_request_as_handled (context . request ),
1481+ lambda : request_manager .mark_request_as_handled (request ),
14821482 timeout = self ._internal_timeout ,
14831483 timeout_message = 'Marking request as handled timed out after '
14841484 f'{ self ._internal_timeout .total_seconds ()} seconds' ,
@@ -1493,7 +1493,7 @@ async def __run_task_function(self) -> None:
14931493 self ._logger .debug ('The context pipeline was interrupted' , exc_info = interrupted_error )
14941494
14951495 await wait_for (
1496- lambda : request_manager .mark_request_as_handled (context . request ),
1496+ lambda : request_manager .mark_request_as_handled (request ),
14971497 timeout = self ._internal_timeout ,
14981498 timeout_message = 'Marking request as handled timed out after '
14991499 f'{ self ._internal_timeout .total_seconds ()} seconds' ,
0 commit comments