mirror of
https://git.rwth-aachen.de/acs/public/villas/node/
synced 2025-03-30 00:00:11 +01:00
web: only issue a single call to lws_write() per LWS_*_WRITABLE callback
This commit is contained in:
parent
daf72cd0bd
commit
70faba9fd9
3 changed files with 43 additions and 30 deletions
|
@ -39,6 +39,9 @@ namespace sessions {
|
||||||
|
|
||||||
class Http : public Wsi {
|
class Http : public Wsi {
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool headersSent;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Http(Api *s, lws *w);
|
Http(Api *s, lws *w);
|
||||||
virtual ~Http() { };
|
virtual ~Http() { };
|
||||||
|
|
|
@ -35,7 +35,8 @@ using namespace villas::node;
|
||||||
using namespace villas::node::api::sessions;
|
using namespace villas::node::api::sessions;
|
||||||
|
|
||||||
Http::Http(Api *a, lws *w) :
|
Http::Http(Api *a, lws *w) :
|
||||||
Wsi(a, w)
|
Wsi(a, w),
|
||||||
|
headersSent(false)
|
||||||
{
|
{
|
||||||
int hdrlen, options = -1, version;
|
int hdrlen, options = -1, version;
|
||||||
char *uri;
|
char *uri;
|
||||||
|
@ -86,37 +87,47 @@ int Http::complete()
|
||||||
int Http::write()
|
int Http::write()
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
json_t *resp;
|
|
||||||
|
|
||||||
resp = response.queue.pop();
|
if (!headersSent) {
|
||||||
|
std::stringstream headers;
|
||||||
|
|
||||||
response.buffer.clear();
|
json_t *resp = response.queue.pop();
|
||||||
response.buffer.encode(resp);
|
|
||||||
|
|
||||||
json_decref(resp);
|
response.buffer.clear();
|
||||||
|
response.buffer.encode(resp);
|
||||||
|
|
||||||
std::stringstream headers;
|
json_decref(resp);
|
||||||
|
|
||||||
headers << "HTTP/1.1 200 OK\r\n"
|
headers << "HTTP/1.1 200 OK\r\n"
|
||||||
<< "Content-type: application/json\r\n"
|
<< "Content-type: application/json\r\n"
|
||||||
<< "User-agent: " USER_AGENT "\r\n"
|
<< "User-agent: " USER_AGENT "\r\n"
|
||||||
<< "Connection: close\r\n"
|
<< "Connection: close\r\n"
|
||||||
<< "Content-Length: " << response.buffer.size() << "\r\n"
|
<< "Content-Length: " << response.buffer.size() << "\r\n"
|
||||||
<< "Access-Control-Allow-Origin: *\r\n"
|
<< "Access-Control-Allow-Origin: *\r\n"
|
||||||
<< "Access-Control-Allow-Methods: GET, POST, OPTIONS\r\n"
|
<< "Access-Control-Allow-Methods: GET, POST, OPTIONS\r\n"
|
||||||
<< "Access-Control-Allow-Headers: Content-Type\r\n"
|
<< "Access-Control-Allow-Headers: Content-Type\r\n"
|
||||||
<< "Access-Control-Max-Age: 86400\r\n"
|
<< "Access-Control-Max-Age: 86400\r\n"
|
||||||
<< "\r\n";
|
<< "\r\n";
|
||||||
|
|
||||||
ret = lws_write(wsi, (unsigned char *) headers.str().data(), headers.str().size(), LWS_WRITE_HTTP_HEADERS);
|
ret = lws_write(wsi, (unsigned char *) headers.str().data(), headers.str().size(), LWS_WRITE_HTTP_HEADERS);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = lws_write(wsi, (unsigned char *) response.buffer.data(), response.buffer.size(), LWS_WRITE_HTTP);
|
/* No wait, until we can send the body */
|
||||||
if (ret < 0)
|
headersSent = true;
|
||||||
return -1;
|
lws_callback_on_writable(wsi);
|
||||||
|
|
||||||
return 1;
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = lws_write(wsi, (unsigned char *) response.buffer.data(), response.buffer.size(), LWS_WRITE_HTTP_FINAL);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
headersSent = false;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Http::getName()
|
std::string Http::getName()
|
||||||
|
@ -175,9 +186,10 @@ int api_http_protocol_cb(struct lws *wsi, enum lws_callback_reasons reason, void
|
||||||
|
|
||||||
case LWS_CALLBACK_HTTP_WRITEABLE:
|
case LWS_CALLBACK_HTTP_WRITEABLE:
|
||||||
ret = s->write();
|
ret = s->write();
|
||||||
|
if (ret) {
|
||||||
if (lws_http_transaction_completed(wsi))
|
if (lws_http_transaction_completed(wsi))
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -85,9 +85,7 @@ int WebSocket::write()
|
||||||
|
|
||||||
json_decref(resp);
|
json_decref(resp);
|
||||||
|
|
||||||
lws_write(wsi, (unsigned char *) response.buffer.data() + LWS_PRE, response.buffer.size() - LWS_PRE, LWS_WRITE_TEXT);
|
return lws_write(wsi, (unsigned char *) response.buffer.data() + LWS_PRE, response.buffer.size() - LWS_PRE, LWS_WRITE_TEXT);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string WebSocket::getName()
|
std::string WebSocket::getName()
|
||||||
|
|
Loading…
Add table
Reference in a new issue