diff options
author | Jose M. Guisado <jguisado@soleta.eu> | 2023-06-05 18:15:58 +0200 |
---|---|---|
committer | Jose M. Guisado <jguisado@soleta.eu> | 2023-06-13 14:04:54 +0200 |
commit | d2c19ef13d73b92b94a29e2b226d76347d36374e (patch) | |
tree | 8b3a6fe6eb57c0f22f1a18f105b41ced35cfaef8 /src/rest.c | |
parent | 92f83c0385281c1d1e7996fc76c071e782ea6939 (diff) |
core: add X-Sequence header supportv1.2.2
Add non-standard HTTP header "X-Sequence" to the header section of
requests (og_send_request) sent to a connected client.
Define a starting sequence number when creating a new instance of struct
og_client inside og_server_accept_cb. This sequence number is
incremented by one for each outgoing request from ogServer.
This sequence number is checked when receiving a response from a
connected client, if they do not match the connection is dropped.
Use sequence 0 for out-of-band commands (reboot, poweroff, stop). Any
client response with header "X-Sequence: 0" bypasses sequence check.
Diffstat (limited to 'src/rest.c')
-rw-r--r-- | src/rest.c | 22 |
1 files changed, 19 insertions, 3 deletions
@@ -296,6 +296,7 @@ int og_send_request(enum og_rest_method method, enum og_cmd_type type, const char *uri; unsigned int i; int client_sd; + bool has_seq; if (method == OG_METHOD_GET) snprintf(method_str, 5, "GET"); @@ -312,9 +313,17 @@ int og_send_request(enum og_rest_method method, enum og_cmd_type type, JSON_COMPACT); uri = og_cmd_to_uri[type]; - snprintf(buf, OG_MSG_REQUEST_MAXLEN, - "%s /%s HTTP/1.1\r\nContent-Length: %d\r\n%s\r\n\r\n%s", - method_str, uri, content_length, content_type, content); + + switch (type) { + case OG_CMD_POWEROFF: + case OG_CMD_REBOOT: + case OG_CMD_STOP: + has_seq = false; + break; + default: + has_seq = true; + break; + } for (i = 0; i < params->ips_array_len; i++) { cli = og_client_find(params->ips_array[i]); @@ -331,6 +340,13 @@ int og_send_request(enum og_rest_method method, enum og_cmd_type type, continue; } + if (++cli->seq == 0) + cli->seq++; + + snprintf(buf, OG_MSG_REQUEST_MAXLEN, + "%s /%s HTTP/1.1\r\nContent-Length: %d\r\nX-Sequence: %u\r\n%s\r\n\r\n%s", + method_str, uri, content_length, has_seq ? cli->seq : 0, content_type, content); + if (send(client_sd, buf, strlen(buf), 0) < 0) continue; |