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...