Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
changeKind: fix
packages:
- "@typespec/http-client-python"
---

Fix `UnboundLocalError` for paging operations with a flattened JSON model body. The request body is now constructed once outside the `prepare_request` callback (and before the body is serialized into the request content) instead of inside the closure, where assigning `body` made it an unbound local on every page fetch.
Original file line number Diff line number Diff line change
Expand Up @@ -931,7 +931,8 @@ def _call_request_builder_helper(
if builder.parameters.has_body and builder.parameters.body_parameter.flattened:
# serialize flattened body before passing to request builder as well
retval.extend(_serialize_flattened_body(builder.parameters.body_parameter))
if is_json_model_type(builder.parameters):
if is_json_model_type(builder.parameters) and not is_paging:
# For paging, we put the json model body outside `prepare_request`
retval.extend(_serialize_json_model_body(builder.parameters.body_parameter, builder.parameters.parameters))
if builder.has_form_data_body:
retval.extend(self._create_body_parameter(builder))
Expand Down Expand Up @@ -1369,7 +1370,13 @@ def call_next_link_request_builder(self, builder: PagingOperationType) -> list[s
return retval

def _prepare_request_callback(self, builder: PagingOperationType) -> list[str]:
retval = self._initialize_overloads(builder)
retval: list[str] = []
# The json model body must be constructed before `_initialize_overloads`
# serializes it into the request content, and outside `prepare_request` so
# the closure doesn't treat `body` as an unbound local.
if is_json_model_type(builder.parameters):
retval.extend(_serialize_json_model_body(builder.parameters.body_parameter, builder.parameters.parameters))
retval.extend(self._initialize_overloads(builder))
if builder.has_continuation_token:
retval.append(f"def prepare_request({builder.next_variable_name}=None):")
retval.extend([f" {line}" for line in self.call_request_builder(builder, is_paging=True)])
Expand Down
Loading