Subject: [PATCH] pgarchives: Fix crash when receiving a request with an incorrect If-Modified-Since header

From: Célestin Matte <[email-masked]>
Date: Fri, 12 Jun 2026 10:52:08 +0200

Django crashes when receiving a request containing a If-Modified-Since header with an incorrect date:

Traceback (most recent call last):
    File "/path/lib/python3.13/site-packages/django/core/handlers/exception.py", line 55, in inner
      response = get_response(request)
                 ^^^^^^^^^^^^^^^^^^^^^
    File "/path/lib/python3.13/site-packages/django/core/handlers/base.py", line 197, in _get_response
      response = wrapped_callback(request, *callback_args, **callback_kwargs)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/path/archives/mailarchives/views.py", line 112, in __cache
      resp = fn(request, *_args, **_kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/path/archives/mailarchives/views.py", line 500, in message
      if ims >= newest:
         ^^^^^^^^^^^^^

Exception Type: TypeError at /message-id/<redacted>
Exception Value: '>=' not supported between instances of 'NoneType' and 'int'

This patch adds a condition to avoid this.

(For some reason, archives on postgresql.org do NOT crash on this. Are headers filtered before reaching pgarchives there? When deploying upstream version of pgarchives locally, I do have this crash)

-- 
Célestin Matte
From 0f1b7fd1b9c609811c05b8ee1c739b80d31ac491 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9lestin=20Matte?= <[email-masked]>
Date: Thu, 11 Jun 2026 18:47:00 +0200
Subject: [PATCH] Fix crash when receiving a request with an incorrect
 If-Modified-Since header

---
 django/archives/mailarchives/views.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/django/archives/mailarchives/views.py b/django/archives/mailarchives/views.py
index fe74f7c..f258d5d 100644
--- a/django/archives/mailarchives/views.py
+++ b/django/archives/mailarchives/views.py
@@ -482,7 +482,7 @@ def message(request, msgid):
     newest = calendar.timegm(max(threadstruct, key=lambda x: x['date'])['date'].utctimetuple())
     if 'HTTP_IF_MODIFIED_SINCE' in request.META and not settings.DEBUG:
         ims = parse_http_date_safe(request.META.get("HTTP_IF_MODIFIED_SINCE"))
-        if ims >= newest:
+        if ims is not None and ims >= newest:
             return HttpResponseNotModified()
 
     responses = [t for t in threadstruct if t['parentid'] == m.id]
-- 
2.54.0

---

From: Magnus Hagander <[email-masked]>
Date: Fri, 12 Jun 2026 12:25:19 +0200

On Fri, 12 Jun 2026 at 10:52, Célestin Matte <[email-masked]>
wrote:

>     File
> "/path/lib/python3.13/site-packages/django/core/handlers/exception.py",
> line 55, in inner
>     File
> "/path/lib/python3.13/site-packages/django/core/handlers/base.py", line
> 197, in _get_response

Good catch. Applied. Thanks!

>
> (For some reason, archives on postgresql.org do NOT crash on this. Are
> headers filtered before reaching pgarchives there? When deploying upstream
> version of pgarchives locally, I do have this crash)
>

IMS in particular is handled by the cache. So the brwoser does IMS <-> the
cache, and then varnish does it independently <-> backend. And Varnish will
always create the correct headers. And since headers from the client are
never passed through to the backend, it doesn't show up there.

-- 
 Magnus Hagander
 Me: https://www.hagander.net/ <http://www.hagander.net/>
 Work: https://www.redpill-linpro.com/ <http://www.redpill-linpro.com/>