diff --git a/apps/ts_engine/engine/libtsengine.a.nocleanup b/apps/ts_engine/engine/libtsengine.a.nocleanup index 7a6abf87141b720d077b8eac6616f600cc81fad7..8626daa8bc0f74da5286378b6f3ed34144a005ec 100644 Binary files a/apps/ts_engine/engine/libtsengine.a.nocleanup and b/apps/ts_engine/engine/libtsengine.a.nocleanup differ diff --git a/apps/ts_engine/kii-connector/conn_comm.c b/apps/ts_engine/kii-connector/conn_comm.c index a57044cdc96e305d87ac8bbc6fede5a64d6e4795..3fa33dab67bfe772341f93df51cb0a221a130e3d 100644 --- a/apps/ts_engine/kii-connector/conn_comm.c +++ b/apps/ts_engine/kii-connector/conn_comm.c @@ -443,6 +443,7 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha size_t pos; char *host; struct timeval tv; + struct sockaddr_in *current_srv_ip4addr; DEBUGASSERT(srv_addr && hdr && pdata && pstatus_code && pcontent); @@ -450,28 +451,26 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha http_con_dbg("HTTP:\n%s%s", hdr, pdata); - if (context->url.host) + if (context->url) { - con->srv_ip4addr.sin_addr.s_addr = 0; - host = context->url.host; - port = context->url.port; + host = context->url->host; + port = context->url->port; + current_srv_ip4addr = &context->url->srv_ip4addr; } else { host = con->host; + current_srv_ip4addr = &con->srv_ip4addr; } - if (srv_addr == &con->srv_ip4addr) + /* Fetch server IP address. */ + if (current_srv_ip4addr->sin_addr.s_addr == 0) { - /* Fetch server IP address. */ - if (con->srv_ip4addr.sin_addr.s_addr == 0) - { - con->network_ready = false; - if (get_server_address(&con->srv_ip4addr, host) != OK) - return NETWORK_ERROR; + con->network_ready = false; + if (get_server_address(current_srv_ip4addr, host) != OK) + return NETWORK_ERROR; - con->network_ready = true; - } + con->network_ready = true; } /* Open HTTP connection to server. */ @@ -485,11 +484,11 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha ret = connect(sock, (struct sockaddr *)srv_addr, sizeof(*srv_addr)); if (ret < 0) { - if (srv_addr == &con->srv_ip4addr) + if (srv_addr == current_srv_ip4addr) { /* Could not connect to server. Try updating server IP address on * next try. */ - memset(&con->srv_ip4addr, 0, sizeof(con->srv_ip4addr)); + memset(current_srv_ip4addr, 0, sizeof(*current_srv_ip4addr)); } goto err_close; } @@ -822,8 +821,6 @@ void conn_complete_task_workflow(conn_workflow_context_s *context, int err) } conn_free_pointer((void**)&context->payload); - conn_free_pointer((void**)&context->url.host); - conn_free_pointer((void**)&context->url.api); conn_free_pointer((void**)&context); } } diff --git a/apps/ts_engine/kii-connector/conn_comm.h b/apps/ts_engine/kii-connector/conn_comm.h index e832daac983505251fe976ac79545027a535a3d0..6c3ed612842b9919d000bade45f9d56e608d0017 100644 --- a/apps/ts_engine/kii-connector/conn_comm.h +++ b/apps/ts_engine/kii-connector/conn_comm.h @@ -81,8 +81,9 @@ typedef struct { char *payload; send_cb_t cb; - struct url url; + struct url *url; const void *priv; + struct sockaddr_in srv_ip4addr; } conn_workflow_context_s; typedef int (*conn_request_construct_t) diff --git a/apps/ts_engine/kii-connector/connector.h b/apps/ts_engine/kii-connector/connector.h index b284e580b61a04af3ad7f436e2e15b90864d4ea1..e5115481ec32074bd694a6e0723b2613008ffe1c 100644 --- a/apps/ts_engine/kii-connector/connector.h +++ b/apps/ts_engine/kii-connector/connector.h @@ -43,6 +43,8 @@ #include <stdbool.h> #include <time.h> +#include <netinet/in.h> + #include <apps/thingsee/ts_core.h> #include "engine/value.h" @@ -80,6 +82,8 @@ struct url char *host; uint16_t port; char *api; + struct ts_value http_header; + struct sockaddr_in srv_ip4addr; }; typedef bool @@ -115,11 +119,11 @@ typedef int const void *priv); typedef int -(*send_url_t) (struct ts_payload *payload, send_cb_t cb, const struct url * const url, const void *priv); +(*send_url_t) (struct ts_payload *payload, send_cb_t cb, struct url * const url, const void *priv); typedef int (*multisend_url_t) (struct ts_payload **payload, int number_of_payloads, - send_cb_t cb, const struct url * const url, const void *priv); + send_cb_t cb, struct url * const url, const void *priv); struct ts_connector { diff --git a/apps/ts_engine/meshblu-connector/conn_comm.c b/apps/ts_engine/meshblu-connector/conn_comm.c index 6545913a879df738269e6c39eedc84ca85844ad3..d4a8b972196743d86f4741fa84fb190265a013a2 100644 --- a/apps/ts_engine/meshblu-connector/conn_comm.c +++ b/apps/ts_engine/meshblu-connector/conn_comm.c @@ -443,6 +443,7 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha size_t pos; char *host; struct timeval tv; + struct sockaddr_in *current_srv_ip4addr; DEBUGASSERT(srv_addr && hdr && pdata && pstatus_code && pcontent); @@ -450,28 +451,26 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha http_con_dbg("HTTP:\n%s%s", hdr, pdata); - if (context->url.host) + if (context->url) { - con->srv_ip4addr.sin_addr.s_addr = 0; - host = context->url.host; - port = context->url.port; + host = context->url->host; + port = context->url->port; + current_srv_ip4addr = &context->url->srv_ip4addr; } else { host = con->host; + current_srv_ip4addr = &con->srv_ip4addr; } - if (srv_addr == &con->srv_ip4addr) + /* Fetch server IP address. */ + if (current_srv_ip4addr->sin_addr.s_addr == 0) { - /* Fetch server IP address. */ - if (con->srv_ip4addr.sin_addr.s_addr == 0) - { - con->network_ready = false; - if (get_server_address(&con->srv_ip4addr, host) != OK) - return NETWORK_ERROR; + con->network_ready = false; + if (get_server_address(current_srv_ip4addr, host) != OK) + return NETWORK_ERROR; - con->network_ready = true; - } + con->network_ready = true; } /* Open HTTP connection to server. */ @@ -485,11 +484,11 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha ret = connect(sock, (struct sockaddr *)srv_addr, sizeof(*srv_addr)); if (ret < 0) { - if (srv_addr == &con->srv_ip4addr) + if (srv_addr == current_srv_ip4addr) { /* Could not connect to server. Try updating server IP address on * next try. */ - memset(&con->srv_ip4addr, 0, sizeof(con->srv_ip4addr)); + memset(current_srv_ip4addr, 0, sizeof(*current_srv_ip4addr)); } goto err_close; } @@ -822,8 +821,6 @@ void conn_complete_task_workflow(conn_workflow_context_s *context, int err) } conn_free_pointer((void**)&context->payload); - conn_free_pointer((void**)&context->url.host); - conn_free_pointer((void**)&context->url.api); conn_free_pointer((void**)&context); } } diff --git a/apps/ts_engine/meshblu-connector/conn_comm.h b/apps/ts_engine/meshblu-connector/conn_comm.h index e0cc18325b6519ac9a59900c681d45db8fe8b579..0b456a7f91f08c5a10e3508ff595100a83c856a4 100644 --- a/apps/ts_engine/meshblu-connector/conn_comm.h +++ b/apps/ts_engine/meshblu-connector/conn_comm.h @@ -81,8 +81,9 @@ typedef struct { char *payload; send_cb_t cb; - struct url url; + struct url *url; const void *priv; + struct sockaddr_in srv_ip4addr; } conn_workflow_context_s; typedef int (*conn_request_construct_t) diff --git a/apps/ts_engine/meshblu-connector/connector.h b/apps/ts_engine/meshblu-connector/connector.h index ae5c3ac77a45e5df41a59c0ca841b19a014605bf..d222da0f71fd395838c77671f3b0e60cfa9d29f6 100644 --- a/apps/ts_engine/meshblu-connector/connector.h +++ b/apps/ts_engine/meshblu-connector/connector.h @@ -43,6 +43,8 @@ #include <stdbool.h> #include <time.h> +#include <netinet/in.h> + #include <apps/thingsee/ts_core.h> #include "engine/value.h" @@ -80,6 +82,8 @@ struct url char *host; uint16_t port; char *api; + struct ts_value http_header; + struct sockaddr_in srv_ip4addr; }; typedef bool @@ -115,11 +119,11 @@ typedef int const void *priv); typedef int -(*send_url_t) (struct ts_payload *payload, send_cb_t cb, const struct url * const url, const void *priv); +(*send_url_t) (struct ts_payload *payload, send_cb_t cb, struct url * const url, const void *priv); typedef int (*multisend_url_t) (struct ts_payload **payload, int number_of_payloads, - send_cb_t cb, const struct url * const url, const void *priv); + send_cb_t cb, struct url * const url, const void *priv); struct ts_connector { diff --git a/apps/ts_engine/ts-connector/conn_comm.c b/apps/ts_engine/ts-connector/conn_comm.c index 1f950467ec841bd41f9152c75c57dfc0bee8ed71..ad5d410623afaed7fc2b7bfef83acd757c010918 100644 --- a/apps/ts_engine/ts-connector/conn_comm.c +++ b/apps/ts_engine/ts-connector/conn_comm.c @@ -443,6 +443,7 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha size_t pos; char *host; struct timeval tv; + struct sockaddr_in *current_srv_ip4addr; DEBUGASSERT(srv_addr && hdr && pdata && pstatus_code && pcontent); @@ -450,28 +451,26 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha http_con_dbg("HTTP:\n%s%s", hdr, pdata); - if (context->url.host) + if (context->url) { - con->srv_ip4addr.sin_addr.s_addr = 0; - host = context->url.host; - port = context->url.port; + host = context->url->host; + port = context->url->port; + current_srv_ip4addr = &context->url->srv_ip4addr; } else { host = con->host; + current_srv_ip4addr = &con->srv_ip4addr; } - if (srv_addr == &con->srv_ip4addr) + /* Fetch server IP address. */ + if (current_srv_ip4addr->sin_addr.s_addr == 0) { - /* Fetch server IP address. */ - if (con->srv_ip4addr.sin_addr.s_addr == 0) - { - con->network_ready = false; - if (get_server_address(&con->srv_ip4addr, host) != OK) - return NETWORK_ERROR; + con->network_ready = false; + if (get_server_address(current_srv_ip4addr, host) != OK) + return NETWORK_ERROR; - con->network_ready = true; - } + con->network_ready = true; } /* Open HTTP connection to server. */ @@ -485,11 +484,11 @@ static int execute_http_request(struct sockaddr_in *srv_addr, uint16_t port, cha ret = connect(sock, (struct sockaddr *)srv_addr, sizeof(*srv_addr)); if (ret < 0) { - if (srv_addr == &con->srv_ip4addr) + if (srv_addr == current_srv_ip4addr) { /* Could not connect to server. Try updating server IP address on * next try. */ - memset(&con->srv_ip4addr, 0, sizeof(con->srv_ip4addr)); + memset(current_srv_ip4addr, 0, sizeof(*current_srv_ip4addr)); } goto err_close; } @@ -822,8 +821,6 @@ void conn_complete_task_workflow(conn_workflow_context_s *context, int err) } conn_free_pointer((void**)&context->payload); - conn_free_pointer((void**)&context->url.host); - conn_free_pointer((void**)&context->url.api); conn_free_pointer((void**)&context); } } diff --git a/apps/ts_engine/ts-connector/conn_comm.h b/apps/ts_engine/ts-connector/conn_comm.h index 9b6850ab00079936893e5037b60cd761e3ef078d..812b825df519a8d60bde9d2287a48065d19b565d 100644 --- a/apps/ts_engine/ts-connector/conn_comm.h +++ b/apps/ts_engine/ts-connector/conn_comm.h @@ -81,8 +81,9 @@ typedef struct { char *payload; send_cb_t cb; - struct url url; + struct url *url; const void *priv; + struct sockaddr_in srv_ip4addr; } conn_workflow_context_s; typedef int (*conn_request_construct_t) diff --git a/apps/ts_engine/ts-connector/connector.h b/apps/ts_engine/ts-connector/connector.h index d04774f93ddfbc3e040e387171842d78b32c9fd7..b8ff5702ea671be535370fb84b7c520ebad90d26 100644 --- a/apps/ts_engine/ts-connector/connector.h +++ b/apps/ts_engine/ts-connector/connector.h @@ -43,6 +43,8 @@ #include <stdbool.h> #include <time.h> +#include <netinet/in.h> + #include <apps/thingsee/ts_core.h> #include "engine/value.h" @@ -80,6 +82,8 @@ struct url char *host; uint16_t port; char *api; + struct ts_value http_header; + struct sockaddr_in srv_ip4addr; }; typedef bool @@ -115,11 +119,11 @@ typedef int const void *priv); typedef int -(*send_url_t) (struct ts_payload *payload, send_cb_t cb, const struct url * const url, const void *priv); +(*send_url_t) (struct ts_payload *payload, send_cb_t cb, struct url * const url, const void *priv); typedef int (*multisend_url_t) (struct ts_payload **payload, int number_of_payloads, - send_cb_t cb, const struct url * const url, const void *priv); + send_cb_t cb, struct url * const url, const void *priv); struct ts_connector { diff --git a/apps/ts_engine/ts-connector/ts_connector.c b/apps/ts_engine/ts-connector/ts_connector.c index a62903180a27b00a95578ef6d395da931f102e91..6fe6fca8ed2c1a5a47baae694b743edc2b484ff6 100644 --- a/apps/ts_engine/ts-connector/ts_connector.c +++ b/apps/ts_engine/ts-connector/ts_connector.c @@ -84,9 +84,9 @@ static int tsc_send(struct ts_payload *payload, send_cb_t cb, const void *priv); static int tsc_multisend(struct ts_payload **payload, int number_of_payloads, send_cb_t cb, const void *priv); static int tsc_multisend_url(struct ts_payload **payload, int number_of_payloads, - send_cb_t cb, const struct url * const url, const void *priv); + send_cb_t cb, struct url * const url, const void *priv); static int tsc_send_url(struct ts_payload *payload, send_cb_t cb, - const struct url * const url, + struct url * const url, const void *priv); /**************************************************************************** @@ -125,6 +125,10 @@ static int tsc_post_data_construct(conn_workflow_context_s *context, char **outhdr, char **outdata) { int datalen = 0, hdrlen = 0; + char *header = NULL; + char *tmp; + int i; + int ret; /* Construct HTTP data */ *outdata = context->payload; @@ -133,6 +137,49 @@ static int tsc_post_data_construct(conn_workflow_context_s *context, if (datalen > 0) { /* Construct HTTP header */ + + if (context->url) + { + if (context->url->http_header.valuearray.number_of_items > 0) + { + for (i = 0; i < context->url->http_header.valuearray.number_of_items; i++) + { + if (context->url->http_header.valuearray.items[i].valuetype != VALUESTRING) + { + con_dbg("Invalid valuetype=%d\n", context->url->http_header.valuearray.items[i].valuetype); + free(header); + return ERROR; + } + tmp = header ? header : strdup(""); + + ret = asprintf(&header, "%s%s\r\n", tmp, context->url->http_header.valuearray.items[i].valuestring); + free(tmp); + if (ret < 0) + { + con_dbg("asprintf failed\n"); + return ERROR; + } + } + } + else + { + header = strdup(""); + if (!header) + { + con_dbg("strdup failed\n"); + return ERROR; + } + } + } + else /* default ts backend token authentication */ + { + ret = asprintf(&header, "Authorization: Bearer %s\r\n", ts_context.cloud_params.device_auth_token); + if (ret < 0) + { + return ERROR; + } + } + hdrlen = asprintf(outhdr, "POST /%s%s HTTP/1.1\r\n" "connectorId: %d\r\n" @@ -141,21 +188,23 @@ static int tsc_post_data_construct(conn_workflow_context_s *context, "User-Agent: %s\r\n" "Host: %s\r\n" "Accept: */*\r\n" - "Authorization: Bearer %s\r\n" + "%s" /* auth */ "Connection: close\r\n" "Content-Length: %d\r\n" "Content-Type: application/json\r\n" "\r\n", - (context->url.host ? (context->url.api ? context->url.api : "") : ts_context.cloud_params.api), - (context->url.host ? "" : "/events"), + (context->url ? (context->url->api ? context->url->api : "") : ts_context.cloud_params.api), + (context->url ? "" : "/events"), ts_context.cloud_params.connector_id, ts_context.cloud_params.connector_name, ts_context.cloud_params.device_auth_uuid, HTTP_USER_AGENT, - (context->url.host ? context->url.host : ts_context.con.host), - ts_context.cloud_params.device_auth_token, + (context->url ? context->url->host : ts_context.con.host), + header, strlen(*outdata) ); + + free(header); } if (datalen >= 0 && hdrlen >= 0) con_dbg("SENDINGDATA:\n%s%s\n", *outhdr, *outdata); @@ -368,7 +417,7 @@ static int tsc_uninit(void) } static conn_workflow_context_s *tsc_create_workflow_context(struct ts_payload **payload, int number_of_payloads, - send_cb_t cb, const struct url * const url, const void *priv) + send_cb_t cb, struct url * const url, const void *priv) { cJSON *root, *pload, *engine, *senses; conn_workflow_context_s *context = NULL; @@ -446,9 +495,7 @@ static conn_workflow_context_s *tsc_create_workflow_context(struct ts_payload ** context->cb = cb; if (url) { - context->url.host = strdup(url->host); - context->url.port = url->port; - context->url.api = strdup(url->api); + context->url = url; } context->priv = priv; } @@ -460,7 +507,7 @@ static conn_workflow_context_s *tsc_create_workflow_context(struct ts_payload ** } static int tsc_multisend_url(struct ts_payload **payload, int number_of_payloads, - send_cb_t cb, const struct url * const url, const void *priv) + send_cb_t cb, struct url * const url, const void *priv) { int ret = OK; struct conn_network_task_s *send_task = NULL; @@ -501,7 +548,7 @@ static int tsc_multisend_url(struct ts_payload **payload, int number_of_payloads } static int tsc_send_url(struct ts_payload *payload, send_cb_t cb, - const struct url * const url, + struct url * const url, const void *priv) { return tsc_multisend_url(&payload, 1, cb, url, priv);