Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle pickle in BaseUrlSession for base_url #376

Merged
Merged
Show file tree
Hide file tree
Changes from 4 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
8 changes: 8 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
History
=======

1.1.0
sigmavirus24 marked this conversation as resolved.
Show resolved Hide resolved
-------------------

Fixed Bugs
~~~~~~~~~~

- Save and recover ``base_url`` in ``BaseUrlSession`` during pickle and unpickle

1.0.0 -- 2023-05-01
-------------------

Expand Down
12 changes: 12 additions & 0 deletions requests_toolbelt/sessions.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,15 @@ def prepare_request(self, request, *args, **kwargs):
def create_url(self, url):
"""Create the URL based off this partial path."""
return urljoin(self.base_url, url)

def __getstate__(self):
"""Save base URL as well during the pickle"""
states = super(BaseUrlSession, self).__getstate__()
states.update({"base_url": self.base_url})
return states

def __setstate__(self, state):
"""Load base URL as well during the unpickle"""
super(BaseUrlSession, self).__setstate__(state)
if "base_url" in state:
self.base_url = state["base_url"]
7 changes: 7 additions & 0 deletions tests/test_sessions.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import unittest
import pickle
import pytest

from requests_toolbelt import sessions
Expand Down Expand Up @@ -53,3 +54,9 @@ def test_prepared_request_override_base(self):
response = session.send(prepared_request)
response.raise_for_status()
assert response.json()['headers']['Host'] == 'httpbin.org'

def test_pickle_unpickle_session(self):
session = sessions.BaseUrlSession('https://www.google.com')
pickled_session = pickle.dumps(session)
unpickled_session = pickle.loads(pickled_session)
assert session.base_url == unpickled_session.base_url