Aiden Bell
Aiden Bell

Reputation: 28386

HTML SSE request body

When using the EventSource API in JavaScript, is there any way to send a request body along with the HTTP request initiating the polling?

I need to send a large blob of JSON to the server at the SSE request so that the server can calculate what events to send to the client. It seems daft to do web-sockets when I don't need it or do weird things with cookies or multiple requests.

I worry i'll run in to length limits on query strings if I bundle the data in to that, which may be likely.

Thanks in advance!

Upvotes: 10

Views: 7778

Answers (1)

Jason S
Jason S

Reputation: 13779

The initial SSE request is a fairly ordinary HTTP GET request, so:

  • Given that SSE is only supported by modern browsers, the maximum URL length should not be assumed to be the old 255 bytes "for old browsers". Most modern browsers allow longer URLs, with IE providing the lowest cap of ~2k. (granted EventSource is not supported on IE anyway, but there's an XHR polyfill...) However, if by large blob you mean several kilobytes, the URL is not reliable. Proxies could also potentially cause problems.

See: What is the maximum length of a URL in different browsers?, Is there any limitation on Url's length in Android's WebView.loadUrl method?, http://www.benzado.com/blog/post/28/iphone-openurl-limit

  • You could also store information in one or more cookies which will be sent along with the GET request. This could include a cookie you set on the request for the page that uses SSE, or a cookie you set in javascript (prior to creating your EventSource object). The max size for a cookie is specified as being at least 4096 bytes (which is the whole cookie, so somewhat less for your actual data portion) with at least 20 cookies per hostname supported. Emperical testing appears to bear this out: http://browsercookielimits.x64.me/ Worst case you could possibly chunk the information in multiple cookies.

  • Larger than that, and I think you need an initial request that uploads the JSON and sends back an ID that is referenced by the SSE request.

  • It is technically possible, but (strongly) discouraged, to send a body with a GET request. See HTTP GET with request body. The EventSource constructor only takes a URL and so does not directly support this.

  • As dandavis pointed out, you can compress your JSON.

Upvotes: 7

Related Questions