#31091: ConnectionResetError: [Errno 104] Connection reset by peer with a simple
GET call.
-------------------------------------+-------------------------------------
     Reporter:  Baptiste             |                    Owner:  nobody
  Vandenborght                       |
         Type:  Bug                  |                   Status:  closed
    Component:  HTTP handling        |                  Version:  master
     Severity:  Normal               |               Resolution:  wontfix
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by felixxm):

 * status:  new => closed
 * cc: Florian Apolloner (added)
 * version:  2.2 => master
 * resolution:   => wontfix


Old description:

> 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

New description:

 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

--

Comment:

 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.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/31091#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/067.4c6a6ae04582dd2a5f11b6f752cee56f%40djangoproject.com.

Reply via email to