I'm trying to implement a C++ server to generate event for a javascript EventSource, I'm building it with cpprest. From the examples I've seen in PHP or Node.js, it looked pretty straight-forward but I must be missing something since I'm getting this in the Firefox console:
Firefox can’t establish a connection to the server at http://localhost:32123/data.
With Postman, I'm correctly receiving "data : test"
so I think I'm missing some continuation, probably have to do something more than just reply to the request, but I didn't find a good explanation on how this is supposed to work yet. If you have some documentation you could point me to, that would be greatly appreciated!
The html page script looks like this:
var source = new EventSource("http://localhost:32123/data");
source.onmessage = function (event) {
document.getElementById("result1").innerHTML += event.data + "<br>";
};
The C++ server reponse :
wResponse.set_status_code(status_codes::OK);
wResponse.headers().add(U("Access-Control-Allow-Origin"), U("*"));
wResponse.set_body(U("data: test"));
iRequest.reply(wResponse);
And the request my server is receiving:
GET /data HTTP/1.1
Accept: text/event-stream
Accept-Encoding: gzip, deflate
Accept-Language: en-us, en;q=0.5
Cache-Control: no-cache
Connection: keep-alive
Host: localhost:32123
Origin: null
Pragma: no-cache
User-Agent: Mozilla/5.0 (Windows NT6.1; Win64, x64; rv:61.0) Gecko/20100101 Firefox/61.0
Found a solution here
Here's a small proof. It's not perfect at all but it's working. Next step is to figure how to store the connections, check that they're alive, etc...EDIT : updating answer after Darren's comment
The proper solution seems to revolve around feeding a
producer_consumer_buffer<char>
bound to abasic_istream<uint8_t>
that is set as thehttp_response
body.Then once the
http_request::reply
is done, the connection will stay opened until the buffer is closed, which could be done withwBuffer.close(std::ios_base::out).wait();
.I'm not 100% sure, but it seems that
wBuffer.sync().wait();
acts like the PHPflush
command would be used in a similar event-providing-server scenario.A working example has been added below.
This is not a complete solution, obviously. There's still more fun ahead with managing the connections and all. Instanciating some
Connection
withmake_unique
and storing them to an container visited on events would probably be my way to go...main.cpp
sse.htm