mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-19 13:09:39 -07:00
Parse Discovery Response Headers
This commit is contained in:
parent
3cd9d9a84f
commit
84f91c2e21
6 changed files with 104 additions and 12 deletions
|
@ -30,6 +30,7 @@
|
||||||
int RunDiscoveryCmd(const QString &host)
|
int RunDiscoveryCmd(const QString &host)
|
||||||
{
|
{
|
||||||
ChiakiLog log;
|
ChiakiLog log;
|
||||||
|
chiaki_log_init(&log, CHIAKI_LOG_ALL, chiaki_log_cb_print, NULL);
|
||||||
|
|
||||||
ChiakiDiscovery discovery;
|
ChiakiDiscovery discovery;
|
||||||
ChiakiErrorCode err = chiaki_discovery_init(&discovery, &log, AF_INET); // TODO: IPv6
|
ChiakiErrorCode err = chiaki_discovery_init(&discovery, &log, AF_INET); // TODO: IPv6
|
||||||
|
|
|
@ -44,6 +44,24 @@ typedef struct chiaki_discovery_packet_t
|
||||||
char *protocol_version;
|
char *protocol_version;
|
||||||
} ChiakiDiscoveryPacket;
|
} ChiakiDiscoveryPacket;
|
||||||
|
|
||||||
|
typedef enum chiaki_discovery_host_state_t
|
||||||
|
{
|
||||||
|
CHIAKI_DISCOVERY_HOST_STATE_UNKNOWN,
|
||||||
|
CHIAKI_DISCOVERY_HOST_STATE_READY,
|
||||||
|
CHIAKI_DISCOVERY_HOST_STATE_STANDBY
|
||||||
|
} ChiakiDiscoveryHostState;
|
||||||
|
|
||||||
|
typedef struct chiaki_discovery_srch_response_t
|
||||||
|
{
|
||||||
|
ChiakiDiscoveryHostState state;
|
||||||
|
const char *system_version;
|
||||||
|
const char *device_discovery_protocol_version;
|
||||||
|
uint16_t host_request_port;
|
||||||
|
const char *host_name;
|
||||||
|
const char *host_type;
|
||||||
|
const char *host_id;
|
||||||
|
} ChiakiDiscoverySrchResponse;
|
||||||
|
|
||||||
CHIAKI_EXPORT int chiaki_discovery_packet_fmt(char *buf, size_t buf_size, ChiakiDiscoveryPacket *packet);
|
CHIAKI_EXPORT int chiaki_discovery_packet_fmt(char *buf, size_t buf_size, ChiakiDiscoveryPacket *packet);
|
||||||
|
|
||||||
typedef struct chiaki_discovery_t
|
typedef struct chiaki_discovery_t
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <chiaki/discovery.h>
|
#include <chiaki/discovery.h>
|
||||||
|
#include <chiaki/http.h>
|
||||||
#include <chiaki/log.h>
|
#include <chiaki/log.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -38,6 +39,49 @@ CHIAKI_EXPORT int chiaki_discovery_packet_fmt(char *buf, size_t buf_size, Chiaki
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_srch_response_parse(ChiakiDiscoverySrchResponse *response, char *buf, size_t buf_size)
|
||||||
|
{
|
||||||
|
ChiakiHttpResponse http_response;
|
||||||
|
ChiakiErrorCode err = chiaki_http_response_parse(&http_response, buf, buf_size);
|
||||||
|
if(err != CHIAKI_ERR_SUCCESS)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
memset(response, 0, sizeof(*response));
|
||||||
|
|
||||||
|
switch(http_response.code)
|
||||||
|
{
|
||||||
|
case 200:
|
||||||
|
response->state = CHIAKI_DISCOVERY_HOST_STATE_READY;
|
||||||
|
break;
|
||||||
|
case 620:
|
||||||
|
response->state = CHIAKI_DISCOVERY_HOST_STATE_STANDBY;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
response->state = CHIAKI_DISCOVERY_HOST_STATE_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(ChiakiHttpHeader *header = http_response.headers; header; header=header->next)
|
||||||
|
{
|
||||||
|
printf("%s: %s\n", header->key, header->value);
|
||||||
|
if(strcmp(header->key, "system-version") == 0)
|
||||||
|
response->system_version = header->value;
|
||||||
|
else if(strcmp(header->key, "device-discovery-protocol-version") == 0)
|
||||||
|
response->device_discovery_protocol_version = header->value;
|
||||||
|
else if(strcmp(header->key, "host-request-port") == 0)
|
||||||
|
response->host_request_port = (uint16_t)strtoul(header->value, NULL, 0);
|
||||||
|
else if(strcmp(header->key, "host-name") == 0)
|
||||||
|
response->host_name = header->value;
|
||||||
|
else if(strcmp(header->key, "host-type") == 0)
|
||||||
|
response->host_type = header->value;
|
||||||
|
else if(strcmp(header->key, "host-id") == 0)
|
||||||
|
response->host_id = header->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
chiaki_http_response_fini(&http_response);
|
||||||
|
return CHIAKI_ERR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_init(ChiakiDiscovery *discovery, ChiakiLog *log, sa_family_t family)
|
CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_init(ChiakiDiscovery *discovery, ChiakiLog *log, sa_family_t family)
|
||||||
{
|
{
|
||||||
if(family != AF_INET && family != AF_INET6)
|
if(family != AF_INET && family != AF_INET6)
|
||||||
|
@ -177,7 +221,13 @@ static void *discovery_thread_func(void *user)
|
||||||
|
|
||||||
buf[n] = '\00';
|
buf[n] = '\00';
|
||||||
|
|
||||||
CHIAKI_LOGD(discovery->log, "Discovery received:\n%s", buf);
|
CHIAKI_LOGV(discovery->log, "Discovery received:\n%s", buf);
|
||||||
|
chiaki_log_hexdump_raw(discovery->log, CHIAKI_LOG_VERBOSE, (const uint8_t *)buf, n);
|
||||||
|
|
||||||
|
ChiakiDiscoverySrchResponse response;
|
||||||
|
err = chiaki_discovery_srch_response_parse(&response, buf, n);
|
||||||
|
if(err != CHIAKI_ERR_SUCCESS)
|
||||||
|
CHIAKI_LOGI(discovery->log, "Discovery Response invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -35,7 +35,7 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_service_init(ChiakiDiscoveryServi
|
||||||
|
|
||||||
ChiakiErrorCode err = chiaki_discovery_init(&service->discovery, log, service->options.send_addr->sa_family);
|
ChiakiErrorCode err = chiaki_discovery_init(&service->discovery, log, service->options.send_addr->sa_family);
|
||||||
if(err != CHIAKI_ERR_SUCCESS)
|
if(err != CHIAKI_ERR_SUCCESS)
|
||||||
goto error_servers;
|
goto error_send_addr;
|
||||||
|
|
||||||
err = chiaki_bool_pred_cond_init(&service->stop_cond);
|
err = chiaki_bool_pred_cond_init(&service->stop_cond);
|
||||||
if(err != CHIAKI_ERR_SUCCESS)
|
if(err != CHIAKI_ERR_SUCCESS)
|
||||||
|
|
|
@ -53,8 +53,9 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_http_header_parse(ChiakiHttpHeader **header
|
||||||
FAIL(CHIAKI_ERR_INVALID_DATA);
|
FAIL(CHIAKI_ERR_INVALID_DATA);
|
||||||
*buf = '\0';
|
*buf = '\0';
|
||||||
buf++;
|
buf++;
|
||||||
if(buf == end || *buf != ' ')
|
if(buf == end)
|
||||||
FAIL(CHIAKI_ERR_INVALID_DATA);
|
FAIL(CHIAKI_ERR_INVALID_DATA);
|
||||||
|
if(*buf == ' ')
|
||||||
buf++;
|
buf++;
|
||||||
if(buf == end)
|
if(buf == end)
|
||||||
FAIL(CHIAKI_ERR_INVALID_DATA);
|
FAIL(CHIAKI_ERR_INVALID_DATA);
|
||||||
|
@ -113,12 +114,15 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_http_response_parse(ChiakiHttpResponse *res
|
||||||
buf += http_version_size;
|
buf += http_version_size;
|
||||||
buf_size -= http_version_size;
|
buf_size -= http_version_size;
|
||||||
|
|
||||||
char *line_end = memchr(buf, '\r', buf_size);
|
char *line_end = memchr(buf, '\n', buf_size);
|
||||||
if(!line_end)
|
if(!line_end)
|
||||||
return CHIAKI_ERR_INVALID_DATA;
|
return CHIAKI_ERR_INVALID_DATA;
|
||||||
size_t line_length = (line_end - buf) + 2;
|
size_t line_length = (line_end - buf) + 1;
|
||||||
if(buf_size <= line_length || line_end[1] != '\n')
|
if(buf_size <= line_length)
|
||||||
return CHIAKI_ERR_INVALID_DATA;
|
return CHIAKI_ERR_INVALID_DATA;
|
||||||
|
if(line_length > 1 && *(line_end - 1) == '\r')
|
||||||
|
*(line_end - 1) = '\0';
|
||||||
|
else
|
||||||
*line_end = '\0';
|
*line_end = '\0';
|
||||||
|
|
||||||
char *endptr;
|
char *endptr;
|
||||||
|
|
25
test/http.c
25
test/http.c
|
@ -20,15 +20,25 @@
|
||||||
#include <chiaki/http.h>
|
#include <chiaki/http.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
static const char *response =
|
static char * const response_crlf =
|
||||||
"HTTP/1.1 200 OK\r\n"
|
"HTTP/1.1 200 OK\r\n"
|
||||||
"Content-type: text/html, text, plain\r\n"
|
"Content-type: text/html, text, plain\r\n"
|
||||||
"Ultimate Ability: Gamer\r\n"
|
"Ultimate Ability: Gamer\r\n"
|
||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
|
static char * const response_lf =
|
||||||
|
"HTTP/1.1 200 Ok\n"
|
||||||
|
"Content-type: text/html, text, plain\n"
|
||||||
|
"Ultimate Ability:Gamer\n";
|
||||||
|
|
||||||
static void *test_http_response_parse_setup(const MunitParameter params[], void *user)
|
static void *test_http_response_parse_setup(const MunitParameter params[], void *user)
|
||||||
{
|
{
|
||||||
return strdup(response);
|
const char *response = NULL;
|
||||||
|
if(strcmp(params[0].value, "crlf") == 0)
|
||||||
|
response = response_crlf;
|
||||||
|
else if(strcmp(params[0].value, "lf") == 0)
|
||||||
|
response = response_lf;
|
||||||
|
return response ? strdup(response) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_http_response_parse_teardown(void *fixture)
|
static void test_http_response_parse_teardown(void *fixture)
|
||||||
|
@ -61,6 +71,15 @@ static MunitResult test_http_response_parse(const MunitParameter params[], void
|
||||||
return MUNIT_OK;
|
return MUNIT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *response_params[] = {
|
||||||
|
"crlf", "lf", NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static MunitParameterEnum params[] = {
|
||||||
|
{ "line ending", response_params },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
MunitTest tests_http[] = {
|
MunitTest tests_http[] = {
|
||||||
{
|
{
|
||||||
"/response_parse",
|
"/response_parse",
|
||||||
|
@ -68,7 +87,7 @@ MunitTest tests_http[] = {
|
||||||
test_http_response_parse_setup,
|
test_http_response_parse_setup,
|
||||||
test_http_response_parse_teardown,
|
test_http_response_parse_teardown,
|
||||||
MUNIT_TEST_OPTION_NONE,
|
MUNIT_TEST_OPTION_NONE,
|
||||||
NULL
|
params
|
||||||
},
|
},
|
||||||
{ NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }
|
{ NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }
|
||||||
};
|
};
|
Loading…
Add table
Add a link
Reference in a new issue