コード例 #1
0
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);
}
コード例 #2
0
ファイル: general_handler.c プロジェクト: intelrsasw/intelRSD
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;
}
コード例 #3
0
ファイル: general_handler.c プロジェクト: intelrsasw/intelRSD
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;
}
コード例 #4
0
ファイル: general_handler.c プロジェクト: intelrsasw/intelRSD
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;
}
コード例 #5
0
ファイル: http.c プロジェクト: intelrsasw/intelRSD
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;
}