Flagsmith / Flagsmith/flagsmith-common

AttributeError: 'Response' object has no attribute 'status_code'

Open Beginner friendly
#250 0 comments 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.