Skip to content

[Feature Request πŸ’«] Support Graphql SSE and Multipart requests.Β #9791

@XChikuX

Description

@XChikuX

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?

  • Git sync.
  • Insomnia Cloud sync.
  • Local only

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    B-bugBug: general classificationS-unverifiedStatus: Unverified by maintainer

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions