On my Linux machine I was able to reproduce the problem. And now that I'm on Linux, Pale Moon gives me the POSIX
curl command syntax instead of the Windows syntax. Previously I was working with Windows syntax but using a POSIX
curl interpreter which lead me to mistakenly think the curl command was malformed.
The problem is easily reproducible in POSIX curl.
I will report these findings to my host and see what they have for me next.
Here is the initial request with 200 response (using -v flag for verbose output to provide all the details).
Note the presence of
< HTTP/2 200 and
etag: "2150-5571d13a36989" as well as the CSS file contents (partially removed to shorten this post) in the output.
Code: Select all
curl -v 'https://www.sr20-forum.com/styles/main.css' '--http2' -H 'Host: www.sr20-forum.com' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Goanna/6.7 Firefox/102.0 PaleMoon/33.5.1' -H 'Accept: text/css,*/*;q=0.1' -H 'Accept-Language: en-US,en;q=0.5' -H 'Sec-GPC: 1' -H 'Connection: keep-alive' -H 'Sec-Fetch-Dest: style' -H 'Sec-Fetch-Mode: no-cors' -H 'Sec-Fetch-Site: same-origin' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache'
Code: Select all
* Trying 208.94.117.224:443...
* Connected to www.sr20-forum.com (208.94.117.224) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
* subject: CN=www.sr20-forum.com
* start date: Jan 10 10:53:43 2025 GMT
* expire date: Apr 10 10:53:42 2025 GMT
* subjectAltName: host "www.sr20-forum.com" matched cert's "www.sr20-forum.com"
* issuer: C=US; O=Let's Encrypt; CN=E6
* SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* Using Stream ID: 1 (easy handle 0x5c9775f5eeb0)
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
> GET /styles/main.css HTTP/2
> Host: www.sr20-forum.com
> user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Goanna/6.7 Firefox/102.0 PaleMoon/33.5.1
> accept: text/css,*/*;q=0.1
> accept-language: en-US,en;q=0.5
> sec-gpc: 1
> connection: keep-alive
> sec-fetch-dest: style
> sec-fetch-mode: no-cors
> sec-fetch-site: same-origin
> pragma: no-cache
> cache-control: no-cache
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 200
< date: Tue, 11 Feb 2025 14:38:11 GMT
< server: Apache
< last-modified: Sat, 19 Aug 2017 15:41:18 GMT
< etag: "2150-5571d13a36989"
< accept-ranges: bytes
< content-length: 8528
< content-type: text/css
< vary: Accept-Encoding
< via: e15s
<
body {
margin: 0px auto;
padding: 0px;
font: 100% Tahoma,Calibri,Verdana,Geneva,sans-serif;
background-color: #B7C7D4;
background-image: url("/images/background.png");
background-repeat: repeat-x;
}
<MOST CSS FILE CONTENTS HERE. REMOVED TO SHORTEN THIS POST>
a.page_skip_last:hover {
border: 1px solid #417394;
color: #3E3E3E !important;
background-color: #E8E8E8;
background-image: url("/images/pagination/last_hover.png");
* TLSv1.2 (IN), TLS header, Supplemental data (23):
background-repeat: no-repeat;
background-position: 90% 6px;
text-decoration: none !important;
}
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* Connection #0 to host www.sr20-forum.com left intact
And here is the follow-up request with 304 response (using -v flag for verbose output to provide all the details) and aborted
connection stream. You might have to change the
If-Modified-Since value if you're trying this yourself. Also, you might have to try it a couple times within a handful of seconds of each other to see the error. It may succeed the first attempt.
Note the presence of the seemingly correctly formed
-H 'If-None-Match: "2150-5571d13a36989"' in the curl command.
Note the seemingly correct
if-none-match: "2150-5571d13a36989" in the command output.
Note the
< HTTP/2 304 in the output.
Note the lack of CSS file contents in the output. (Maybe this is normal for a 304 status?)
Note the
HTTP/2 stream 0 was not closed cleanly: STREAM_CLOSED (err 5) in the output.
Note the output summary from the curl command on the final line
curl: (92) HTTP/2 stream 0 was not closed cleanly: STREAM_CLOSED (err 5).
Code: Select all
curl -v 'https://www.sr20-forum.com/styles/main.css' '--http2' -H 'Host: www.sr20-forum.com' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Goanna/6.7 Firefox/102.0 PaleMoon/33.5.1' -H 'Accept: text/css,*/*;q=0.1' -H 'Accept-Language: en-US,en;q=0.5' -H 'Sec-GPC: 1' -H 'Connection: keep-alive' -H 'Sec-Fetch-Dest: style' -H 'Sec-Fetch-Mode: no-cors' -H 'Sec-Fetch-Site: same-origin' -H 'If-Modified-Since: Sat, 19 Aug 2017 15:41:18 GMT' -H 'If-None-Match: "2150-5571d13a36989"' -H 'Cache-Control: max-age=0'
Code: Select all
* Trying 208.94.117.224:443...
* Connected to www.sr20-forum.com (208.94.117.224) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
* subject: CN=www.sr20-forum.com
* start date: Jan 10 10:53:43 2025 GMT
* expire date: Apr 10 10:53:42 2025 GMT
* subjectAltName: host "www.sr20-forum.com" matched cert's "www.sr20-forum.com"
* issuer: C=US; O=Let's Encrypt; CN=E6
* SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* Using Stream ID: 1 (easy handle 0x5c97b4bb3eb0)
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
> GET /styles/main.css HTTP/2
> Host: www.sr20-forum.com
> user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Goanna/6.7 Firefox/102.0 PaleMoon/33.5.1
> accept: text/css,*/*;q=0.1
> accept-language: en-US,en;q=0.5
> sec-gpc: 1
> connection: keep-alive
> sec-fetch-dest: style
> sec-fetch-mode: no-cors
> sec-fetch-site: same-origin
> if-modified-since: Sat, 19 Aug 2017 15:41:18 GMT
> if-none-match: "2150-5571d13a36989"
> cache-control: max-age=0
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 304
< date: Tue, 11 Feb 2025 14:46:43 GMT
< server: Apache
< etag: "2150-5571d13a36989"
< accept-ranges: bytes
< vary: Accept-Encoding
< via: e13s
<
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* HTTP/2 stream 0 was not closed cleanly: STREAM_CLOSED (err 5)
* stopped the pause stream!
* Connection #0 to host www.sr20-forum.com left intact
curl: (92) HTTP/2 stream 0 was not closed cleanly: STREAM_CLOSED (err 5)