diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9a8e114..d80a3f8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 4.2.2 (23/01/2019):
+Bugfixes
+  - Fix `set_request_details` builder method not returning self causing it to be unchainable
+
 ## 4.2.1 (18/12/2018):
 Bugfixes
   - Set version correctly in crash report sent to Raygun API ([#78](https://github.com/MindscapeHQ/raygun4py/pull/79))
diff --git a/python2/raygun4py/version.py b/python2/raygun4py/version.py
index 53fb41b..3cd825b 100644
--- a/python2/raygun4py/version.py
+++ b/python2/raygun4py/version.py
@@ -2,4 +2,4 @@
 # 1) we don't load dependencies by storing it in __init__.py
 # 2) we can import it in setup.py for the same reason
 # 3) we can import it into your module module
-__version__ = '4.2.1'
+__version__ = '4.2.2'
diff --git a/python3/raygun4py/raygunmsgs.py b/python3/raygun4py/raygunmsgs.py
index c419558..6d3c318 100644
--- a/python3/raygun4py/raygunmsgs.py
+++ b/python3/raygun4py/raygunmsgs.py
@@ -97,6 +97,8 @@ class RaygunMessageBuilder(object):
         rg_request_details = http_utilities.build_wsgi_compliant_request(request)
         self.raygunMessage.details['request'] = rg_request_details
 
+        return self
+
 
     def set_version(self, version):
         self.raygunMessage.details['version'] = version
diff --git a/python3/raygun4py/version.py b/python3/raygun4py/version.py
index 53fb41b..3cd825b 100644
--- a/python3/raygun4py/version.py
+++ b/python3/raygun4py/version.py
@@ -2,4 +2,4 @@
 # 1) we don't load dependencies by storing it in __init__.py
 # 2) we can import it in setup.py for the same reason
 # 3) we can import it into your module module
-__version__ = '4.2.1'
+__version__ = '4.2.2'

AttributeError: 'NoneType' object has no attribute 'set_user'
Recently upgraded from 3.1.6 to 4.1.0 and it looks like `RaygunMessageBuilder.set_request_details` is returning `None` in some situations, causing exception sending to fail with an `AttributeError: 'NoneType' object has no attribute 'set_user'`

https://github.com/MindscapeHQ/raygun4py/blob/v4.1.0/python3/raygun4py/raygunprovider.py#L124-L125
https://github.com/MindscapeHQ/raygun4py/blob/v4.1.0/python3/raygun4py/raygunmsgs.py#L92-L97

Stacktrace:
```py
/usr/local/lib/python3.6/site-packages/raygun4py/raygunprovider.py:96: in send_exception
    message = self._create_message(errorMessage, tags, custom_data, http_request, extra_environment_data)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <raygun4py.raygunprovider.RaygunSender object at 0x7f6dbbbf0320>, raygunExceptionMessage = <raygun4py.raygunmsgs.RaygunErrorMessage object at 0x7f6dbbbccf60>
tags = ['django-novars'], user_custom_data = None
http_request = {'form': {}, 'headers': {'CONTENT_TYPE': 'application/octet-stream', 'HTTP_COOKIE': '', 'PATH_INFO': '/', 'QUERY_STRING': '', ...}, 'hostName': 'testserver', 'httpMethod': 'GET', ...}
extra_environment_data = {'frameworkVersion': '2.1.2'}

    def _create_message(self, raygunExceptionMessage, tags, user_custom_data, http_request, extra_environment_data):
        return raygunmsgs.RaygunMessageBuilder().new() \
            .set_machine_name(socket.gethostname()) \
            .set_version(self.userversion) \
            .set_client_details() \
            .set_exception_details(raygunExceptionMessage) \
            .set_environment_details(extra_environment_data) \
            .set_tags(tags) \
            .set_customdata(user_custom_data) \
>           .set_request_details(http_request) \
            .set_user(self.user) \
            .build()
E       AttributeError: 'NoneType' object has no attribute 'set_user'

/usr/local/lib/python3.6/site-packages/raygun4py/raygunprovider.py:124: AttributeError
```
diff --git a/python3/tests/test_raygunmsgs.py b/python3/tests/test_raygunmsgs.py
index 2f0b3e0..be16405 100644
--- a/python3/tests/test_raygunmsgs.py
+++ b/python3/tests/test_raygunmsgs.py
@@ -109,6 +109,12 @@ class TestRaygunMessageBuilder(unittest.TestCase):
         self.assertEqual(self.builder.raygunMessage.details['request']['headers']['Referer'],
                         "https://www.google.com/")
 
+    def test_set_request_details_allows_chaining(self):
+        self.builder \
+                .set_request_details(self.raw_wsgi_request) \
+                .set_tags(['foo', 'bar'])
+
+
 class TestRaygunErrorMessage(unittest.TestCase):
     class GrandchildError(Exception):
         pass

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
beautifulsoup4==4.13.3
blinker==1.9.0
certifi==2025.1.31
charset-normalizer==3.4.1
click==8.1.8
coverage==7.8.0
coveralls==4.0.1
Django==1.8.8
docopt==0.6.2
exceptiongroup==1.2.2
Flask==3.1.0
idna==3.10
importlib_metadata==8.6.1
iniconfig==2.1.0
itsdangerous==2.2.0
Jinja2==3.1.6
jsonpickle==4.0.5
linecache2==1.0.0
MarkupSafe==3.0.2
mock==5.2.0
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
-e git+https://github.com/MindscapeHQ/raygun4py.git@16d2e7a3ebcca16548e5ec806c85b3edfda95930#egg=raygun4py
requests==2.32.3
six==1.17.0
soupsieve==2.6
tomli==2.2.1
traceback2==1.4.0
typing_extensions==4.13.0
unittest2==1.1.0
urllib3==2.3.0
waitress==3.0.2
WebOb==1.8.9
WebTest==3.0.4
Werkzeug==3.1.3
zipp==3.21.0

name: raygun4py
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:
      - argparse==1.4.0
      - beautifulsoup4==4.13.3
      - blinker==1.9.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - click==8.1.8
      - coverage==7.8.0
      - coveralls==4.0.1
      - django==1.8.8
      - docopt==0.6.2
      - exceptiongroup==1.2.2
      - flask==3.1.0
      - idna==3.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - itsdangerous==2.2.0
      - jinja2==3.1.6
      - jsonpickle==4.0.5
      - linecache2==1.0.0
      - markupsafe==3.0.2
      - mock==5.2.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - requests==2.32.3
      - six==1.17.0
      - soupsieve==2.6
      - tomli==2.2.1
      - traceback2==1.4.0
      - typing-extensions==4.13.0
      - unittest2==1.1.0
      - urllib3==2.3.0
      - waitress==3.0.2
      - webob==1.8.9
      - webtest==3.0.4
      - werkzeug==3.1.3
      - zipp==3.21.0
prefix: /opt/conda/envs/raygun4py

python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_set_request_details_allows_chaining
python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_customdata python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_machinename python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_request_ip python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_request_ip_from_remote_addr python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_tags python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_user_anon python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_user_email python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_user_fname python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_user_fullname python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_user_identifier python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_wsgi_fallbacks python3/tests/test_raygunmsgs.py::TestRaygunMessageBuilder::test_wsgi_standard_header_names python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_chained_exception_cause_is_child python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_chained_exception_childs_cause_is_grandchild python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_chained_exception_last_exception_caught_is_parent python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_chained_exception_message_child_has_nested_grandchild python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_chained_exception_message_parent_has_nested_child python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_chained_exception_nested_child_message python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_chained_exception_nested_grandchild_message python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_classname python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_exc_traceback_none_generates_empty_array python3/tests/test_raygunmsgs.py::TestRaygunErrorMessage::test_methodname_none
python2/raygun4py/version.py python3/raygun4py/raygunmsgs.py python3/raygun4py/version.py CHANGELOG.md
python2/raygun4py/version.py python3/raygun4py/raygunmsgs.py python3/raygun4py/version.py CHANGELOG.md