亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? http.c

?? 網絡攝像頭的webserver
?? C
字號:
#include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <libxml/parser.h>#include "config.h"#include "http.h"#define MODULE_THREAD#include "module.h"#include "xmlhelp.h"#include "socket.h"#include "grab.h"#include "filter.h"#include "jpeg.h"#include "mod_handle.h"#include "log.h"#include "image.h"#define MODNAME "http"struct vpathcfg {	int fps;	char *auth;	int raw:1;};static int http_load_conf(struct http_ctx *, xmlNodePtr);static void *http_conn(void *);static int http_path_ismatch(xmlNodePtr, char *);static void http_err(struct peer *, char *, char *);static void http_fill_vpathcfg(xmlNodePtr, struct vpathcfg *);static void unbase64(unsigned char *, unsigned char *);char *name = MODNAME;char *version = VERSION;char *deps[] ={	"jpeg_comp",	"socket",	NULL};intinit(struct module_ctx *mod_ctx){	int ret;	struct http_ctx *http_ctx;		if (!mod_ctx->node)		return -1;		http_ctx = malloc(sizeof(*http_ctx));	ret = http_load_conf(http_ctx, mod_ctx->node);	if (ret)	{		free(http_ctx);		return -1;	}		http_ctx->listen_fd = socket_listen(http_ctx->port, 0);	if (http_ctx->listen_fd == -1)	{		log_log(MODNAME, "Failed to open listen socket: %s\n", strerror(errno));		free(http_ctx);		return -1;	}		mod_ctx->custom = http_ctx;		return 0;}void *thread(void *mod_ctx){	int ret;	struct http_ctx *http_ctx;	struct http_peer *http_peer;		http_ctx = ((struct module_ctx *) mod_ctx)->custom;		for (;;)	{		http_peer = malloc(sizeof(*http_peer));		http_peer->mod_ctx = mod_ctx;		ret = socket_accept_thread(http_ctx->listen_fd, &http_peer->peer, http_conn, http_peer);		if (ret)		{			free(http_peer);			log_log(MODNAME, "accept() error: %s\n", strerror(errno));			sleep(1);			continue;		}	}		return NULL;}staticinthttp_load_conf(struct http_ctx *ctx, xmlNodePtr node){	memset(ctx, 0, sizeof(*ctx));		ctx->listen_fd = -1;	ctx->port = 9192;		for (node = node->xml_children; node; node = node->next)	{		if (xml_isnode(node, "port"))			ctx->port = xml_atoi(node, ctx->port);	}		if (ctx->port <= 0 || ctx->port > 0xffff)	{		log_log(MODNAME, "Invalid port %u\n", ctx->port);		return -1;	}		return 0;}staticvoid *http_conn(void *peer_p){	struct http_peer http_peer;	char buf[1024];	int ret;	char *url;	char *p;	char *httpver;	xmlNodePtr subnode;	struct image img;	struct grab_ctx idx;	struct jpegbuf jpegbuf;	int count;	char *error;	struct vpathcfg vpathcfg;	char *contenttype;	char addheaders[256];	char authorization[256];		memcpy(&http_peer, peer_p, sizeof(http_peer));	free(peer_p);		log_log(MODNAME, "New connection from %s:%i\n",		socket_ip(&http_peer.peer), socket_port(&http_peer.peer));		count = 0;		do {		ret = socket_readline(&http_peer.peer, buf, sizeof(buf), 20000);		if (ret)		{readlineerr:			switch (ret)			{			case -1:				log_log(MODNAME, "Read error on connection from %s:%i (%s)\n",					socket_ip(&http_peer.peer), socket_port(&http_peer.peer), strerror(errno));				break;			case -2:				log_log(MODNAME, "Timeout on connection from %s:%i\n",					socket_ip(&http_peer.peer), socket_port(&http_peer.peer));				break;			case -3:				if (count)					break;				log_log(MODNAME, "EOF on connection from %s:%i before full HTTP request was received\n",					socket_ip(&http_peer.peer), socket_port(&http_peer.peer));				break;			}			goto closenout;		}				if (strncmp("GET ", buf, 4))		{			log_log(MODNAME, "Invalid HTTP request (not GET) from %s:%i\n",				socket_ip(&http_peer.peer), socket_port(&http_peer.peer));			goto closenout;		}				url = buf + 4;				p = strchr(url, ' ');		if (!p)			httpver = NULL;		else		{			*p++ = '\0';			if (strncmp("HTTP/", p, 5))				httpver = NULL;			else			{				httpver = p + 5;				if (!*httpver)					httpver = NULL;			}		}				if (!*url || !httpver)		{			log_log(MODNAME, "Invalid HTTP request or version from %s:%i\n",				socket_ip(&http_peer.peer), socket_port(&http_peer.peer));			goto closenout;		}				p = strchr(url, '?');		if (p)			*p = '\0';				log_log(MODNAME, "Request for %s from %s:%i\n",			url, socket_ip(&http_peer.peer), socket_port(&http_peer.peer));			error = NULL;		for (subnode = http_peer.mod_ctx->node->xml_children; subnode; subnode = subnode->next)		{			if (!xml_isnode(subnode, "vpath"))				continue;			if (!http_path_ismatch(subnode, url))				continue;			goto match;		}		error = "404 Not found";		match:		*authorization = '\0';		for (;;)		{			ret = socket_readline(&http_peer.peer, buf, sizeof(buf), 20000);			if (ret)				goto readlineerr;			if (!*buf)				break;			if (!strncasecmp(buf, "authorization:", 14)) {				p = buf + 14;				while (*p == ' ')					p++;				if (strncasecmp(p, "basic ", 6))					continue;				p += 6;				while (*p == ' ')					p++;				if (strlen(p) >= sizeof(authorization)) {					log_log(MODNAME, "Warning: very long Authorization: header received\n");					continue;				}				unbase64(authorization, p);			}		}				if (error) {			http_err(&http_peer.peer, error, NULL);			goto closenout;		}				http_fill_vpathcfg(subnode, &vpathcfg);		if (vpathcfg.auth) {			if (strcmp(authorization, vpathcfg.auth)) {				http_err(&http_peer.peer, "401 Unauthorized", "WWW-Authenticate: Basic realm=\"camsource\"\r\n");				goto closenout;			}		}		if (vpathcfg.fps > 0)		{			snprintf(buf, sizeof(buf) - 1,				"HTTP/1.0 200 OK\r\n"				"Server: " PACKAGE_STRING "\r\n"				"Connection: close\r\n"		/* <-- does that make sense? */				"Pragma: no-cache\r\n"				"Cache-Control: no-cache\r\n"				"Content-Type: multipart/x-mixed-replace;boundary=Juigt9G7bb7sfdgsdZGIDFsjhn\r\n"				"\r\n"				"--Juigt9G7bb7sfdgsdZGIDFsjhn\r\n");			socket_write(&http_peer.peer, buf, strlen(buf), 20000);		}				memset(&idx, 0, sizeof(idx));		do		{			filter_get_image(&img, &idx, http_peer.mod_ctx->node, subnode, NULL);			if (!vpathcfg.raw) {				jpeg_compress(&jpegbuf, &img, subnode);				contenttype = "image/jpeg";				addheaders[0] = '\0';			}			else {				jpegbuf.buf = img.buf;				jpegbuf.bufsize = img.bufsize;				contenttype = "application/octet-stream";				snprintf(addheaders, sizeof(addheaders) - 1,					"X-Image-Width: %i\r\n"					"X-Image-Height: %i\r\n",					img.x, img.y);			}						if (!vpathcfg.fps)				snprintf(buf, sizeof(buf) - 1,					"HTTP/1.0 200 OK\r\n"					"Server: " PACKAGE_STRING "\r\n"					"Content-Length: %i\r\n"					"Connection: Keep-alive\r\n"					"Pragma: no-cache\r\n"					"Cache-Control: no-cache\r\n"					"Content-Type: %s\r\n"					"%s"					"\r\n",					jpegbuf.bufsize, contenttype,					addheaders);			else				snprintf(buf, sizeof(buf) - 1,					"Content-Length: %i\r\n"					"Content-Type: %s\r\n"					"%s"					"\r\n",					jpegbuf.bufsize, contenttype,					addheaders);			ret = socket_write(&http_peer.peer, buf, strlen(buf), 20000);			if (ret > 0)				ret = socket_write(&http_peer.peer, jpegbuf.buf, jpegbuf.bufsize, 20000);				count++;				if (vpathcfg.fps && ret > 0)			{				ret = socket_write(&http_peer.peer, "\r\n--Juigt9G7bb7sfdgsdZGIDFsjhn\r\n", 32, 20000);				usleep(1000000 / vpathcfg.fps);			}						image_destroy(&img);			if (!vpathcfg.raw)				free(jpegbuf.buf);		}		while (vpathcfg.fps > 0 && ret > 0);	}	while (ret > 0);closenout:	log_log(MODNAME, "Closing connection from %s:%i, %i frame(s) served\n",		socket_ip(&http_peer.peer), socket_port(&http_peer.peer),		count);	socket_close(&http_peer.peer);	return NULL;}staticinthttp_path_ismatch(xmlNodePtr node, char *path){	int ret = 0;	char *active;		active = xml_attrval(node, "active");	if (active && strcmp(active, "yes"))		return 0;		for (node = node->xml_children; node; node = node->next)	{		if (xml_isnode(node, "disable")) {			if (!strcmp("yes", xml_getcontent_def(node, "")))				return 0;		}				if (!xml_isnode(node, "path"))			continue;		if (!strcmp(path, xml_getcontent_def(node, "")))			ret = 1;	}		return ret;}staticvoidhttp_err(struct peer *peer, char *err, char *addheaders){	char buf[1024];		snprintf(buf, sizeof(buf) - 1,		"HTTP/1.0 %s\r\n"		"Server: " PACKAGE_STRING "\r\n"		"Content-Length: %i\r\n"		"Connection: close\r\n"		"Pragma: no-cache\r\n"		"Cache-Control: no-cache\r\n"		"Content-Type: text/html\r\n"		"%s"		"\r\n"		"<html><body>%s</body></html>\r\n",		err, strlen(err) + 28, addheaders ? : "", err);	socket_write(peer, buf, strlen(buf), 20000);}staticvoidhttp_fill_vpathcfg(xmlNodePtr node, struct vpathcfg *cfg){	memset(cfg, 0, sizeof(*cfg));		for (node = node->xml_children; node; node = node->next)	{		if (xml_isnode(node, "fps"))			cfg->fps = xml_atoi(node, 0);		else if (xml_isnode(node, "raw") && !strcmp("yes", xml_getcontent_def(node, "")))			cfg->raw = 1;		else if (xml_isnode(node, "auth"))			cfg->auth = xml_getcontent(node);	}}static voidunbase64(unsigned char *dst, unsigned char *src){	/* yuck */	static unsigned char lookup[256] = {		/*   0 */ 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,		/*  16 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,		/*  32 */ 0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,63,		/*  48 */ 52,53,54,55,56,57,58,59,60,61,0,0,0,255,0,0,		/*  64 */ 0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,		/*  80 */ 15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,		/*  96 */ 0,26,27,28,30,30,31,32,33,34,35,36,37,38,39,40,		/* 128 */ 41,42,43,44,45,46,47,48,49,50,51,0,0,0,0,0,	};		int extract[4];		while (*src) {		if ((extract[0] = lookup[src[0]]) == 255 || (extract[1] = lookup[src[1]]) == 255)			break;				*dst++ = (extract[0] << 2) | (extract[1] >> 4);				if ((extract[2] = lookup[src[2]]) == 255)			break;					*dst++ = (extract[1] << 4) | (extract[2] >> 2);		if ((extract[3] = lookup[src[3]]) == 255)			break;					*dst++ = (extract[2] << 6) | extract[3];				src += 4;	}		*dst = '\0';}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av一区二区三区| 久久精品国产免费| 色激情天天射综合网| 亚洲女人的天堂| 欧美日韩一区中文字幕| 亚洲成人av中文| www国产成人| 成人在线综合网| 亚洲精品一卡二卡| 91精品免费在线| 狠狠色狠狠色合久久伊人| 国产视频一区二区在线观看| 成人精品高清在线| 亚洲一区二区欧美日韩| 日韩欧美成人一区| 成人国产精品免费| 午夜精品一区二区三区免费视频 | 亚洲大片精品永久免费| 欧美日韩精品系列| 国产老妇另类xxxxx| 亚洲天堂久久久久久久| 欧美一区二区视频在线观看2022| 国产精品中文字幕日韩精品 | 国产精品久久久久aaaa樱花| 日本乱人伦aⅴ精品| 琪琪久久久久日韩精品| 国产精品久线在线观看| 欧美美女直播网站| 成人综合在线视频| 日韩国产欧美一区二区三区| 日本一区二区三区在线观看| 欧美视频三区在线播放| 成人在线综合网| 秋霞午夜鲁丝一区二区老狼| 欧美国产综合一区二区| 欧美一区二区三区播放老司机| 国产99一区视频免费| 日韩经典一区二区| 亚洲色图欧洲色图| 久久伊人蜜桃av一区二区| 在线一区二区视频| 丁香激情综合五月| 蜜桃免费网站一区二区三区| 亚洲免费视频中文字幕| 久久久久久久久久久久久久久99| 欧洲视频一区二区| 不卡高清视频专区| 久久成人综合网| 婷婷开心激情综合| 伊人一区二区三区| 中文字幕一区av| 久久久久久久久久久久久女国产乱| 欧美日韩视频在线第一区| 成人ar影院免费观看视频| 麻豆精品国产91久久久久久| 亚洲国产精品精华液网站| 国产精品久久久久精k8| 久久免费美女视频| 精品少妇一区二区三区日产乱码 | 中文字幕日本乱码精品影院| 亚洲精品一区二区三区福利| 337p亚洲精品色噜噜狠狠| 91黄色免费看| 成人av网站在线| 国产91精品一区二区麻豆网站 | 成人午夜电影网站| 激情欧美日韩一区二区| 久久国产精品一区二区| 美脚の诱脚舐め脚责91| 免费欧美高清视频| 日韩不卡一区二区三区| 丝瓜av网站精品一区二区| 亚洲一区二区3| 亚洲伊人色欲综合网| 亚洲人午夜精品天堂一二香蕉| 国产精品女主播在线观看| 国产精品美女久久久久久2018 | 亚洲色欲色欲www在线观看| 国产女同性恋一区二区| 国产欧美日产一区| 国产精品久久毛片a| 《视频一区视频二区| 国产精品久久久久久久久免费相片| 国产精品网站在线播放| 国产精品无码永久免费888| 国产精品视频你懂的| 国产精品久久久久影院色老大| 国产精品国产a级| 一区二区三区四区在线播放| 一区二区三区日本| 五月综合激情网| 裸体歌舞表演一区二区| 国产剧情一区二区| 成人av在线播放网站| 色综合激情久久| 91麻豆精品国产91久久久资源速度 | 欧美老肥妇做.爰bbww视频| 欧美日韩精品欧美日韩精品一综合| 欧美日本高清视频在线观看| 欧美一级理论片| 久久午夜免费电影| 国产精品蜜臀av| 亚洲精品videosex极品| 日韩av不卡一区二区| 精品一区二区三区香蕉蜜桃| 成人黄色av电影| 欧美美女黄视频| 久久网站热最新地址| 国产精品你懂的在线欣赏| 亚洲国产精品尤物yw在线观看| 免费在线成人网| 不卡的av电影| 日韩一级黄色片| 国产精品国产精品国产专区不蜜| 五月天激情综合| 国产成人av一区| 欧美日韩精品一区视频| 国产欧美一区二区精品久导航 | 91麻豆精品国产91久久久| 欧美精品一区二区三区在线播放| 综合婷婷亚洲小说| 六月丁香婷婷色狠狠久久| av亚洲精华国产精华| 欧美色精品在线视频| 国产亚洲视频系列| 日日夜夜精品视频免费| 成人sese在线| 日韩精品一区二区三区在线观看| 综合久久国产九一剧情麻豆| 精品一区二区三区免费播放| 欧美视频一区二| 国产精品成人网| 激情欧美日韩一区二区| 欧美日韩成人一区二区| 亚洲欧洲99久久| 国产精品亚洲一区二区三区妖精 | 日本一不卡视频| 色欧美88888久久久久久影院| 久久一日本道色综合| 亚洲成av人片观看| 97久久超碰精品国产| 久久久国产精品麻豆| 蜜桃视频一区二区三区| 欧美日韩极品在线观看一区| 亚洲女厕所小便bbb| 成人免费观看视频| 久久久噜噜噜久久人人看 | 免费在线视频一区| 在线国产亚洲欧美| 亚洲日本电影在线| 不卡一区中文字幕| 欧美国产日韩a欧美在线观看| 国产在线精品视频| 精品久久久久一区二区国产| 五月综合激情婷婷六月色窝| 欧美三级电影网站| 亚洲一区二区五区| 在线观看91精品国产入口| 亚洲欧美日韩一区| 91小视频在线| 亚洲欧美视频在线观看| 99re在线精品| 亚洲美女免费视频| 91免费国产在线| 中文字幕字幕中文在线中不卡视频| 91亚洲午夜精品久久久久久| 成人午夜av影视| 国产精品国产三级国产普通话三级| 成人美女视频在线观看| 国产日产精品1区| 99久久婷婷国产综合精品 | 一区二区三区国产精华| 色婷婷综合久久久| 亚洲精品网站在线观看| 色菇凉天天综合网| 亚洲国产一区在线观看| 欧美日高清视频| 日韩精品91亚洲二区在线观看| 欧美一区二区在线不卡| 蜜臀久久99精品久久久久久9 | 精品三级在线观看| 国产一区 二区| 亚洲欧洲av在线| 欧美日韩中文字幕一区二区| 日韩在线观看一区二区| 欧美一区二区三区四区高清| 久久精品国产精品亚洲红杏| 国产亚洲一区二区在线观看| 成人av在线播放网址| 亚洲一二三专区| 欧美成人bangbros| 成人小视频免费观看| 亚洲日本丝袜连裤袜办公室| 欧美日韩卡一卡二| 久久爱www久久做| 亚洲欧美日韩在线| 91精品国产免费久久综合| 久久国产精品色| 亚洲欧美日韩综合aⅴ视频| 777午夜精品视频在线播放|