pypi / support

Issue tracker for support requests related to using https://pypi.org
94 stars 48 forks source link

Connection reset by peer when trying to upload to PyPI with Twine #3222

Open loewenheim opened 11 months ago

loewenheim commented 11 months ago

My Platform

We upload Python artifacts to pypi.org with Twine as part of our release process. In a significant number of cases, the upload fails with a "connection reset by peer" error. The attached log contains one example of such a failure. twine-log.txt

Platform:

Fastly Debug

N/A

DNS Resolution

$ dig pypi.org A
; <<>> DiG 9.16.44-Debian <<>> pypi.org A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62418
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1224
;; QUESTION SECTION:
;pypi.org.          IN  A

;; ANSWER SECTION:
pypi.org.       252 IN  A   151.101.64.223
pypi.org.       252 IN  A   151.101.192.223
pypi.org.       252 IN  A   151.101.128.223
pypi.org.       252 IN  A   151.101.0.223

;; Query time: 4 msec
;; SERVER: 168.63.129.16#53(168.63.129.16)
;; WHEN: Mon Oct 02 08:39:33 UTC 2023
;; MSG SIZE  rcvd: 101
$ dig pypi.org AAAA
; <<>> DiG 9.16.44-Debian <<>> pypi.org AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6240
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1224
;; QUESTION SECTION:
;pypi.org.          IN  AAAA

;; ANSWER SECTION:
pypi.org.       1430    IN  AAAA    2a04:4e42:600::223
pypi.org.       1430    IN  AAAA    2a04:4e42:200::223
pypi.org.       1430    IN  AAAA    2a04:4e42::223
pypi.org.       1430    IN  AAAA    2a04:4e42:400::223

;; Query time: 0 msec
;; SERVER: 168.63.129.16#53(168.63.129.16)
;; WHEN: Mon Oct 02 08:39:33 UTC 2023
;; MSG SIZE  rcvd: 149
$ dig files.pythonhosted.org A
; <<>> DiG 9.16.44-Debian <<>> files.pythonhosted.org A
+ dig files.pythonhosted.org AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38974
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1224
;; QUESTION SECTION:
;files.pythonhosted.org.        IN  A

;; ANSWER SECTION:
files.pythonhosted.org. 1411    IN  CNAME   dualstack.m.sni.global.fastly.net.
dualstack.m.sni.global.fastly.net. 28 IN A  146.75.105.55

;; Query time: 0 msec
;; SERVER: 168.63.129.16#53(168.63.129.16)
;; WHEN: Mon Oct 02 08:39:33 UTC 2023
;; MSG SIZE  rcvd: 114
$ dig files.pythonhosted.org AAAA
; <<>> DiG 9.16.44-Debian <<>> files.pythonhosted.org AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61800
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1224
;; QUESTION SECTION:
;files.pythonhosted.org.        IN  AAAA

;; ANSWER SECTION:
files.pythonhosted.org. 1297    IN  CNAME   dualstack.m.sni.global.fastly.net.
dualstack.m.sni.global.fastly.net. 15 IN AAAA   2a04:4e42:8a::311

;; Query time: 4 msec
;; SERVER: 168.63.129.16#53(168.63.129.16)
;; WHEN: Mon Oct 02 08:39:33 UTC 2023
;; MSG SIZE  rcvd: 126

Traceroutes / IPv4

$ traceroute pypi.org
traceroute to pypi.org (151.101.128.223), 30 hops max, 60 byte packets
1  172.17.0.1 (172.17.0.1)  0.078 ms  0.020 ms  0.010 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *
$ traceroute files.pythonhosted.org
traceroute to files.pythonhosted.org (146.75.105.55), 30 hops max, 60 byte packets
 1  172.17.0.1 (172.17.0.1)  0.040 ms  0.011 ms  0.008 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *

Traceroutes / IPv6 (If available)

N/A

HTTPS Requests / IPv4

$ curl -vvv -I --ipv4 https://pypi.org/pypi/pip/json
Trying 151.101.192.223:443...
* Connected to pypi.org (151.101.192.223) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [2856 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=pypi.org
*  start date: Apr 29 19:53:38 2023 GMT
*  expire date: May 30 19:53:37 2024 GMT
*  subjectAltName: host "pypi.org" matched cert's "pypi.org"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Atlas R3 DV TLS CA 2023 Q2
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
} [5 bytes data]
* Using Stream ID: 1 (easy handle 0x5649f84912e0)
} [5 bytes data]
> HEAD /pypi/pip/json HTTP/2
> Host: pypi.org
> user-agent: curl/7.74.0
> accept: */*
> 
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [209 bytes data]
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
} [5 bytes data]
< HTTP/2 200 
HTTP/2 200 
content-type: application/json
access-control-allow-origin: *
access-control-allow-headers: Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since
access-control-allow-methods: GET
access-control-max-age: 86400
access-control-expose-headers: X-PyPI-Last-Serial
x-pypi-last-serial: 18994017
cache-control: max-age=900, public
etag: "ewK3r9bIDWlyhuLy5JmdTQ"
content-security-policy: base-uri 'self'; block-all-mixed-content; connect-src 'self' https://api.github.com/repos/ https://api.github.com/search/issues https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com fastly-insights.com *.fastly-insights.com *.ethicalads.io https://api.pwnedpasswords.com/ https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/sre/mathmaps/ https://2p66nmmycsj3.statuspage.io;/ default-src 'none'; font-src 'self' fonts.gstatic.com; form-action 'self' https://checkout.stripe.com;/ frame-ancestors 'none'; frame-src 'none'; img-src 'self' https://pypi-camo.global.ssl.fastly.net/ https://*.google-analytics.com https://*.googletagmanager.com *.fastly-insights.com *.ethicalads.io; script-src 'self' https://*.googletagmanager.com https://www.google-analytics.com/ https://ssl.google-analytics.com/ *.fastly-insights.com *.ethicalads.io 'sha256-U3hKDidudIaxBDEzwGJApJgPEf2mWk6cfMWghrAa6i0=' https://cdn.jsdelivr.net/npm/mathjax@3.2.2/ 'sha256-1CldwzdEg2k1wTmf7s5RWVd7NMXI/7nxxjJM2C4DqII=' 'sha256-0POaN8stWYQxhzjKS+/eOfbbJ/u4YHO5ZagJvLpMypo='; style-src 'self' fonts.googleapis.com *.ethicalads.io 'sha256-2YHqZokjiizkHi1Zt+6ar0XJ0OeEy/egBnlm+MDMtrM=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JLEjeN9e5dGsz5475WyRaoA4eQOdNPxDIeUhclnJDCE=' 'sha256-mQyxHEuwZJqpxCw3SLmc4YOySNKXunyu2Oiz1r3/wAE=' 'sha256-OCf+kv5Asiwp++8PIevKBYSgnNLNUZvxAp4a7wMLuKA=' 'sha256-h5LOiLhk6wiJrGsG5ItM0KimwzWQH/yAcmoJDJL//bY='; worker-src *.fastly-insights.com
referrer-policy: origin-when-cross-origin
accept-ranges: bytes
date: Mon, 02 Oct 2023 08:40:33 GMT
x-served-by: cache-iad-kcgs7200098-IAD, cache-dfw-kdfw8210131-DFW
x-cache: HIT, HIT
x-cache-hits: 633621, 1
x-timer: S1696236034.599010,VS0,VE1
vary: Accept-Encoding
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-frame-options: deny
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-permitted-cross-domain-policies: none
permissions-policy: publickey-credentials-create=(self),publickey-credentials-get=(self),accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),execution-while-not-rendered=(),execution-while-out-of-viewport=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),hid=(),identity-credentials-get=(),idle-detection=(),local-fonts=(),magnetometer=(),microphone=(),midi=(),otp-credentials=(),payment=(),picture-in-picture=(),screen-wake-lock=(),serial=(),speaker-selection=(),storage-access=(),usb=(),web-share=(),xr-spatial-tracking=()
content-length: 177007

< content-type: application/json
< access-control-allow-origin: *
< access-control-allow-headers: Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since
< access-control-allow-methods: GET
< access-control-max-age: 86400
< access-control-expose-headers: X-PyPI-Last-Serial
< x-pypi-last-serial: 18994017
< cache-control: max-age=900, public
< etag: "ewK3r9bIDWlyhuLy5JmdTQ"
< content-security-policy: base-uri 'self'; block-all-mixed-content; connect-src 'self' https://api.github.com/repos/ https://api.github.com/search/issues https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com fastly-insights.com *.fastly-insights.com *.ethicalads.io https://api.pwnedpasswords.com/ https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/sre/mathmaps/ https://2p66nmmycsj3.statuspage.io;/ default-src 'none'; font-src 'self' fonts.gstatic.com; form-action 'self' https://checkout.stripe.com;/ frame-ancestors 'none'; frame-src 'none'; img-src 'self' https://pypi-camo.global.ssl.fastly.net/ https://*.google-analytics.com https://*.googletagmanager.com *.fastly-insights.com *.ethicalads.io; script-src 'self' https://*.googletagmanager.com https://www.google-analytics.com/ https://ssl.google-analytics.com/ *.fastly-insights.com *.ethicalads.io 'sha256-U3hKDidudIaxBDEzwGJApJgPEf2mWk6cfMWghrAa6i0=' https://cdn.jsdelivr.net/npm/mathjax@3.2.2/ 'sha256-1CldwzdEg2k1wTmf7s5RWVd7NMXI/7nxxjJM2C4DqII=' 'sha256-0POaN8stWYQxhzjKS+/eOfbbJ/u4YHO5ZagJvLpMypo='; style-src 'self' fonts.googleapis.com *.ethicalads.io 'sha256-2YHqZokjiizkHi1Zt+6ar0XJ0OeEy/egBnlm+MDMtrM=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JLEjeN9e5dGsz5475WyRaoA4eQOdNPxDIeUhclnJDCE=' 'sha256-mQyxHEuwZJqpxCw3SLmc4YOySNKXunyu2Oiz1r3/wAE=' 'sha256-OCf+kv5Asiwp++8PIevKBYSgnNLNUZvxAp4a7wMLuKA=' 'sha256-h5LOiLhk6wiJrGsG5ItM0KimwzWQH/yAcmoJDJL//bY='; worker-src *.fastly-insights.com
< referrer-policy: origin-when-cross-origin
< accept-ranges: bytes
< date: Mon, 02 Oct 2023 08:40:33 GMT
< x-served-by: cache-iad-kcgs7200098-IAD, cache-dfw-kdfw8210131-DFW
< x-cache: HIT, HIT
< x-cache-hits: 633621, 1
< x-timer: S1696236034.599010,VS0,VE1
< vary: Accept-Encoding
< strict-transport-security: max-age=31536000; includeSubDomains; preload
< x-frame-options: deny
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
< x-permitted-cross-domain-policies: none
< permissions-policy: publickey-credentials-create=(self),publickey-credentials-get=(self),accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),execution-while-not-rendered=(),execution-while-out-of-viewport=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),hid=(),identity-credentials-get=(),idle-detection=(),local-fonts=(),magnetometer=(),microphone=(),midi=(),otp-credentials=(),payment=(),picture-in-picture=(),screen-wake-lock=(),serial=(),speaker-selection=(),storage-access=(),usb=(),web-share=(),xr-spatial-tracking=()
< content-length: 177007
<
$ curl -vvv -I --ipv4 https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz
Trying 146.75.105.55:443...
* Connected to files.pythonhosted.org (146.75.105.55) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [2831 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=*.pythonhosted.org
*  start date: Jul  1 20:50:25 2023 GMT
*  expire date: Aug  1 20:50:24 2024 GMT
*  subjectAltName: host "files.pythonhosted.org" matched cert's "*.pythonhosted.org"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Atlas R3 DV TLS CA 2023 Q2
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
} [5 bytes data]
* Using Stream ID: 1 (easy handle 0x55ef834de2e0)
} [5 bytes data]
> HEAD /packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz HTTP/2
> Host: files.pythonhosted.org
> user-agent: curl/7.74.0
> accept: */*
> 
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [209 bytes data]
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
} [5 bytes data]
< HTTP/2 200 
< last-modified: Tue, 11 Apr 2023 02:19:03 GMT
< etag: "83a177756e2c801d0b3a6f7b0d4f3f7e"
< x-amz-meta-btime: 2020-02-26T17:47:37.438Z
< x-amz-meta-mtime: 1582739257.438
< x-amz-request-id: b08f82242304904a
< x-amz-id-2: aNwhj+TF2NuhmjzHNMG1kimZ2Y7swHTiN
< x-amz-version-id: 4_z179c51e67f11a0ad8f6c0018_f1191cd4ff993bd3d_d20230411_m021903_c005_v0501003_t0041_u01681179543316
< content-type: binary/octet-stream
< cache-control: max-age=365000000, immutable, public
< accept-ranges: bytes
< date: Mon, 02 Oct 2023 08:40:33 GMT
< age: 715986
< x-served-by: cache-iad-kcgs7200149-IAD, cache-dfw-kdfw8210099-DFW
< x-cache: HIT, MISS
< x-cache-hits: 124, 0
HTTP/2 200 
< x-timer: S1696236034.655513,VS0,VE36
< strict-transport-security: max-age=31536000; includeSubDomains; preload
< x-frame-options: deny
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
< x-permitted-cross-domain-policies: none
< x-robots-header: noindex
< x-pypi-file-python-version: source
< x-pypi-file-version: 10.0.1
< x-pypi-file-package-type: sdist
< x-pypi-file-project: pip
< content-length: 1246072
< 

  0 1216k    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
* Connection #0 to host files.pythonhosted.org left intact
last-modified: Tue, 11 Apr 2023 02:19:03 GMT
etag: "83a177756e2c801d0b3a6f7b0d4f3f7e"
x-amz-meta-btime: 2020-02-26T17:47:37.438Z
x-amz-meta-mtime: 1582739257.438
x-amz-request-id: b08f82242304904a
x-amz-id-2: aNwhj+TF2NuhmjzHNMG1kimZ2Y7swHTiN
x-amz-version-id: 4_z179c51e67f11a0ad8f6c0018_f1191cd4ff993bd3d_d20230411_m021903_c005_v0501003_t0041_u01681179543316
content-type: binary/octet-stream
cache-control: max-age=365000000, immutable, public
accept-ranges: bytes
date: Mon, 02 Oct 2023 08:40:33 GMT
age: 715986
x-served-by: cache-iad-kcgs7200149-IAD, cache-dfw-kdfw8210099-DFW
x-cache: HIT, MISS
x-cache-hits: 124, 0
x-timer: S1696236034.655513,VS0,VE36
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-frame-options: deny
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-permitted-cross-domain-policies: none
x-robots-header: noindex
x-pypi-file-python-version: source
x-pypi-file-version: 10.0.1
x-pypi-file-package-type: sdist
x-pypi-file-project: pip
content-length: 1246072

HTTPS Requests / IPv6 (If available)

N/A

TLS Debug / IPv4

$ echo -n | openssl s_client -4 -connect pypi.org:443
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
verify return:1
depth=0 CN = pypi.org
verify return:1
DONE
CONNECTED(00000003)
---
Certificate chain
 0 s:CN = pypi.org
   i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
 1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGfzCCBWegAwIBAgIQATphpUBWfreAY2OTrbDywTANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRMjAeFw0yMzA0
MjkxOTUzMzhaFw0yNDA1MzAxOTUzMzdaMBMxETAPBgNVBAMMCHB5cGkub3JnMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsVzK0dZ2ALTL74lfSb8xvcqO
eEP1opP9RNEQXhsEAs5sI8hYBP/j8IJO4cBZN/585CTJ8SAMxXon7IC0FvXnhefc
bE0kyHQf1cchLuqi2cArNUCZd7kIwYCpIpDvYLTlcJP1ClwwlUdDfobcMMLlot14
NBY11KT1iuNdujm83xF4LvHZu1dNTNMkU0Qnzl26tVKzewC29nEELWwz0Navusc/
5RVUI8bWrY2ZEJyeJvbs6aHcNbPdhfb8JP8pzheLNDL0VjWnxJnIDWttprck5FJM
lueKFjrx4vGB8kWfFpLkOSoq4/VW75FvR78Zx2Bj8BroMnbUiQ/NLhlBFHCscQID
AQABo4IDiDCCA4QwPgYDVR0RBDcwNYIIcHlwaS5vcmeCCioucHlwaS5vcmeCDHd3
dy5weXBpLm9yZ4IPZG9uYXRlLnB5cGkub3JnMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFH5KpEjjaz1tMuya
qyjnyKenhRycMFcGA1UdIARQME4wCAYGZ4EMAQIBMEIGCisGAQQBoDIKAQMwNDAy
BggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9y
eS8wDAYDVR0TAQH/BAIwADCBngYIKwYBBQUHAQEEgZEwgY4wQAYIKwYBBQUHMAGG
NGh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2NhL2dzYXRsYXNyM2R2dGxzY2Ey
MDIzcTIwSgYIKwYBBQUHMAKGPmh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20v
Y2FjZXJ0L2dzYXRsYXNyM2R2dGxzY2EyMDIzcTIuY3J0MB8GA1UdIwQYMBaAFMai
YRNFFcyQj7rBrLzMOw0O0N4GMEgGA1UdHwRBMD8wPaA7oDmGN2h0dHA6Ly9jcmwu
Z2xvYmFsc2lnbi5jb20vY2EvZ3NhdGxhc3IzZHZ0bHNjYTIwMjNxMi5jcmwwggF/
BgorBgEEAdZ5AgQCBIIBbwSCAWsBaQB2AHb/iD8KtvuVUcJhzPWHujS0pM27Kdxo
Qgqf5mdMWjp0AAABh86UAM4AAAQDAEcwRQIhAMEeNv9F3vkrUFb8UDUnBgcJ2ed2
u0Y2h4qXuv4SyBcCAiAdoR3AfpZboQtcbZ4F5kfLAIaEZ48avbJTJGrTg0Z0dwB2
ADtTd3U+LbmAToswWwb+QDtn2E/D9Me9AA0tcm/h+tQXAAABh86UAXkAAAQDAEcw
RQIhAL+PCGdwFgr/6mjPltxIkO2pSZ6eDY2sv8n+cW5hXCmzAiAL3XKCZqwJGJXE
kvt1ZJkMoqLzAy5CM2ANzSIXQni6wgB3AHPZnokbTJZ4oCB9R53mssYc0FFecRkq
jGuAEHrBd3K1AAABh86UAcgAAAQDAEgwRgIhALbbX2nIHt3iNRL+nMyqN0CUwxDz
BaSjdQhfBDPciwKbAiEAov0IJaslITt1Mxtyh4Ped9ZOkST5A0K0/Fdbk64zI+sw
DQYJKoZIhvcNAQELBQADggEBAGodVH7XXcayedVPuAMF5agiOBVJp7evMWz2R8xK
ON0jovv1oItNrXvt3tVWvPUl4Dm/AIbCrAHw/d1cz1loot8Nv2tRI8vRpBZ6bnnQ
wWKVlJmz3BRr42wV5HMiLjk0cUFgL+BDcoqpcEKUXsuNgTaevvLkx38Oo8b4Y9PT
CBkcuiqBfqViBAHB9mUcJCtpXW5waX+DwvbkkTULNTdYq5CZLENSPa2H22r/V0SI
gu08iGpOOdMJaaFBQp35ECW+UTdYSa+9tMx+B3GzpgxXVcW/P/ZCKcThequGVDbr
7hy8HRcXVP/+ejef0co8/E9MR5/EYrICq5M7JWJunSDgFP8=
-----END CERTIFICATE-----
subject=CN = pypi.org

issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3403 bytes and written 380 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: A15BE94A903D52B5FCFDFD0B3BB914329ED3A12FC309094A488D1C9AAEA1951F
    Session-ID-ctx: 
    Resumption PSK: B7AF99C867BCA2B12BCFDCD8AA16495543C1F742FE77B3FE8941170FE716F7A9E652E1768DD05072DD9974138E23C21C
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 1a 3d 0b a0 7a 11 5a 93-19 e6 c4 b0 c1 64 be 10   .=..z.Z......d..
    0010 - d7 43 66 81 5c f9 b1 74-87 09 cd a8 72 90 ae 67   .Cf.\..t....r..g
    0020 - b4 0f d0 cd 3f 6c bb d7-dd 08 98 a0 76 03 51 b5   ....?l......v.Q.
    0030 - 1c 21 dd bf 1d bf fc c3-6e f1 9b 02 26 b9 1f 0a   .!......n...&...
    0040 - c8 2c 77 af 07 65 1c 28-69 f3 58 a2 60 39 de 49   .,w..e.(i.X.`9.I
    0050 - dc 23 a8 44 48 7d 23 fa-95 14 7c f5 6f 1a 1e ef   .#.DH}#...|.o...
    0060 - a8 84 f3 36 d3 58 48 6c-c9 99 e1 5c f1 60 14 da   ...6.XHl...\.`..
    0070 - 04 c2 09 98 80 e9 ec 94-72 c1 df 08 cf 44 42 7e   ........r....DB~
    0080 - e8 8e 1c f9 94 f5 5c 16-0d 21 ae 76 dc 9b 45 95   ......\..!.v..E.
    0090 - a4 4e b8 35 fb fe 0a 71-18 66 ec ff e3 a8 a9 1e   .N.5...q.f......
    00a0 - 28 02 cf 9d c5 e8 21 0b-e2 bd e3 a3 e9 e7 0b 35   (.....!........5

    Start Time: 1696236033
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
$ echo -n | openssl s_client -4 -connect files.pythonhosted.org:443
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
verify return:1
depth=0 CN = *.pythonhosted.org
verify return:1
DONE
CONNECTED(00000003)
---
Certificate chain
 0 s:CN = *.pythonhosted.org
   i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
 1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGZjCCBU6gAwIBAgIQAQXnUK6h/QwFsLAnYL7NBDANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRMjAeFw0yMzA3
MDEyMDUwMjVaFw0yNDA4MDEyMDUwMjRaMB0xGzAZBgNVBAMMEioucHl0aG9uaG9z
dGVkLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMMeAyhtK20j
ump8M2NOR/Wb5tTwfuySip+TkYnHzllwNqKPua+oTpPsMqDZ9JpqfFe+PMw02ajH
eaeJJTgoD8YEb4syAPMDoqz/0Ue7xRX1it9hTtHHB9UP9m0loa5t3Juaz+nxC4he
noQ2iAvZFFvT4dX47cg+qeNqiMgY1rMOJHcq1i0UXvpzdS6AFHgW6MGnyYvavAbV
Uv09ocno/X7KBED7eoL2HbfwIPgnq/L6bbbt/japig2tEmqyjbhW+vBvADyx55Y6
FirzZHkZ0HF3k2g65BvmTb22p0x+0XqLFjyXgYT0KwcEbKKYq8jJh0grpQH+GWZQ
0LyVmVegPK8CAwEAAaOCA2UwggNhMB0GA1UdEQQWMBSCEioucHl0aG9uaG9zdGVk
Lm9yZzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMB0GA1UdDgQWBBRUjFwvnzsiKLolC2rxupen1gbfCzBXBgNVHSAEUDBOMAgG
BmeBDAECATBCBgorBgEEAaAyCgEDMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3
Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAwGA1UdEwEB/wQCMAAwgZ4GCCsG
AQUFBwEBBIGRMIGOMEAGCCsGAQUFBzABhjRodHRwOi8vb2NzcC5nbG9iYWxzaWdu
LmNvbS9jYS9nc2F0bGFzcjNkdnRsc2NhMjAyM3EyMEoGCCsGAQUFBzAChj5odHRw
Oi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2F0bGFzcjNkdnRsc2Nh
MjAyM3EyLmNydDAfBgNVHSMEGDAWgBTGomETRRXMkI+6way8zDsNDtDeBjBIBgNV
HR8EQTA/MD2gO6A5hjdodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2NhL2dzYXRs
YXNyM2R2dGxzY2EyMDIzcTIuY3JsMIIBfQYKKwYBBAHWeQIEAgSCAW0EggFpAWcA
dgB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAYkTOJ7lAAAEAwBH
MEUCIEpQN30bEORtGcI9cAkltlMBASSqJg9XBV2Mw0hno9Q/AiEAhrz1aIZxsAaq
x9LG5bvuUl9ZgfYMKH30+xjVevYM1nkAdgDuzdBk1dsazsVct520zROiModGfLzs
3sNRSFlGcR+1mwAAAYkTOJ8ZAAAEAwBHMEUCIQC9FUgUvNwRg49MrpBIX/RuGTry
5jpX5GmEzhxJJlioNwIgUga+LUjRh3BZNQirUf1p9KlEwlL0LdM/bie8hZZgSVwA
dQDatr9rP7W2Ip+bwrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYkTOJ9XAAAEAwBG
MEQCIFWZBBBn2EOIY817GLCzzPbUgQzlxK6o0pUUvOSPdOMXAiBZaHEpJD05NCR7
oXsou1bqeES14vqUy53w4UNPopnNPzANBgkqhkiG9w0BAQsFAAOCAQEAlKhJpTZs
kkG/bBEoMrKclENg+jE3iCTEASTOWZ8ISodLG2TudAPK0XjL12Qt08kHz36aXjRo
uzjt1GEoLKmqfyThMKhDH657M+H2uokLxvvjHkru2BK8iibtqGHfHF1EgglcLrDG
UV6LxGTpQwxmSQRYNZ6tT+aSaMsWHinU/9lOQaHUz0nINMh7kcZJuZvjiw1I33tS
jEFayLbNtbDKiSzVsZ85VT7s9yfO4s4HOfUA2F1AFyWtaTRPYm+W2eU6foOR32yu
ZZxbMIp/VDJRw7k+wTGxPv8JUzDs6Rgh//qc7+NdCxsdlK+8tGUxWISJS7Ypgxtg
cRfB92MnObNElw==
-----END CERTIFICATE-----
subject=CN = *.pythonhosted.org

issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3378 bytes and written 394 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: A3CDB1493CEBEC1905D18C49F1E197B91E2E0A20AA8735D124CE48D7034046EC
    Session-ID-ctx: 
    Resumption PSK: E2BF38C9A6C508B6A770E902B190E7A8097BB1FAAD1CEB82AD8E2BECE5F8C6CC8AEC4BDDB3FFA116EAC764F6D0AE43F7
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 1a 3d 0b a0 7a 11 5a 93-19 e6 c4 b0 c1 64 be 10   .=..z.Z......d..
    0010 - 90 26 54 60 c4 d2 c9 68-fc 60 9d 6a 41 55 f7 6d   .&T`...h.`.jAU.m
    0020 - 2b b1 9a 41 7f 30 32 02-49 2f b9 c9 a0 0f c6 b8   +..A.02.I/......
    0030 - 20 9c 38 28 4d 12 a6 2f-58 16 ba 1a 21 a1 28 97    .8(M../X...!.(.
    0040 - b6 20 70 85 23 f0 08 c4-e5 5a f7 c8 d8 7e 18 d2   . p.#....Z...~..
    0050 - 8c 05 a1 d6 ad 41 01 53-f6 c3 8f 0e 4e 80 07 fc   .....A.S....N...
    0060 - 63 de b5 0b 4b 1a 0e 0f-1e e1 78 58 2c 4a da 51   c...K.....xX,J.Q
    0070 - f5 30 4e 55 7d 7d d9 d2-30 5d 43 0b e3 c2 2b a9   .0NU}}..0]C...+.
    0080 - 10 11 4b f5 9d d4 ba cf-36 51 a1 3d 10 9e bf 4f   ..K.....6Q.=...O
    0090 - 12 3c 9b 59 c7 c1 09 49-b0 49 c1 87 8e b4 ca 36   .<.Y...I.I.....6
    00a0 - 01 57 8b a9 2c 59 88 50-ec 93 e3 80 f2 bc 96 6b   .W..,Y.P.......k

    Start Time: 1696236033
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK

TLS Debug / IPv6 (If available)

N/A

Code of Conduct

miketheman commented 9 months ago

@loewenheim Have you been able to reproduce this with a recent release of twine? If possible, please provide a log of the failing process passing --verbose to twine for some more details.

loewenheim commented 6 months ago

Hi, apologies for the late response. It took us a while to be able to test this with a newer twine version. This is a similar failure with version 4.0.2 on a different repo:

2024-03-13T15:03:35.9293408Z STDOUT: twine: Uploading distributions to https://upload.pypi.org/legacy/
2024-03-13T15:03:35.9296587Z twine: Uploading 
2024-03-13T15:03:35.9300598Z twine: sentry_ophio-0.2.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
2024-03-13T15:03:35.9305575Z twine: 
2024-03-13T15:03:35.9309917Z   0% ���������������������������������������� 0.0/4.4 MB � --:-- � ?
2024-03-13T15:03:35.9313058Z   4% ���������������������������������������� 0.2/4.4 MB � 00:01 � 9.6 MB/s
2024-03-13T15:03:35.9316749Z  90% ���������������������������������������� 4.0/4.4 MB � 00:01 � 31.1 MB/s
2024-03-13T15:03:35.9320145Z 100% ���������������������������������������� 4.4/4.4 MB � 00:00 � 29.5 MB/s

[The last line repeats about 5000 times]

2024-03-13T15:03:36.4812361Z   twine: 
2024-03-13T15:03:36.4812568Z   
2024-03-13T15:03:36.4812772Z   
2024-03-13T15:03:36.4813118Z   STDERR:twine: Traceback (most recent call last):
2024-03-13T15:03:36.4813824Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 793, in urlopen
2024-03-13T15:03:36.4814117Z   twine:     response = self._make_request(
2024-03-13T15:03:36.4814851Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 537, in _make_request
2024-03-13T15:03:36.4815145Z   twine:     response = conn.getresponse()
2024-03-13T15:03:36.4815816Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/connection.py", line 466, in getresponse
2024-03-13T15:03:36.4816296Z   twine:     httplib_response = super().getresponse()
2024-03-13T15:03:36.4816772Z   twine:   File "/usr/lib/python3.9/http/client.py", line 1347, in getresponse
2024-03-13T15:03:36.4817011Z   twine:     response.begin()
2024-03-13T15:03:36.4817447Z   twine:   File "/usr/lib/python3.9/http/client.py", line 307, in begin
2024-03-13T15:03:36.4817808Z   twine:     version, status, reason = self._read_status()
2024-03-13T15:03:36.4818266Z   twine:   File "/usr/lib/python3.9/http/client.py", line 268, in _read_status
2024-03-13T15:03:36.4818746Z   twine:     line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
2024-03-13T15:03:36.4819148Z   twine:   File "/usr/lib/python3.9/socket.py", line 704, in readinto
2024-03-13T15:03:36.4819441Z   twine:     return self._sock.recv_into(b)
2024-03-13T15:03:36.4819853Z   twine:   File "/usr/lib/python3.9/ssl.py", line 1241, in recv_into
2024-03-13T15:03:36.4820154Z   twine:     return self.read(nbytes, buffer)
2024-03-13T15:03:36.4820524Z   twine:   File "/usr/lib/python3.9/ssl.py", line 1099, in read
2024-03-13T15:03:36.4820850Z   twine:     return self._sslobj.read(len, buffer)
2024-03-13T15:03:36.4821274Z   twine: ConnectionResetError: [Errno 104] Connection reset by peer
2024-03-13T15:03:36.4821486Z   twine:
2024-03-13T15:03:36.4822096Z   twine: During handling of the above exception, another exception occurred:
2024-03-13T15:03:36.4822302Z   twine:
2024-03-13T15:03:36.4822603Z   twine: Traceback (most recent call last):
2024-03-13T15:03:36.4823270Z   twine:   File "/venv/lib/python3.9/site-packages/requests/adapters.py", line 486, in send
2024-03-13T15:03:36.4823532Z   twine:     resp = conn.urlopen(
2024-03-13T15:03:36.4824211Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 847, in urlopen
2024-03-13T15:03:36.4824496Z   twine:     retries = retries.increment(
2024-03-13T15:03:36.4825155Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/util/retry.py", line 470, in increment
2024-03-13T15:03:36.4825520Z   twine:     raise reraise(type(error), error, _stacktrace)
2024-03-13T15:03:36.4826153Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/util/util.py", line 38, in reraise
2024-03-13T15:03:36.4826444Z   twine:     raise value.with_traceback(tb)
2024-03-13T15:03:36.4827226Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 793, in urlopen
2024-03-13T15:03:36.4827526Z   twine:     response = self._make_request(
2024-03-13T15:03:36.4828239Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 537, in _make_request
2024-03-13T15:03:36.4828531Z   twine:     response = conn.getresponse()
2024-03-13T15:03:36.4829176Z   twine:   File "/venv/lib/python3.9/site-packages/urllib3/connection.py", line 466, in getresponse
2024-03-13T15:03:36.4829518Z   twine:     httplib_response = super().getresponse()
2024-03-13T15:03:36.4829980Z   twine:   File "/usr/lib/python3.9/http/client.py", line 1347, in getresponse
2024-03-13T15:03:36.4830224Z   twine:     response.begin()
2024-03-13T15:03:36.4830650Z   twine:   File "/usr/lib/python3.9/http/client.py", line 307, in begin
2024-03-13T15:03:36.4831006Z   twine:     version, status, reason = self._read_status()
2024-03-13T15:03:36.4831474Z   twine:   File "/usr/lib/python3.9/http/client.py", line 268, in _read_status
2024-03-13T15:03:36.4831949Z   twine:     line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
2024-03-13T15:03:36.4832353Z   twine:   File "/usr/lib/python3.9/socket.py", line 704, in readinto
2024-03-13T15:03:36.4832646Z   twine:     return self._sock.recv_into(b)
2024-03-13T15:03:36.4833059Z   twine:   File "/usr/lib/python3.9/ssl.py", line 1241, in recv_into
2024-03-13T15:03:36.4833366Z   twine:     return self.read(nbytes, buffer)
2024-03-13T15:03:36.4833743Z   twine:   File "/usr/lib/python3.9/ssl.py", line 1099, in read
2024-03-13T15:03:36.4834069Z   twine:     return self._sslobj.read(len, buffer)
2024-03-13T15:03:36.4834897Z   twine: urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
2024-03-13T15:03:36.4835270Z   twine:
2024-03-13T15:03:36.4835761Z   twine: During handling of the above exception, another exception occurred:
2024-03-13T15:03:36.4835969Z   twine:
2024-03-13T15:03:36.4836269Z   twine: Traceback (most recent call last):
2024-03-13T15:03:36.4836605Z   twine:   File "/venv/bin/twine", line 8, in <module>
2024-03-13T15:03:36.4836844Z   twine:     sys.exit(main())
2024-03-13T15:03:36.4837437Z   twine:   File "/venv/lib/python3.9/site-packages/twine/__main__.py", line 33, in main
2024-03-13T15:03:36.4837742Z   twine:     error = cli.dispatch(sys.argv[1:])
2024-03-13T15:03:36.4838307Z   twine:   File "/venv/lib/python3.9/site-packages/twine/cli.py", line 123, in dispatch
2024-03-13T15:03:36.4838578Z   twine:     return main(args.args)
2024-03-13T15:03:36.4839221Z   twine:   File "/venv/lib/python3.9/site-packages/twine/commands/upload.py", line 198, in main
2024-03-13T15:03:36.4839602Z   twine:     return upload(upload_settings, parsed_args.dists)
2024-03-13T15:03:36.4840259Z   twine:   File "/venv/lib/python3.9/site-packages/twine/commands/upload.py", line 142, in upload
2024-03-13T15:03:36.4840570Z   twine:     resp = repository.upload(package)
2024-03-13T15:03:36.4841190Z   twine:   File "/venv/lib/python3.9/site-packages/twine/repository.py", line 186, in upload
2024-03-13T15:03:36.4841621Z   twine:     resp = self._upload(package)
2024-03-13T15:03:36.4842254Z   twine:   File "/venv/lib/python3.9/site-packages/twine/repository.py", line 172, in _upload
2024-03-13T15:03:36.4842525Z   twine:     resp = self.session.post(
2024-03-13T15:03:36.4843146Z   twine:   File "/venv/lib/python3.9/site-packages/requests/sessions.py", line 637, in post
2024-03-13T15:03:36.4843610Z   twine:     return self.request("POST", url, data=data, json=json, **kwargs)
2024-03-13T15:03:36.4844245Z   twine:   File "/venv/lib/python3.9/site-packages/requests/sessions.py", line 589, in request
2024-03-13T15:03:36.4844564Z   twine:     resp = self.send(prep, **send_kwargs)
2024-03-13T15:03:36.4845176Z   twine:   File "/venv/lib/python3.9/site-packages/requests/sessions.py", line 703, in send
2024-03-13T15:03:36.4845490Z   twine:     r = adapter.send(request, **kwargs)
2024-03-13T15:03:36.4846099Z   twine:   File "/venv/lib/python3.9/site-packages/requests/adapters.py", line 501, in send
2024-03-13T15:03:36.4846455Z   twine:     raise ConnectionError(err, request=request)
2024-03-13T15:03:36.4847288Z   twine: requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
2024-03-13T15:03:36.4847501Z   twine:

This seems to indicate that the upload itself is totally fine.