[Python] Flask is closing https connections even after setting...

Discussão em 'Python' iniciado por Stack, Julho 9, 2025.

  1. Stack

    Stack Membro Participativo

    We need to write a flask application which should not close the connection after serving the client. Below is the python code

    from flask import Flask, request, make_response, jsonify
    from werkzeug.serving import WSGIRequestHandler

    app = Flask(__name__)

    @app.route('/v1')
    def get_availability():
    response = make_response("Custom Response", 204)
    return response

    @app.route('/v2')
    def get_ping():
    response = make_response("Custom Response", 200)
    return response

    @app.errorhandler(404)
    def not_found(error):
    return jsonify({'error': 'Custom message for unavailable path'}), 404

    if __name__ == "__main__":
    WSGIRequestHandler.protocol_version = "HTTP/1.1"
    app.run(ssl_context=('cert.pem', 'key.pem'), port=8080)


    I used below curl command to send a request.

    curl --cert cert.pem --key key.pem https://127.0.0.1:8080/v1 -v -k


    It is working and I am getting the response but the connection is not keep alive.

    Below is curl command outout

    * Trying 127.0.0.1:8080...
    * Connected to 127.0.0.1 (127.0.0.1) port 8080
    * ALPN: curl offers h2,http/1.1
    * TLSv1.3 (OUT), TLS handshake, Client hello (1):
    * TLSv1.3 (IN), TLS handshake, Server hello (2):
    * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
    * TLSv1.3 (IN), TLS handshake, Certificate (11):
    * TLSv1.3 (IN), TLS handshake, CERT verify (15):
    * TLSv1.3 (IN), TLS handshake, Finished (20):
    * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.3 (OUT), TLS handshake, Finished (20):
    * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / X25519 / RSASSA-PSS
    * ALPN: server did not agree on a protocol. Uses default.
    * Server certificate:
    * subject: C=XX; L=Default City; O=Default Company Ltd
    * start date: Jan 8 22:43:00 2025 GMT
    * expire date: Jan 8 22:43:00 2026 GMT
    * issuer: C=XX; L=Default City; O=Default Company Ltd
    * SSL certificate verify result: self-signed certificate (18), continuing anyway.
    * Certificate level 0: Public key type RSA (4096/152 Bits/secBits), signed using sha256WithRSAEncryption
    * using HTTP/1.x
    > GET /v1 HTTP/1.1
    > Host: 127.0.0.1:8080
    > User-Agent: curl/8.5.0
    > Accept: */*
    >
    * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
    * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
    * old SSL session ID is stale, removing
    < HTTP/1.1 204 NO CONTENT
    < Server: Werkzeug/3.1.3 Python/3.11.9
    < Date: Thu, 09 Jan 2025 01:12:02 GMT
    < Content-Type: text/html; charset=utf-8
    < Connection: close
    <
    * Closing connection
    * TLSv1.3 (OUT), TLS alert, close notify (256):


    Through tcpdump, I verified and it is infact flask application is sending reset connection.

    ip-10-10-10-10:100$ sudo tcpdump -i lo port 8080
    dropped privs to tcpdump
    tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
    listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
    01:00:01.142531 IP localhost.47782 > localhost.webcache: Flags , seq 3077322951, win 65495, options [mss 65495,sackOK,TS val 3930690793 ecr 0,nop,wscale 7], length 0
    01:00:01.142547 IP localhost.webcache > localhost.47782: Flags [S.], seq 2243081118, ack 3077322952, win 65483, options [mss 65495,sackOK,TS val 3930690793 ecr 3930690793,nop,wscale 7], length 0
    01:00:01.142561 IP localhost.47782 > localhost.webcache: Flags [.], ack 1, win 512, options [nop,nop,TS val 3930690793 ecr 3930690793], length 0
    01:00:01.145999 IP localhost.47782 > localhost.webcache: Flags [P.], seq 1:518, ack 1, win 512, options [nop,nop,TS val 3930690796 ecr 3930690793], length 517: HTTP
    01:00:01.146012 IP localhost.webcache > localhost.47782: Flags [.], ack 518, win 508, options [nop,nop,TS val 3930690796 ecr 3930690796], length 0
    01:00:01.156443 IP localhost.webcache > localhost.47782: Flags [P.], seq 1:2198, ack 518, win 512, options [nop,nop,TS val 3930690807 ecr 3930690796], length 2197: HTTP
    01:00:01.156465 IP localhost.47782 > localhost.webcache: Flags [.], ack 2198, win 499, options [nop,nop,TS val 3930690807 ecr 3930690807], length 0
    01:00:01.157599 IP localhost.47782 > localhost.webcache: Flags [P.], seq 518:598, ack 2198, win 512, options [nop,nop,TS val 3930690808 ecr 3930690807], length 80: HTTP
    01:00:01.157743 IP localhost.webcache > localhost.47782: Flags [P.], seq 2198:2453, ack 598, win 512, options [nop,nop,TS val 3930690808 ecr 3930690808], length 255: HTTP
    01:00:01.157786 IP localhost.47782 > localhost.webcache: Flags [P.], seq 598:722, ack 2453, win 511, options [nop,nop,TS val 3930690808 ecr 3930690808], length 124: HTTP
    01:00:01.157798 IP localhost.webcache > localhost.47782: Flags [P.], seq 2453:2708, ack 722, win 512, options [nop,nop,TS val 3930690808 ecr 3930690808], length 255: HTTP
    01:00:01.169686 IP localhost.webcache > localhost.47782: Flags [FP.], seq 2708:2940, ack 722, win 512, options [nop,nop,TS val 3930690820 ecr 3930690808], length 232: HTTP
    01:00:01.169801 IP localhost.47782 > localhost.webcache: Flags [.], ack 2941, win 512, options [nop,nop,TS val 3930690820 ecr 3930690808], length 0
    01:00:01.169867 IP localhost.47782 > localhost.webcache: Flags [P.], seq 722:746, ack 2941, win 512, options [nop,nop,TS val 3930690820 ecr 3930690808], length 24: HTTP
    01:00:01.169878 IP localhost.webcache > localhost.47782: Flags [R], seq 2243084059, win 0, length 0
    01:00:41.470495 IP localhost.59314 > localhost.webcache: Flags , seq 2761050291, win 65495, options [mss 65495,sackOK,TS val 3930731121 ecr 0,nop,wscale 7], length 0
    01:00:41.470509 IP localhost.webcache > localhost.59314: Flags [S.], seq 3096878784, ack 2761050292, win 65483, options [mss 65495,sackOK,TS val 3930731121 ecr 3930731121,nop,wscale 7], length 0
    01:00:41.470521 IP localhost.59314 > localhost.webcache: Flags [.], ack 1, win 512, options [nop,nop,TS val 3930731121 ecr 3930731121], length 0
    01:00:41.473914 IP localhost.59314 > localhost.webcache: Flags [P.], seq 1:518, ack 1, win 512, options [nop,nop,TS val 3930731124 ecr 3930731121], length 517: HTTP
    01:00:41.473927 IP localhost.webcache > localhost.59314: Flags [.], ack 518, win 508, options [nop,nop,TS val 3930731124 ecr 3930731124], length 0
    01:00:41.482397 IP localhost.webcache > localhost.59314: Flags [P.], seq 1:2198, ack 518, win 512, options [nop,nop,TS val 3930731133 ecr 3930731124], length 2197: HTTP
    01:00:41.482413 IP localhost.59314 > localhost.webcache: Flags [.], ack 2198, win 499, options [nop,nop,TS val 3930731133 ecr 3930731133], length 0
    01:00:41.483329 IP localhost.59314 > localhost.webcache: Flags [P.], seq 518:598, ack 2198, win 512, options [nop,nop,TS val 3930731134 ecr 3930731133], length 80: HTTP
    01:00:41.483483 IP localhost.webcache > localhost.59314: Flags [P.], seq 2198:2453, ack 598, win 512, options [nop,nop,TS val 3930731134 ecr 3930731134], length 255: HTTP
    01:00:41.483509 IP localhost.59314 > localhost.webcache: Flags [P.], seq 598:735, ack 2453, win 511, options [nop,nop,TS val 3930731134 ecr 3930731134], length 137: HTTP
    01:00:41.483539 IP localhost.webcache > localhost.59314: Flags [P.], seq 2453:2708, ack 735, win 511, options [nop,nop,TS val 3930731134 ecr 3930731134], length 255: HTTP
    01:00:41.495010 IP localhost.webcache > localhost.59314: Flags [FP.], seq 2708:2891, ack 735, win 512, options [nop,nop,TS val 3930731145 ecr 3930731134], length 183: HTTP
    01:00:41.495079 IP localhost.59314 > localhost.webcache: Flags [.], ack 2892, win 512, options [nop,nop,TS val 3930731145 ecr 3930731134], length 0
    01:00:41.495176 IP localhost.59314 > localhost.webcache: Flags [P.], seq 735:759, ack 2892, win 512, options [nop,nop,TS val 3930731145 ecr 3930731134], length 24: HTTP
    01:00:41.495185 IP localhost.webcache > localhost.59314: Flags [R], seq 3096881676, win 0, length 0


    Flags in last line of tcpdump is [R] which is reset connection. Can anyone please help me to understand why flask is closing the connection even though after setting WSGIRequestHandler.protocol_version to HTTP/1.1 in the code and is there anyway to fix this.

    Continue reading...

Compartilhe esta Página