Flagsmith / Flagsmith/flagsmith-common
AttributeError: 'Response' object has no attribute 'status_code'
- Dominant language
- Python
- Stars
- 2
- Forks
- 4
- Avg merge
- 2d 9h
- Merged PRs (30d)
- 10
Description
Sentry Issue: [FLAGSMITH-API-69B](https://flagsmith.sentry.io/issues/7607964441/?referrer=github_integration)
```
InvalidHeader: Invalid HTTP Header: 'TRANSFER-ENCODING'
(1 additional frame(s) were not displayed)
...
File "gunicorn/http/parser.py", line 41, in __next__
self.mesg = self.mesg_class(self.cfg, self.unreader, self.source_addr, self.req_count)
File "gunicorn/http/message.py", line 259, in __init__
super().__init__(cfg, unreader, peer_addr)
File "gunicorn/http/message.py", line 62, in __init__
self.set_body_reader()
File "gunicorn/http/message.py", line 461, in set_body_reader
super().set_body_reader()
File "gunicorn/http/message.py", line 186, in set_body_reader
raise InvalidHeader("TRANSFER-ENCODING", req=self)
AttributeError: 'Response' object has no attribute 'status_code'
(3 additional frame(s) were not displayed)
...
File "gunicorn/workers/sync.py", line 69, in run_for_one
self.accept(listener)
File "gunicorn/workers/sync.py", line 31, in accept
self.handle(listener, client, addr)
File "gunicorn/workers/sync.py", line 157, in handle
self.handle_error(req, client, addr, e)
File "gunicorn/workers/base.py", line 278, in handle_error
self.log.access(resp, req, environ, request_time)
File "common/gunicorn/logging.py", line 37, in access
"response_status": resp.status_code,
Exception in worker process
```
## Root cause
When gunicorn rejects a request during parsing, `handle_error()` builds the Response by hand and sets only `resp.status`. Our `PrometheusGunicornLogger.access()` reads `resp.status_code`, which then raises AttributeError.
## Suggested fix
Read the status resiliently on the error path rather than assuming `status_code` exists — e.g. `getattr(resp, "status_code", None)`, or derive it from `resp.status` (`int(resp.status.split()[0])` when `resp.status` is a string), mirroring how gunicorn's own logger tolerates responses that never went through `start_response()`.
Contributor guide
No contributing guide indexed for this repository
Research direction
Start in common/gunicorn/logging.py at PrometheusGunicornLogger.access(), then compare the error path in gunicorn/workers/base.py with normal response handling. Reproduce or inspect the malformed-header path from the traceback and verify that logging it no longer raises AttributeError while retaining the available response status.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- prometheus, python
- Domain
- backend, observability
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 72/100