void get_evt_links(rf_link_t *links, int32 type, int32 reg, const int8 *fmt, ...) { va_list args; int32 port; int8 ip_addr[WRAP_DB_MAX_VALUE_LEN] = {0}; memdb_integer nid = 0; int32 mask, zone_reg = 0; int8 fmt_hdr[256] = {0}; int8 format[2048] = {0}; int8 prefix[MAX_URL] = {0}; rmm_cfg_get_rest_prefix(prefix, MAX_URL); if (libutils_get_ip((int8 *)ip_addr) < 0) { memset(ip_addr, 0, WRAP_DB_MAX_VALUE_LEN); strncpy_safe(ip_addr, "x", sizeof(ip_addr), 1); } port = rmm_cfg_get_port(RESTD_PORT); if (port == 0) { HTTPD_ERR("Failed to call rmm_cfg_get_restd_port\n"); exit(-1); } snprintf(fmt_hdr, sizeof(fmt_hdr), RF_EVENT_URL_FMT_HDR, ip_addr, port); snprintf(format, sizeof(format), "%s%s%s", fmt_hdr, fmt, prefix); va_start(args, fmt); vsprintf(links->self, format, args); va_end(args); nid = libwrap_get_uniq_node_by_type(type); libwrap_get_listener_links(reg, nid, links); }
int32 evt_listener_init(evt_listener_t *listener, int32 mask, int32 listener_idx, const int8 *fmt, ...) { listener_t *header = NULL; int8 format[256] = {0}; listener_t *tmp; int8 prefix[PREFIX_LEN] = {0}; json_t *evt_type_item = NULL; int32 rs = 0; int32 count = 0; va_list args; rs = libwrap_get_evt_listeners_count(mask, &count); if (rs != 0 || listener_idx > count) { HTTPD_ERR("invalid listener index \n"); return -1; } snprintf_s_s(listener->copy_right, sizeof(listener->copy_right), "%s", RF_COPY_RIGHT); rs = rmm_cfg_get_rest_prefix(prefix, PREFIX_LEN); if (rs != 0) { HTTPD_ERR("get rest prefix fail\n"); return -1; } snprintf_s_ssss(format, sizeof(format), "%s%s%s%s", prefix, (char *)fmt, RF_EVENT_ODATA_CONTEXT_STR, RF_EVENT_LISTENER_MEMBER_STR); va_start(args, fmt); vsnprintf(listener->odata_context, CONTEXT_LEN, format, args); va_end(args); evt_type_item = json_array(); if (evt_type_item == NULL) { HTTPD_ERR("json array alloc fail\n"); return -1; } snprintf_s_ssssi(listener->odata_id, sizeof(listener->odata_id), "%s%s%s%s/%d", prefix , (char *)fmt , RF_EVENT_SERVICE_STR , RF_EVENT_SUBSCRIBE_STR , listener_idx); snprintf_s_s(listener->odata_type, sizeof(listener->odata_type), "%s", RF_EVENT_ODATA_TYPE_DEST); snprintf_s_i(listener->id, sizeof(listener->id), "%d", listener_idx); rs = libwrap_get_evt_listener(mask, listener, listener_idx); if (rs != 0) { HTTPD_ERR("get listeners fail\n"); return -1; } // snprintf(listener->context, sizeof(listener->context), "%s", RF_EVENT_CONTEXT_STR); // snprintf(listener->protocol, sizeof(listener->protocol), "%s", RF_EVENT_PROTOCOL_STR); return 0; }
int32 evt_listeners_init(evt_listeners_t *listeners, int32 mask, const int8 * fmt, ...) { json_t *result = NULL; json_t *jitem = NULL; json_t *evt_type_item = NULL; int32 i = 0; int8 evt_type[128]; listener_t *tmp; int8 format[256] = {0}; int8 prefix[PREFIX_LEN] = {0}; int8 buff[256] = {0}; int32 count = 0; int32 rs = 0; va_list args; snprintf_s_s(listeners->copy_right, sizeof(listeners->copy_right), "%s", RF_COPY_RIGHT); rs = rmm_cfg_get_rest_prefix(prefix, PREFIX_LEN); if (rs != 0) { HTTPD_ERR("get rest prefix fail\n"); return -1; } snprintf_s_ssss(format, sizeof(format), "%s%s%s%s", prefix, (char *)fmt, RF_EVENT_ODATA_CONTEXT_STR, RF_EVENT_EVT_MEMBER_STR); va_start(args, fmt); vsnprintf(listeners->odata_context, CONTEXT_LEN, format, args); va_end(args); snprintf_s_s(listeners->odata_type, sizeof(listeners->odata_type), "%s", RF_EVENT_ODATA_TYPE_DEST_COLL); snprintf_s_s(listeners->name, sizeof(listeners->name), "%s", RF_EVENT_LISTENERS_NAME); rs = libwrap_get_evt_listeners_count(mask, &count); if (rs != 0) { HTTPD_ERR("get listener count fail\n"); return -1; } listeners->num = count; for (i = 0; i < count; i++) { snprintf_s_ssssi(listeners->url[i], sizeof(listeners->url[i]), "%s%s%s%s/%d", prefix, (char *)fmt, RF_EVENT_SERVICE_STR, RF_EVENT_SUBSCRIBE_STR, (i + 1)); } return 0; }
static int32 get_evt_links(rf_link_t *links, const int8 *fmt, ...) { va_list args; int32 port; int8 ip_addr[WRAP_DB_MAX_VALUE_LEN] = {0}; memdb_integer nid = 0; int8 format[256] = {0}; int8 prefix[PREFIX_LEN] = {0}; rmm_cfg_get_rest_prefix(prefix, PREFIX_LEN); port = rmm_cfg_get_port(RESTD_PORT); if (port == 0) { HTTPD_ERR("Failed to call rmm_cfg_get_restd_port\n"); return -1; } snprintf_s_sss(format, sizeof(format), "%s%s%s", (char *)prefix, (char *)fmt, RF_EVENT_SERVICE_STR); va_start(args, fmt); vsnprintf(links->odata_id, sizeof(links->odata_id), format, args); va_end(args); memset(format, 0, sizeof(format)); snprintf_s_sss(format, sizeof(format), "%s%s%s", (char *)prefix, (char *)fmt, RF_EVENT_ODATA_CONTEXT_STR); va_start(args, fmt); vsnprintf(links->odata_context, CONTEXT_LEN, format, args); va_end(args); memset(format, 0, sizeof(format)); snprintf_s_ssss(format, sizeof(format), "%s%s%s%s", (char *)prefix, (char *)fmt, RF_EVENT_SERVICE_STR, RF_EVENT_SUBSCRIBE_STR); va_start(args, fmt); vsnprintf(links->subscriptions, sizeof(links->subscriptions), format, args); va_end(args); return 0; }
void *http_process(void *args) { int32 fd; struct http_request *req; int8 *cp = NULL; int8 *line = NULL; int8 *method = NULL; int8 *url = NULL; int8 *protocol = NULL; struct timeval timo; int32 optval = 1; int32 rc, rc_r, rc_s; int32 r = 0; if (NULL == args) return NULL; req = (struct http_request *)args; fd = req->fd; req->buff = malloc(BUFFSIZ); req->buff_size = BUFFSIZ; if (NULL == req->buff) { HTTPD_ERR("get_request_line malloc %d fail\n", BUFFSIZ); free(args); return NULL; } memset(req->buff, 0, BUFFSIZ); rc = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)); if (rc < 0) HTTPD_ERR("setsockopt error rc=%d errno=%d %s\n", rc, errno, strerror(errno)); timo.tv_sec = HTTPD_TIMO; timo.tv_usec = 0; rc_r = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timo, sizeof(timo)); rc_s = setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timo, sizeof(timo)); if (rc_r < 0 || rc_s < 0) HTTPD_ERR("setsockopt error fd=%d rc=%d rc_r=%d rc_s=%d errno=%d %s\n", fd, rc, rc_r, rc_s, errno, strerror(errno)); /* GET / HTTP/1.1 */ method = get_request_line(req); if (method == NULL) goto close_task; url = parse_reqline(fd, method); if (url == NULL) goto close_task; protocol = parse_reqline(fd, url); if (protocol == NULL) goto close_task; req->method = http_method(method); if (req->method == M_OPTIONS) { send_error(fd, 204, "No Content", NULL, "Method OPTIONS."); goto close_task; } if (req->method == M_UNKNOWN) { send_error(fd, 400, "Bad Request", NULL, "Method Not Support."); goto close_task; } decode_url(req, url); HTTPD_INFO("method[%s] protocol[%s] url[%s] path[%s] query[%s]!\n", method, protocol, url, req->path, req->query ? : ""); while ((line = get_request_line(req)) != NULL) { if (line[0] == '\0') break; if (strncasecmp(line, "Upgrade:", 8) == 0) { cp = &line[8]; cp += strspn(cp, " \t"); if (strncasecmp(cp, "websocket", 9) == 0) req->is_websocket = 1; } else if (strncasecmp(line, "Connection:", 11) == 0) { cp = &line[11]; cp += strspn(cp, " \t"); /* Firefox: [Connection: keep-alive, Upgrade] */ if (strcasestr(cp, "Upgrade") != NULL) req->is_connection_upgrade = 1; } else if (strncasecmp(line, "Sec-WebSocket-Key:", 18) == 0) { cp = &line[18]; cp += strspn(cp, " \t"); req->sec_websocket_key = cp; } else if (strncasecmp(line, "Origin:", 7) == 0) { cp = &line[7]; cp += strspn(cp, " \t"); req->origin = cp; } else if (strncasecmp(line, "Sec-WebSocket-Version:", 22) == 0) { cp = &line[22]; cp += strspn(cp, " \t"); req->sec_websocket_version = atoi(cp); } else if (strncasecmp(line, "Content-Length:", 15) == 0) { cp = &line[15]; cp += strspn(cp, " \t"); req->content_length = atol(cp); if ((BUFFSIZ < req->content_length + MAX_HEADER_LEN) && (req->buff_size != req->content_length + MAX_HEADER_LEN) + 1) { re_alloc_buff(req); memset(req->buff + BUFFSIZ, 0, req->buff_size - BUFFSIZ); } } else if (strncasecmp(line, "Content-Type:", 13) == 0) { cp = &line[13]; cp += strspn(cp, " \t"); req->content_type = cp; } else if (strncasecmp(line, "Host:", 5) == 0) { cp = &line[5]; cp += strspn(cp, " \t"); req->host = cp; } } HTTPD_INFO("Left %d bytes HTTP data with Content-Length: %ld req->sz[%d] req->pos[%d]\n", req->sz - req->pos, req->content_length, req->sz, req->pos); if (line == NULL || req->path[0] != '/') send_error(fd, 400, "Bad Request", NULL, "Bad Request!"); if ((0 != req->content_length) && (req->sz != req->hd_sz + req->content_length)) { while ((r = http_read(req->fd, req->buff + req->sz, req->buff_size - req->sz)) > 0) { req->sz += r; if (req->sz == req->hd_sz + req->content_length) break; } } if (req->is_websocket) ws_process(req); else { uint32 i = 0; int8 *file = NULL; int8 *path = req->path; int8 *pTmp = path; int8 prefix[PREFIX_LEN] = {0}; int8 new_link[MAX_URL + 8] = {0}; rmm_cfg_get_rest_prefix(prefix, PREFIX_LEN); /*snprintf(new_link, (MAX_URL + 8), "%s%s", prefix, "/rack");*/ snprintf_s_s(new_link, (MAX_URL + 8), "%s", prefix); /*TODO: move to correct place */ get_json_pointer(req); /* remove redundant '/' */ for (; *(path+i) != '\0'; i++) { if ((*(path+i) == '/') && (*(path+i+1) == '/')) continue; *pTmp++ = *(path+i); } *pTmp = '\0'; if ((path[1] == '\0') || (strncasecmp(path, new_link, strnlen_s(new_link, sizeof(new_link)-1)) == 0)) file = NULL; else file = path; if (file != NULL) send_file(req->fd, file); else rest_process(req); } close_task: close(fd); if (NULL != req->buff) { free(req->buff); req->buff = NULL; } HTTPD_INFO("\nrest_req_thread[%lld] exit, fd[%d], errno:%d %s\n", (uint64)(req->tid_rest_req), fd, errno, strerror(errno)); free(args); pthread_detach(pthread_self()); return NULL; }