diff --git a/responses.py b/responses.py
index 6148f1d..47c81cf 100644
--- a/responses.py
+++ b/responses.py
@@ -375,21 +375,12 @@ class Response(BaseResponse):
         headers = self.get_headers()
         status = self.status
         body = _handle_body(self.body)
-
-        # The requests library's cookie handling depends on the response object
-        # having an original response object with the headers as the `msg`, so
-        # we give it what it needs.
-        orig_response = HTTPResponse(
-            body=body,  # required to avoid "ValueError: Unable to determine whether fp is closed."
-            msg=headers,
-            preload_content=False,
-        )
         return HTTPResponse(
             status=status,
             reason=six.moves.http_client.responses.get(status),
             body=body,
             headers=headers,
-            original_response=orig_response,
+            original_response=OriginalResponseShim(headers),
             preload_content=False,
         )
 
@@ -414,27 +405,45 @@ class CallbackResponse(BaseResponse):
         if isinstance(body, Exception):
             raise body
 
+        # If the callback set a content-type remove the one
+        # set in add_callback() so that we don't have multiple
+        # content type values.
+        if "Content-Type" in r_headers:
+            headers.pop("Content-Type", None)
+
         body = _handle_body(body)
         headers.extend(r_headers)
 
-        # The requests library's cookie handling depends on the response object
-        # having an original response object with the headers as the `msg`, so
-        # we give it what it needs.
-        orig_response = HTTPResponse(
-            body=body,  # required to avoid "ValueError: Unable to determine whether fp is closed."
-            msg=headers,
-            preload_content=False,
-        )
         return HTTPResponse(
             status=status,
             reason=six.moves.http_client.responses.get(status),
             body=body,
             headers=headers,
-            original_response=orig_response,
+            original_response=OriginalResponseShim(headers),
             preload_content=False,
         )
 
 
+class OriginalResponseShim(object):
+    """
+    Shim for compatibility with older versions of urllib3
+
+    requests cookie handling depends on responses having a property chain of
+    `response._original_response.msg` which contains the response headers [1]
+
+    Using HTTPResponse() for this purpose causes compatibility errors with
+    urllib3<1.23.0. To avoid adding more dependencies we can use this shim.
+
+    [1]: https://github.com/psf/requests/blob/75bdc998e2d/requests/cookies.py#L125
+    """
+
+    def __init__(self, headers):
+        self.msg = headers
+
+    def isclosed(self):
+        return True
+
+
 class RequestsMock(object):
     DELETE = "DELETE"
     GET = "GET"

responses 0.10.8 introduces an implicit dependency on urllib3>=1.23
responses 0.10.8 introduces these blocks:
https://github.com/getsentry/responses/blob/2d5d9f5ec33f168f097bb92f99243f18f264184c/responses.py#L382-L386

The `msg` param was not introduced until urllib3 1.23. 

`requests` itself permits any `urllib3>=1.21.1,<1.26,!=1.25.0,!=1.25.1`. If `responses` is run in an env with `urllib3<1.23`, this error gets thrown: 
```
    def get_response(self, request):
        if self.body and isinstance(self.body, Exception):
            raise self.body
    
        headers = self.get_headers()
        status = self.status
        body = _handle_body(self.body)
    
        # The requests library's cookie handling depends on the response object
        # having an original response object with the headers as the `msg`, so
        # we give it what it needs.
        orig_response = HTTPResponse(
            body=body,  # required to avoid "ValueError: Unable to determine whether fp is closed."
            msg=headers,
>           preload_content=False,
        )
E       TypeError: __init__() got an unexpected keyword argument 'msg'
```

Perhaps these new blocks can be modified to avoid `msg`? ~~Or a hard requirement for urllib3>=1.23 could be added to the responses setup.py?~~
diff --git a/test_responses.py b/test_responses.py
index 65904de..223c0a7 100644
--- a/test_responses.py
+++ b/test_responses.py
@@ -410,7 +410,11 @@ def test_callback():
     body = b"test callback"
     status = 400
     reason = "Bad Request"
-    headers = {"foo": "bar"}
+    headers = {
+        "foo": "bar",
+        "Content-Type": "application/json",
+        "Content-Length": "13",
+    }
     url = "http://example.com/"
 
     def request_callback(request):
@@ -423,8 +427,9 @@ def test_callback():
         assert resp.text == "test callback"
         assert resp.status_code == status
         assert resp.reason == reason
-        assert "foo" in resp.headers
-        assert resp.headers["foo"] == "bar"
+        assert "bar" == resp.headers.get("foo")
+        assert "application/json" == resp.headers.get("Content-Type")
+        assert "13" == resp.headers.get("Content-Length")
 
     run()
     assert_reset()

pip install -e .[tests]
parse_log_pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==4.5.4
exceptiongroup==1.2.2
flake8==7.2.0
idna==3.10
iniconfig==2.1.0
MarkupSafe==3.0.2
mccabe==0.7.0
packaging==24.2
pluggy==1.5.0
pycodestyle==2.13.0
pyflakes==3.3.2
pytest==8.3.5
pytest-cov==2.10.1
pytest-localserver==0.9.0.post0
requests==2.32.3
-e git+https://github.com/getsentry/responses.git@567c69e11332e1e2bcabe347f6cd9376765944b9#egg=responses
six==1.17.0
tomli==2.2.1
urllib3==2.3.0
Werkzeug==3.1.3

name: responses
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==4.5.4
      - exceptiongroup==1.2.2
      - flake8==7.2.0
      - idna==3.10
      - iniconfig==2.1.0
      - markupsafe==3.0.2
      - mccabe==0.7.0
      - packaging==24.2
      - pluggy==1.5.0
      - pycodestyle==2.13.0
      - pyflakes==3.3.2
      - pytest==8.3.5
      - pytest-cov==2.10.1
      - pytest-localserver==0.9.0.post0
      - requests==2.32.3
      - six==1.17.0
      - tomli==2.2.1
      - urllib3==2.3.0
      - werkzeug==3.1.3
prefix: /opt/conda/envs/responses

test_responses.py::test_callback
test_responses.py::test_arbitrary_status_code
test_responses.py::test_response test_responses.py::test_response_encoded test_responses.py::test_response_with_instance test_responses.py::test_replace[http://example.com/two-http://example.com/two] test_responses.py::test_replace[original1-replacement1] test_responses.py::test_replace[http://example\\.com/two-http://example\\.com/two] test_responses.py::test_replace_error[http://example.com/one-http://example\\.com/one] test_responses.py::test_replace_error[http://example\\.com/one-http://example.com/one] test_responses.py::test_remove test_responses.py::test_response_equality[args10-kwargs10-args20-kwargs20-True] test_responses.py::test_response_equality[args11-kwargs11-args21-kwargs21-False] test_responses.py::test_response_equality[args12-kwargs12-args22-kwargs22-False] test_responses.py::test_response_equality[args13-kwargs13-args23-kwargs23-True] test_responses.py::test_response_equality_different_objects test_responses.py::test_connection_error test_responses.py::test_match_querystring test_responses.py::test_match_empty_querystring test_responses.py::test_match_querystring_error test_responses.py::test_match_querystring_regex test_responses.py::test_match_querystring_error_regex test_responses.py::test_match_querystring_auto_activates test_responses.py::test_accept_string_body test_responses.py::test_accept_json_body test_responses.py::test_no_content_type test_responses.py::test_throw_connection_error_explicit test_responses.py::test_callback_exception_result test_responses.py::test_callback_exception_body test_responses.py::test_callback_no_content_type test_responses.py::test_regular_expression_url test_responses.py::test_custom_adapter test_responses.py::test_responses_as_context_manager test_responses.py::test_activate_doesnt_change_signature test_responses.py::test_activate_mock_interaction test_responses.py::test_activate_doesnt_change_signature_with_return_type test_responses.py::test_activate_doesnt_change_signature_for_method test_responses.py::test_response_cookies test_responses.py::test_response_secure_cookies test_responses.py::test_response_cookies_multiple test_responses.py::test_response_callback test_responses.py::test_response_filebody test_responses.py::test_assert_all_requests_are_fired test_responses.py::test_allow_redirects_samehost test_responses.py::test_handles_unicode_querystring test_responses.py::test_handles_unicode_url test_responses.py::test_headers test_responses.py::test_legacy_adding_headers test_responses.py::test_multiple_responses test_responses.py::test_multiple_urls test_responses.py::test_passthru test_responses.py::test_method_named_param test_responses.py::test_passthru_unicode test_responses.py::test_custom_target test_responses.py::test_cookies_from_headers
responses.py
responses.py