#31091 closed Bug (invalid)
ConnectionResetError: [Errno 104] Connection reset by peer with a simple GET call.
Reported by: | aleaforny | Owned by: | nobody |
---|---|---|---|
Component: | HTTP handling | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Florian Apolloner | Triage Stage: | Unreviewed |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Hello,
I have this pretty simple GET api method (I use djangorestframework, but the issue is still related to Django itself, see all my explanations):
from rest_framework import generics, status from rest_framework.response import Response from django.conf import settings class Monitoring(generics.RetrieveAPIView): def retrieve(self, request, *args, **kwargs): return Response({ "app_build": settings.APP_BUILD_NUMBER, }, status=status.HTTP_200_OK )
I was using Django Version 2.1.1, everything was working perfectly fine.
Then, I upgraded to version Django 2.2.8, and I suddenly get the following error (for all my API call, but I took the simplest as an example) :
[14/Dec/2019 23:18:29] "GET /monitoring HTTP/1.1" 200 38 ---------------------------------------- Exception happened during processing of request from ('x.y.z.x', 53609) Traceback (most recent call last): File "/opt/rh/rh-python36/root/usr/lib64/python3.6/socketserver.py", line 654, in process_request_thread self.finish_request(request, client_address) File "/opt/rh/rh-python36/root/usr/lib64/python3.6/socketserver.py", line 364, in finish_request self.RequestHandlerClass(request, client_address, self) File "/opt/rh/rh-python36/root/usr/lib64/python3.6/socketserver.py", line 724, in __init__ self.handle() File "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/django/core/servers/basehttp.py", line 153, in handle self.handle_one_request() File "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/django/core/servers/basehttp.py", line 161, in handle_one_request self.raw_requestline = self.rfile.readline(65537) File "/opt/rh/rh-python36/root/usr/lib64/python3.6/socket.py", line 586, in readinto return self._sock.recv_into(b) ConnectionResetError: [Errno 104] Connection reset by peer ----------------------------------------
FYI, I'm using Python 2.6.9 version
By the way, these APIs are sending me the response as expected, these errors are just printed on Django console, so I guess it's not critical nor preventing Django to work as expected, but it's still annoying to get these errors everytime now.
I just did one thing: Tried different versions of Django (using pip3.6), and here the result I got :
- Django 2.1.1: Working as expected
- Django 2.1.3: Working as expected
- Django 2.1.4: Error
- Django 2.1.5: Error
- Django 2.1.15: Error
- Django 2.2.0: Error
- Django 2.2.8: Error
So I guess something happened between Django 2.1.3 and 2.1.4 but can't figure what.
Thanks for the help!
Kindly
Change History (3)
follow-up: 3 comment:1 by , 5 years ago
Cc: | added |
---|---|
Description: | modified (diff) |
Resolution: | → wontfix |
Status: | new → closed |
Summary: | ConnectionResetError: [Errno 104] Connection reset by peer with a simple GET call → ConnectionResetError: [Errno 104] Connection reset by peer with a simple GET call. |
Version: | 2.2 → master |
comment:2 by , 5 years ago
Resolution: | wontfix → invalid |
---|
comment:3 by , 5 years ago
Replying to felixxm:
Thanks for this report, however I cannot reproduce this issue with Python 3.6.9 and Django 2.2.8.
This can be a side effect of 934acf1126995f6e6ccba5947ec8f7561633c27f (ticket #29849), see a commit message:
The combination of those two fixes resulted in yet another problem:
HTTP/1.1 by default allows a client to assume that keep-alive is
supported unless the server disables it via 'Connection: close' -- see
RFC2616 8.1.2.1 for details on persistent connection negotiation. Now if
the client receives a response from Django without 'Connection: close'
and immediately sends a new request (on the same tcp connection) before
our server closes the tcp connection, it will error out at some point
because the connection does get closed a few milli seconds later.
but I don't think that there is anything we can improve in Django.
Good shot! That's nothing to improve in Django directly, indeed!
I've just added the header Connection: close and it fixed it (for those who may encounter this issue as well)
Thanks again for your help
Thanks for this report, however I cannot reproduce this issue with Python 3.6.9 and Django 2.2.8.
This can be a side effect of 934acf1126995f6e6ccba5947ec8f7561633c27f (ticket #29849), see a commit message:
but I don't think that there is anything we can improve in Django.