diff --git a/enc_server/dap_enc_http.c b/enc_server/dap_enc_http.c index 58116090b3db649397541354019f7238e0c59b38..5b5f1b4113cf7c87af7e9b98791d60fbb23ab583 100644 --- a/enc_server/dap_enc_http.c +++ b/enc_server/dap_enc_http.c @@ -107,23 +107,30 @@ void enc_http_add_proc(struct dap_http * sh, const char * url) dap_http_simple_proc_add(sh,url,40000,enc_http_proc); } -enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *cl_st) +/** + * @brief enc_http_request_decode + * @param a_http_simple + * @return + */ +enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *a_http_simple) { - dap_enc_key_t * key= dap_enc_ks_find_http(cl_st->http); - if(key){ + dap_enc_key_t * l_key= dap_enc_ks_find_http(a_http_simple->http); + if(l_key){ enc_http_delegate_t * dg = DAP_NEW_Z(enc_http_delegate_t); - dg->key=key; - dg->http=cl_st->http; + dg->key=l_key; + dg->http=a_http_simple->http; dg->isOk=true; - strncpy(dg->action,cl_st->http->action,sizeof(dg->action)-1); - if(cl_st->http->in_cookie[0]) - dg->cookie=strdup(cl_st->http->in_cookie); + strncpy(dg->action,a_http_simple->http->action,sizeof(dg->action)-1); + if(a_http_simple->http->in_cookie[0]) + dg->cookie=strdup(a_http_simple->http->in_cookie); - if(cl_st->request_size){ - // dg->request=calloc(1,cl_st->request_size+1); - dg->request_size=dap_enc_decode(key, cl_st->request, cl_st->request_size,&dg->request,DAP_ENC_DATA_TYPE_RAW); + if(a_http_simple->request_size){ + size_t l_dg_request_size_max = a_http_simple->request_size; + dg->request= DAP_NEW_SIZE( void , l_dg_request_size_max+1); + dg->request_size=dap_enc_decode(l_key, a_http_simple->request, a_http_simple->request_size,dg->request, + l_dg_request_size_max, DAP_ENC_DATA_TYPE_RAW); dg->request_str[dg->request_size] = 0; log_it(L_DEBUG,"Request after decode '%s'",dg->request_str); // log_it(L_DEBUG,"Request before decode: '%s' after decode '%s'",cl_st->request_str,dg->request_str); @@ -136,25 +143,25 @@ enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *cl_st) else l_enc_type = DAP_ENC_DATA_TYPE_B64; - size_t url_path_size=strlen(cl_st->http->url_path); - if(url_path_size){ - // dg->url_path=calloc(1,url_path_size+1); - dg->url_path_size=dap_enc_decode(key, cl_st->http->url_path,url_path_size,&dg->url_path,l_enc_type); + size_t l_url_path_size_max = strlen(a_http_simple->http->url_path); + if(l_url_path_size_max){ + dg->url_path= DAP_NEW_SIZE(char,l_url_path_size_max+1); + dg->url_path_size=dap_enc_decode(l_key, a_http_simple->http->url_path,l_url_path_size_max,dg->url_path, dg->url_path_size, l_enc_type); dg->url_path[dg->url_path_size] = 0; log_it(L_DEBUG,"URL path after decode '%s'",dg->url_path ); // log_it(L_DEBUG,"URL path before decode: '%s' after decode '%s'",cl_st->http->url_path,dg->url_path ); } - size_t in_query_size=strlen(cl_st->http->in_query_string); + size_t l_in_query_size=strlen(a_http_simple->http->in_query_string); - if(in_query_size){ - // dg->in_query=calloc(1,in_query_size+1); - dg->in_query_size=dap_enc_decode(key, cl_st->http->in_query_string,in_query_size,&dg->in_query,l_enc_type); + if(l_in_query_size){ + dg->in_query= DAP_NEW_SIZE(char, l_in_query_size+1); + dg->in_query_size=dap_enc_decode(l_key, a_http_simple->http->in_query_string,l_in_query_size,dg->in_query,l_in_query_size, l_enc_type); dg->in_query[dg->in_query_size] = 0; log_it(L_DEBUG,"Query string after decode '%s'",dg->in_query); } - dg->response = calloc(1,cl_st->reply_size_max+1); - dg->response_size_max=cl_st->reply_size_max; + dg->response = calloc(1,a_http_simple->reply_size_max+1); + dg->response_size_max=a_http_simple->reply_size_max; return dg; }else{ @@ -163,18 +170,29 @@ enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *cl_st) } } -void enc_http_reply_encode(struct dap_http_simple *cl_st,enc_http_delegate_t * dg) +/** + * @brief enc_http_reply_encode + * @param a_http_simple + * @param a_http_delegate + */ +void enc_http_reply_encode(struct dap_http_simple *a_http_simple,enc_http_delegate_t * a_http_delegate) { - dap_enc_key_t * key = dap_enc_ks_find_http(cl_st->http); + dap_enc_key_t * key = dap_enc_ks_find_http(a_http_simple->http); if( key == NULL ) { log_it(L_ERROR, "Can't find http key."); return; } - if(dg->response){ + if(a_http_delegate->response){ + + if(a_http_simple->reply) + free(a_http_simple->reply); - if(cl_st->reply) - free(cl_st->reply); - cl_st->reply_size = dap_enc_code(dg->key,dg->response,dg->response_size,&cl_st->reply,DAP_ENC_DATA_TYPE_RAW); + size_t l_reply_size_max = a_http_delegate->response_size*2; // TODO make proper size calculations + a_http_simple->reply = DAP_NEW_SIZE(void,l_reply_size_max); + a_http_simple->reply_size = dap_enc_code( a_http_delegate->key, + a_http_delegate->response, a_http_delegate->response_size, + a_http_simple->reply, l_reply_size_max, + DAP_ENC_DATA_TYPE_RAW); } } diff --git a/enc_server/dap_enc_http.h b/enc_server/dap_enc_http.h index f4f2a733df5415c5123d7014d41faabd763fc2c6..9ef627ff5178b14855db1e4f748f91bf7f7bc06c 100644 --- a/enc_server/dap_enc_http.h +++ b/enc_server/dap_enc_http.h @@ -62,19 +62,19 @@ typedef struct enc_http_delegate{ struct dap_http_client *http; } enc_http_delegate_t; -extern int enc_http_init(); -extern void enc_http_deinit(); +int enc_http_init(); +void enc_http_deinit(); -extern size_t enc_http_reply(enc_http_delegate_t * dg, void * data, size_t data_size); -extern size_t enc_http_reply_f(enc_http_delegate_t * dg, const char * data, ...); +size_t enc_http_reply(enc_http_delegate_t * dg, void * data, size_t data_size); +size_t enc_http_reply_f(enc_http_delegate_t * dg, const char * data, ...); -extern enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *cl_st); +enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *a_http_simple); -extern void enc_http_reply_encode(struct dap_http_simple *cl_st,enc_http_delegate_t * dg); +void enc_http_reply_encode(struct dap_http_simple *a_http_simple,enc_http_delegate_t * a_http_delegate); -extern void enc_http_delegate_delete(enc_http_delegate_t * dg); +void enc_http_delegate_delete(enc_http_delegate_t * dg); -extern void enc_http_add_proc(struct dap_http * sh, const char * url); +void enc_http_add_proc(struct dap_http * sh, const char * url); #endif diff --git a/http_server/dap_http_simple.c b/http_server/dap_http_simple.c index 94689481f300f384e39c5655bb7a94fe886651df..cf5db6bc469e8b7cf2025dd47bf7a23234f36ed0 100644 --- a/http_server/dap_http_simple.c +++ b/http_server/dap_http_simple.c @@ -240,18 +240,23 @@ void dap_http_simple_data_write(dap_http_client_t * a_http_client,void * a_arg) (void) a_arg; dap_http_simple_t * cl_st = DAP_HTTP_SIMPLE(a_http_client); - cl_st->reply_sent += dap_client_remote_write(a_http_client->client, - cl_st->reply + cl_st->reply_sent, - a_http_client->out_content_length - cl_st->reply_sent); + if ( cl_st->reply ) { + cl_st->reply_sent += dap_client_remote_write(a_http_client->client, + cl_st->reply + cl_st->reply_sent, + a_http_client->out_content_length - cl_st->reply_sent); + + if(cl_st->reply_sent>=a_http_client->out_content_length) { + log_it(L_INFO, "All the reply (%u) is sent out",a_http_client->out_content_length); + //cl_ht->client->signal_close=cl_ht->keep_alive; + a_http_client->client->signal_close=true; + //dap_client_ready_to_write(cl_ht->client,false); + } - if(cl_st->reply_sent>=a_http_client->out_content_length) { - log_it(L_INFO, "All the reply (%u) is sent out",a_http_client->out_content_length); - //cl_ht->client->signal_close=cl_ht->keep_alive; + free(cl_st->reply); + }else{ a_http_client->client->signal_close=true; - //dap_client_ready_to_write(cl_ht->client,false); + log_it(L_WARNING,"No reply to write, close connection"); } - - free(cl_st->reply); } /** diff --git a/udp_server/dap_udp_client.c b/udp_server/dap_udp_client.c index dfdc939662026c5ba84aefcbbf39382624444dcc..78249b2b33333bedb31ffef2e9fe74d84bade79c 100644 --- a/udp_server/dap_udp_client.c +++ b/udp_server/dap_udp_client.c @@ -89,8 +89,8 @@ dap_client_remote_t * dap_udp_client_create(dap_server_t * sh, ev_io* w_client, */ void dap_udp_client_get_address(dap_client_remote_t *client, unsigned int* host,unsigned short* port){ dap_udp_client_t* udp_client = DAP_UDP_CLIENT(client); - *host = udp_client->host_key >> 32; - *port = udp_client->host_key - (*host<<32); + *host = udp_client->host_key >> 32; + *port = udp_client->host_key - ( *host<<32); } /**