Expected Behavior
It should be able to work via http1.1 and http2 streams respectively
CURL command works
06:06:05 root@MSI ~ β curl -v -k -N -X POST https://localhost:8888/graphql -H 'Accept: multipart/mixed; boundary=graphql; subscriptionSpec=1.0, application/json' -H 'Content-Type: application/json' --data-binary @- <<EOF
{
"query": "subscription { check }"
}
EOF
Note: Unnecessary use of -X or --request, POST is already inferred.
* Host localhost:8888 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
* Trying [::1]:8888...
* connect to ::1 port 8888 from ::1 port 46692 failed: Connection refused
* Trying 127.0.0.1:8888...
* Connected to localhost (127.0.0.1) port 8888
* 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 accepted h2
* Server certificate:
* subject: C=US; ST=NC; L=Raleigh; O=Psync; OU=Psync Up; CN=0.0.0.0; emailAddress=srikanth@psync.dev
* start date: Mar 19 23:25:31 2026 GMT
* expire date: Mar 16 23:25:31 2036 GMT
* issuer: C=US; ST=NC; L=Raleigh; O=Psync; OU=Psync Up; CN=0.0.0.0; emailAddress=srikanth@psync.dev
* SSL certificate verify result: self-signed certificate (18), continuing anyway.
* Certificate level 0: Public key type RSA (4096/152 Bits/secBits), signed using sha512WithRSAEncryption
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://localhost:8888/graphql
* [HTTP/2] [1] [:method: POST]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: localhost:8888]
* [HTTP/2] [1] [:path: /graphql]
* [HTTP/2] [1] [user-agent: curl/8.5.0]
* [HTTP/2] [1] [accept: multipart/mixed; boundary=graphql; subscriptionSpec=1.0, application/json]
* [HTTP/2] [1] [content-type: application/json]
* [HTTP/2] [1] [content-length: 40]
> POST /graphql HTTP/2
> Host: localhost:8888
> User-Agent: curl/8.5.0
> Accept: multipart/mixed; boundary=graphql; subscriptionSpec=1.0, application/json
> Content-Type: application/json
> Content-Length: 40
>
< HTTP/2 200
< content-type: multipart/mixed;boundary=graphql;subscriptionSpec=1.0,application/json
< content-security-policy-report-only: default-src 'self'; script-src 'nonce-kZjs18huel_MBpoNmUAixw' 'self' 'unsafe-inline' 'unsafe-eval' https: https://challenges.cloudflare.com https://ajax.cloudflare.com https://static.cloudflareinsights.com https://www.gstatic.com https://cdn.jsdelivr.net/; worker-src 'self' blob:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; font-src 'self' https: data:; connect-src 'self' https: wss: sse: https://logfire-eu.pydantic.dev https://eu-assets.i.posthog.com https://cloudflareinsights.com https://static.cloudflareinsights.com; media-src 'self' https:; object-src 'none'; frame-src 'self' https://www.google.com https://challenges.cloudflare.com https://r2.psync.club https://c222cfff9699d934ea84197c30bc57b8.r2.cloudflarestorage.com/psync; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests
< cross-origin-opener-policy: same-origin
< referrer-policy: strict-origin-when-cross-origin
< strict-transport-security: max-age=31556926; includeSubDomains
< x-content-type-options: nosniff
< x-frame-options: DENY
< x-xss-protection: 1; mode=block
< permissions-policy: geolocation=(), microphone=(), camera=()
< x-nonce: kZjs18huel_MBpoNmUAixw
< server: granian
< date: Thu, 09 Apr 2026 06:06:25 GMT
<
Content-Type: application/json; charset=utf-8
Content-Length: 2
{}
--graphql
Content-Type: application/json; charset=utf-8
Content-Length: 38
{"payload":{"data":{"check":"Hello"}}}
--graphql
Content-Type: application/json; charset=utf-8
Content-Length: 38
{"payload":{"data":{"check":"Hello"}}}
--graphql
Content-Type: application/json; charset=utf-8
Content-Length: 2
{}
--graphql
Content-Type: application/json; charset=utf-8
Content-Length: 38
{"payload":{"data":{"check":"Hello"}}}
--graphql
Content-Type: application/json; charset=utf-8
Content-Length: 38
On my graphql-sse implementation
Actual Behavior
When testing against strawberry-graphql implementation of multipart subscriptions a websocket upgrade is forced.
This:
GET /graphql HTTP/1.1
accept: multipart/mixed; boundary=graphql; subscriptionSpec=1.0, application/json
content-type: application/json
user-agent: insomnia/11.0.0
Sec-WebSocket-Protocol: graphql-transport-ws
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: xINI1YR3mKwvJdTfeqdpew==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: localhost:8888
When I disabled websockets on the server using granian ASGI using the --no-ws flag
I get: * Parse Error: Expected HTTP/, RTSP/ or ICE/
NOTE: I have an implementation of graphql-sse in this PR
You may install it with
Poetry
strawberry-graphql = { git = "https://github.com/XChikuX/strawberry.git", rev = "copilot/add-graphql-sse-support", extras = ["fastapi"] }
Pip
pip install "strawberry-graphql[fastapi] @ git+https://github.com/XChikuX/strawberry.git@copilot/add-graphql-sse-support"
I see the same exact WS 101 upgrade there as well.
Reproduction Steps
Using granian ASGI or any other compatible server that has the option to turn off websockets.
Attempt a multipart subscription request or graphql-sse request
NOTE please pay attention to Accept and Content-Type headers. Graphql sse should support GET and POST according to spec.
Is there an existing issue for this?
Which sync method do you use?
Additional Information
No response
Insomnia Version
latest
What operating system are you using?
Windows
Operating System Version
Windows 11
Installation method
Auto update
Last Known Working Insomnia version
No response
Expected Behavior
It should be able to work via http1.1 and http2 streams respectively
CURL command works
Actual Behavior
When testing against
strawberry-graphqlimplementation of multipart subscriptions a websocket upgrade is forced.This:
When I disabled websockets on the server using
granianASGI using the--no-wsflagI get:
* Parse Error: Expected HTTP/, RTSP/ or ICE/NOTE: I have an implementation of
graphql-ssein this PRYou may install it with
I see the same exact WS 101 upgrade there as well.
Reproduction Steps
Using
granianASGI or any other compatible server that has the option to turn off websockets.Attempt a multipart subscription request or
graphql-sserequestNOTE please pay attention to
AcceptandContent-Typeheaders. Graphql sse should support GET and POST according to spec.Is there an existing issue for this?
Which sync method do you use?
Additional Information
No response
Insomnia Version
latest
What operating system are you using?
Windows
Operating System Version
Windows 11
Installation method
Auto update
Last Known Working Insomnia version
No response