diff --git a/CHANGES b/CHANGES
index 2bb4095..9e70130 100644
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,7 @@
   through which function they would like to send real requests
 * Added support for re.Pattern based header matching.
 * Added support for gzipped response bodies to `json_params_matcher`.
+* Fix `Content-Type` headers issue when the header was duplicated. See #644
 * Moved types-pyyaml dependency to `tests_requires`
 
 0.23.3
diff --git a/responses/__init__.py b/responses/__init__.py
index ea7009d..78a3a43 100644
--- a/responses/__init__.py
+++ b/responses/__init__.py
@@ -491,10 +491,17 @@ class BaseResponse:
 
     def get_headers(self) -> HTTPHeaderDict:
         headers = HTTPHeaderDict()  # Duplicate headers are legal
-        if self.content_type is not None:
+
+        # Add Content-Type if it exists and is not already in headers
+        if self.content_type and (
+            not self.headers or "Content-Type" not in self.headers
+        ):
             headers["Content-Type"] = self.content_type
+
+        # Extend headers if they exist
         if self.headers:
             headers.extend(self.headers)
+
         return headers
 
     def get_response(self, request: "PreparedRequest") -> HTTPResponse:

diff --git a/responses/tests/test_responses.py b/responses/tests/test_responses.py
index b6c1a5e..fcdb62b 100644
--- a/responses/tests/test_responses.py
+++ b/responses/tests/test_responses.py
@@ -1330,6 +1330,29 @@ def test_headers():
     assert_reset()
 
 
+def test_headers_deduplicated_content_type():
+    """Test to ensure that we do not have two values for `content-type`.
+
+    For more details see https://github.com/getsentry/responses/issues/644
+    """
+
+    @responses.activate
+    def run():
+        responses.get(
+            "https://example.org/",
+            json={},
+            headers={"Content-Type": "application/json"},
+        )
+        responses.start()
+
+        resp = requests.get("https://example.org/")
+
+        assert resp.headers["Content-Type"] == "application/json"
+
+    run()
+    assert_reset()
+
+
 def test_content_length_error(monkeypatch):
     """
     Currently 'requests' does not enforce content length validation,

Setting explicit Content-Type header in addition to json body results in comma-delimited Content-Type
### Describe the bug

When passing a JSON payload to a response object as `json=...`, the content-type is automatically set to `application/json`.
Attempting to set Content-Type explicitly results in a malformed header, with the content-type values comma-separated.

### Additional context

Explicitly setting `Content-Type: application/json` causes this, but is easily rectified by removing that value and relying on `json=...`.
However, setting a specialized JSON media type is not supported via this path, e.g. `application/custom+json; my-parameter`.

It is possible to work around this today by using `body=...` and avoiding `json=...` entirely, but this violates the principle of least-surprise. One would expect a valid Content-Type to come out of the combination of `json=..., headers=...`.

### Version of `responses`

0.23.1

### Steps to Reproduce

```python
import requests
import responses

responses.add(
    responses.GET,
    "https://example.org/",
    json={},
    headers={"Content-Type": "application/json"},
)
responses.start()

r = requests.get("https://example.org/")
print(r.headers.get("Content-Type"))  # "application/json, application/json"
```

This happens with any Content-Type value, not only the JSON one. e.g. Setting `Content-Type: foo` results in `application/json, foo`.

### Expected Result

Content-Type should only ever have a single value, although some HTTP client implementations attempt to parse it as a list for broader compatibility with malformed data. ([Relevant section of RFC 9110](https://www.rfc-editor.org/rfc/rfc9110#field.content-type).)

There are various behaviors which could be chosen here. e.g. Any match for `application/.*\+json;.*` could be used as a replacement, but headers could be otherwise concatenated.

However, the least surprising behavior would be for the explicit `Content-Type` header to _always_ override the implicit one from `json=...`.

### Actual Result

Content-Type header values are comma-joined, producing a header which does not consistently parse as JSON depending on the mimetype detection algorithm used.
responses/tests/test_responses.py::test_headers_deduplicated_content_type
responses/tests/test_responses.py::test_response responses/tests/test_responses.py::test_response_encoded responses/tests/test_responses.py::test_response_with_instance responses/tests/test_responses.py::test_replace[http://example.com/two-http://example.com/two] responses/tests/test_responses.py::test_replace[original1-replacement1] responses/tests/test_responses.py::test_replace[http://example\\.com/two-http://example\\.com/two] responses/tests/test_responses.py::test_replace_error[http://example.com/one-http://example\\.com/one] responses/tests/test_responses.py::test_replace_error[http://example\\.com/one-http://example.com/one] responses/tests/test_responses.py::test_replace_response_object_error responses/tests/test_responses.py::test_upsert_replace[http://example.com/two-http://example.com/two] responses/tests/test_responses.py::test_upsert_replace[original1-replacement1] responses/tests/test_responses.py::test_upsert_replace[http://example\\.com/two-http://example\\.com/two] responses/tests/test_responses.py::test_upsert_add[http://example.com/two-http://example.com/two] responses/tests/test_responses.py::test_upsert_add[original1-replacement1] responses/tests/test_responses.py::test_upsert_add[http://example\\.com/two-http://example\\.com/two] responses/tests/test_responses.py::test_remove responses/tests/test_responses.py::test_response_equality[args10-kwargs10-args20-kwargs20-True] responses/tests/test_responses.py::test_response_equality[args11-kwargs11-args21-kwargs21-False] responses/tests/test_responses.py::test_response_equality[args12-kwargs12-args22-kwargs22-False] responses/tests/test_responses.py::test_response_equality[args13-kwargs13-args23-kwargs23-True] responses/tests/test_responses.py::test_response_equality_different_objects responses/tests/test_responses.py::test_connection_error responses/tests/test_responses.py::test_match_querystring responses/tests/test_responses.py::test_match_querystring_empty responses/tests/test_responses.py::test_match_querystring_error responses/tests/test_responses.py::test_match_querystring_regex responses/tests/test_responses.py::test_match_querystring_error_regex responses/tests/test_responses.py::test_match_querystring_auto_activates responses/tests/test_responses.py::test_match_querystring_missing_key responses/tests/test_responses.py::test_accept_string_body responses/tests/test_responses.py::test_accept_json_body responses/tests/test_responses.py::test_no_content_type responses/tests/test_responses.py::test_arbitrary_status_code responses/tests/test_responses.py::test_throw_connection_error_explicit responses/tests/test_responses.py::test_callback responses/tests/test_responses.py::test_deprecated_package_attributes responses/tests/test_responses.py::test_callback_deprecated_stream_argument responses/tests/test_responses.py::test_callback_deprecated_match_querystring_argument responses/tests/test_responses.py::test_callback_match_querystring_default_false responses/tests/test_responses.py::test_callback_exception_result responses/tests/test_responses.py::test_callback_exception_body responses/tests/test_responses.py::test_callback_no_content_type responses/tests/test_responses.py::test_callback_content_type_dict responses/tests/test_responses.py::test_callback_matchers responses/tests/test_responses.py::test_callback_matchers_fail responses/tests/test_responses.py::test_callback_content_type_tuple responses/tests/test_responses.py::test_regular_expression_url responses/tests/test_responses.py::test_base_response_get_response responses/tests/test_responses.py::TestAdapters::test_custom_adapter[CustomAdapter] responses/tests/test_responses.py::TestAdapters::test_custom_adapter[PositionalArgsAdapter] responses/tests/test_responses.py::TestAdapters::test_custom_adapter[PositionalArgsIncompleteAdapter] responses/tests/test_responses.py::test_responses_as_context_manager responses/tests/test_responses.py::test_activate_doesnt_change_signature responses/tests/test_responses.py::TestFixtures::test_function responses/tests/test_responses.py::TestFixtures::test_function_decorated responses/tests/test_responses.py::test_activate_mock_interaction responses/tests/test_responses.py::test_activate_doesnt_change_signature_with_return_type responses/tests/test_responses.py::test_activate_doesnt_change_signature_for_method responses/tests/test_responses.py::test_response_cookies responses/tests/test_responses.py::test_response_cookies_secure responses/tests/test_responses.py::test_response_cookies_multiple responses/tests/test_responses.py::test_response_cookies_session[True-True] responses/tests/test_responses.py::test_response_cookies_session[True-False] responses/tests/test_responses.py::test_response_cookies_session[True-None] responses/tests/test_responses.py::test_response_cookies_session[False-True] responses/tests/test_responses.py::test_response_cookies_session[False-False] responses/tests/test_responses.py::test_response_cookies_session[False-None] responses/tests/test_responses.py::test_response_cookies_session[None-True] responses/tests/test_responses.py::test_response_cookies_session[None-False] responses/tests/test_responses.py::test_response_cookies_session[None-None] responses/tests/test_responses.py::test_response_callback responses/tests/test_responses.py::test_response_filebody responses/tests/test_responses.py::test_use_stream_twice_to_double_raw_io responses/tests/test_responses.py::test_assert_all_requests_are_fired responses/tests/test_responses.py::test_assert_all_requests_fired_multiple responses/tests/test_responses.py::test_allow_redirects_samehost responses/tests/test_responses.py::test_path_segments responses/tests/test_responses.py::test_handles_unicode_querystring responses/tests/test_responses.py::test_handles_unicode_url responses/tests/test_responses.py::test_handles_unicode_body responses/tests/test_responses.py::test_handles_buffered_reader_body responses/tests/test_responses.py::test_headers responses/tests/test_responses.py::test_content_length_error responses/tests/test_responses.py::test_stream_with_none_chunk_size responses/tests/test_responses.py::test_legacy_adding_headers responses/tests/test_responses.py::test_legacy_adding_headers_with_content_type responses/tests/test_responses.py::test_auto_calculate_content_length_string_body responses/tests/test_responses.py::test_auto_calculate_content_length_bytes_body responses/tests/test_responses.py::test_auto_calculate_content_length_json_body responses/tests/test_responses.py::test_auto_calculate_content_length_unicode_body responses/tests/test_responses.py::test_auto_calculate_content_length_doesnt_work_for_buffered_reader_body responses/tests/test_responses.py::test_auto_calculate_content_length_doesnt_override_existing_value responses/tests/test_responses.py::test_multiple_responses responses/tests/test_responses.py::test_multiple_responses_intermixed responses/tests/test_responses.py::test_multiple_urls responses/tests/test_responses.py::test_multiple_methods responses/tests/test_responses.py::TestPassthru::test_passthrough_flag responses/tests/test_responses.py::TestPassthru::test_passthrough_kwarg responses/tests/test_responses.py::TestPassthru::test_passthrough_response responses/tests/test_responses.py::TestPassthru::test_passthrough_response_stream responses/tests/test_responses.py::TestPassthru::test_passthru_prefixes responses/tests/test_responses.py::TestPassthru::test_passthru responses/tests/test_responses.py::TestPassthru::test_passthru_regex responses/tests/test_responses.py::TestPassthru::test_passthru_does_not_persist_across_tests responses/tests/test_responses.py::TestPassthru::test_passthru_unicode responses/tests/test_responses.py::TestPassthru::test_real_send_argument responses/tests/test_responses.py::test_method_named_param responses/tests/test_responses.py::test_custom_target responses/tests/test_responses.py::test_request_param[http://example.com] responses/tests/test_responses.py::test_request_param[http://example.com/some/path] responses/tests/test_responses.py::test_request_param[http://example.com/other/path/] responses/tests/test_responses.py::test_request_param_with_multiple_values_for_the_same_key responses/tests/test_responses.py::test_assert_call_count[http://example.com] responses/tests/test_responses.py::test_assert_call_count[http://example.com?hello=world] responses/tests/test_responses.py::test_call_count_with_matcher responses/tests/test_responses.py::test_call_count_without_matcher responses/tests/test_responses.py::test_fail_request_error responses/tests/test_responses.py::test_response_representations[response_params0-<Response(url='http://example.com/' responses/tests/test_responses.py::test_response_representations[response_params1-<Response(url='http://another-domain.com/' responses/tests/test_responses.py::test_response_representations[response_params2-<Response(url='http://abcd.com/' responses/tests/test_responses.py::test_mocked_responses_list_registered responses/tests/test_responses.py::test_rfc_compliance[http://service-A/foo?q=fizz-http://service-a/foo?q=fizz] responses/tests/test_responses.py::test_rfc_compliance[http://service-a/foo-http://service-A/foo] responses/tests/test_responses.py::test_rfc_compliance[http://someHost-AwAy/-http://somehost-away/] responses/tests/test_responses.py::test_rfc_compliance[http://fizzbuzz/foo-http://fizzbuzz/foo] responses/tests/test_responses.py::test_requests_between_add responses/tests/test_responses.py::test_responses_reuse responses/tests/test_responses.py::TestStrictWrapper::test_strict_wrapper responses/tests/test_responses.py::TestStrictWrapper::test_nested_decorators[True] responses/tests/test_responses.py::TestStrictWrapper::test_nested_decorators[False] responses/tests/test_responses.py::TestStrictWrapper::test_nested_decorators[None] responses/tests/test_responses.py::TestMultipleWrappers::test_wrapped responses/tests/test_responses.py::TestMultipleWrappers::test_call_another_wrapped_function responses/tests/test_responses.py::TestMultipleWrappers::test_mock_not_leaked responses/tests/test_responses.py::TestShortcuts::test_delete responses/tests/test_responses.py::TestShortcuts::test_get responses/tests/test_responses.py::TestShortcuts::test_head responses/tests/test_responses.py::TestShortcuts::test_options responses/tests/test_responses.py::TestShortcuts::test_patch responses/tests/test_responses.py::TestShortcuts::test_post responses/tests/test_responses.py::TestShortcuts::test_put responses/tests/test_responses.py::TestUnitTestPatchSetup::test_function responses/tests/test_responses.py::TestUnitTestPatchSetupRaises::test_function responses/tests/test_responses.py::test_reset_in_the_middle responses/tests/test_responses.py::test_redirect responses/tests/test_responses.py::TestMaxRetry::test_max_retries responses/tests/test_responses.py::TestMaxRetry::test_max_retries_exceed[True] responses/tests/test_responses.py::TestMaxRetry::test_max_retries_exceed[False] responses/tests/test_responses.py::TestMaxRetry::test_max_retries_exceed_msg responses/tests/test_responses.py::TestMaxRetry::test_adapter_retry_untouched responses/tests/test_responses.py::test_request_object_attached_to_exception