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

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

?? httpserv.c

?? www工具包. 這是W3C官方支持的www支撐庫. 其中提供通用目的的客戶端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
?? C
字號:
/*								    HTTPServ.c**	HTTP SERVER MODULE****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTTPServ.c,v 2.26 1999/02/22 22:10:12 frystyk Exp $****	This module implments the HTTP protocol as a state machine**** History:**	Dec 95 HFN	Written with Christmas in my eyes***//* Library include files */#include "wwwsys.h"#include "WWWUtil.h"#include "WWWCore.h"#include "HTHeader.h"#include "HTMIMERq.h"#include "HTNetMan.h"#include "HTTPUtil.h"#include "HTTPRes.h"#include "HTTPServ.h"					       /* Implements *//* Macros and other defines */#define PUTC(c)		(*me->target->isa->put_character)(me->target, c)#define PUTS(s)		(*me->target->isa->put_string)(me->target, s)#define PUTBLOCK(b, l)	(*me->target->isa->put_block)(me->target, b, l)/* Final states have negative value */typedef enum _HTTPState {    HTTPS_ERROR		= -2,    HTTPS_OK		= -1,    HTTPS_BEGIN		= 0,    HTTPS_NEED_REQUEST,    HTTPS_LOAD_CLIENT} HTTPState;/* This is the context object for the this module */typedef struct _https_info {    HTRequest *	server;				       /* The server request */    HTList *	clients;		          /* List of client requests */    HTTPState	state;			  /* Current State of the connection */    HTNet *	net;} https_info;/* The HTTP Receive Stream */struct _HTStream {    const HTStreamClass *	isa;    HTStream *		  	target;    HTRequest *			request;    https_info *		http;    HTEOLState			state;    HTChunk *			buffer;    BOOL			transparent;};struct _HTInputStream {    const HTInputStreamClass *	isa;};/* ------------------------------------------------------------------------- *//*	ServerCleanup**	-------------**      This function cleans up after the request**      Returns YES on OK, else NO*/PRIVATE int ServerCleanup (HTRequest * req, HTNet * net, int status){    https_info * http = (https_info *) HTNet_context(net);    HTStream * input = HTRequest_inputStream(req);    HTChannel * channel = HTNet_channel(net);    /* Free stream with data TO network */    if (input) {	if (status == HT_INTERRUPTED)	    (*input->isa->abort)(input, NULL);	else	    (*input->isa->_free)(input);	HTRequest_setInputStream(req, NULL);    }    /* Kill all remaining requests */    if (http->clients) {	HTList * cur = http->clients;	HTRequest * pres;	while ((pres = HTList_nextObject(cur)) != NULL)	    HTRequest_kill(pres);	HTList_delete(http->clients);    }    /*    **  Remove the net object and our own context structure for http.    **	Also unregister all pending requests and close the connection    */    HTChannel_setSemaphore(channel, 0);    HTNet_delete(net, HT_IGNORE);    HT_FREE(http);    return YES;}/* ------------------------------------------------------------------------- *//*				REPLY STREAM				     *//* ------------------------------------------------------------------------- *//***	This is our handle to the server reply stream when data is coming**	back from our "client" request. It is responsible for setting up the**	remaining streams in order to produce a complete HTTP output.**	If we have a HTTP 1.x response then forward untouched.*/PRIVATE int MakeReplyPipe (HTStream * me, HTRequest * client){    char * response_line = NULL;    /* Generate the Response line */    {	HTAlertCallback *cbf = HTAlert_find(HT_A_MESSAGE);	if (cbf) {	    HTAlertPar * reply = HTAlert_newReply();	    if ((*cbf)(client, HT_A_MESSAGE, HT_MSG_NULL, NULL,		       HTRequest_error(client), reply))		response_line = HTAlert_replyMessage(reply);	    HTAlert_deleteReply(reply);	}	if (response_line) {	    PUTS(response_line);	    HT_FREE(response_line);	} else {		    PUTS(HTTP_VERSION);	    PUTS(" 500 Internal");	    PUTC(CR);	    PUTC(LF);	}    }    /*    ** We now have to create the rest of the response stream. We see whether    ** there is a data object or not by looking at the Content Type of the    ** client anchor.    */    {	HTParentAnchor * anchor = HTRequest_anchor(client);	HTFormat format = HTAnchor_format(anchor);	me->target = (format == WWW_UNKNOWN) ?	    HTTPResponse_new(client, me->target, YES, HTTP_11) :	    HTMIMERequest_new(client,	        HTTPResponse_new(client,me->target, NO, HTTP_11), YES);    }    return HT_OK;}PRIVATE int HTTPReply_put_block (HTStream * me, const char * b, int l){    if (me->transparent)	return b ? PUTBLOCK(b, l) : HT_OK;    else {	MakeReplyPipe(me, me->request);	me->transparent = YES;	return b ? PUTBLOCK(b, l) : HT_OK;    }}PRIVATE int HTTPReply_put_string (HTStream * me, const char * s){    return HTTPReply_put_block(me, s, strlen(s));}PRIVATE int HTTPReply_put_character (HTStream * me, char c){    return HTTPReply_put_block(me, &c, 1);}PRIVATE int HTTPReply_flush (HTStream * me){    int status = HTTPReply_put_block(me, NULL, 0);    return status==HT_OK ? (*me->target->isa->flush)(me->target) : status;}PRIVATE int HTTPReply_free (HTStream * me){    int status = HTTPReply_put_block(me, NULL, 0);    HTTRACE(STREAM_TRACE, "HTTPReply... Freeing server stream\n");    return status==HT_OK ? (*me->target->isa->_free)(me->target) : status;}PRIVATE int HTTPReply_abort (HTStream * me, HTList * e){    HTTRACE(STREAM_TRACE, "HTTPReply... ABORTING\n");    if (me->target) (*me->target->isa->abort)(me->target, e);    HT_FREE(me);    return HT_ERROR;}/*	HTTPReply Stream**	-----------------*/PRIVATE const HTStreamClass HTTPReplyClass ={		    "HTTPReply",    HTTPReply_flush,    HTTPReply_free,    HTTPReply_abort,    HTTPReply_put_character,    HTTPReply_put_string,    HTTPReply_put_block};PRIVATE HTStream * HTTPReply_new (HTRequest * request, https_info * http,				  HTStream * target){    HTStream * me;    if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)        HT_OUTOFMEM("HTTPReply_new");    me->isa = &HTTPReplyClass;    me->request = request;    me->http = http;    me->target = target;    HTTRACE(STREAM_TRACE, "HTTP Reply.. Stream %p created\n" _ me);    return me;}/* ------------------------------------------------------------------------- *//*				RECEIVE STREAM				     *//* ------------------------------------------------------------------------- *//***	Scan the request line for METHOD, URI and VERSION**	Returns:	HT_OK		if 1.x request and OK**			HT_LOADED     	if 0.9 request and OK**			HT_ERROR	if invalid request line*/PRIVATE int ParseRequest (HTStream * me){    HTRequest * client = HTList_firstObject(me->http->clients);    char * line = HTChunk_data(me->buffer);    char * method_str = HTNextField(&line);    char * request_uri = HTNextField(&line);    char * version_str = HTNextField(&line);    HTMethod method;    /* Check if method is allowed */    if (!method_str || (method = HTMethod_enum(method_str))==METHOD_INVALID) {	HTRequest_addError(client, ERR_FATAL, NO, HTERR_NOT_ALLOWED,			   NULL, 0, "ParseRequest");	return HT_ERROR;    }    HTRequest_setMethod(client, method);    /* Find an anchor for the request URI */    if (request_uri) {	char * uri = HTParse(request_uri, "file:", PARSE_ALL);	HTRequest_setAnchor(client, HTAnchor_findAddress(uri));	HT_FREE(uri);    } else {	HTRequest_addError(client, ERR_FATAL, NO, HTERR_BAD_REQUEST,			   NULL, 0, "ParseRequest");	return HT_ERROR;    }    /* Get ready to get the rest of the request */    if (version_str) {	me->target = HTStreamStack(WWW_MIME_HEAD,				   HTRequest_debugFormat(client),				   HTRequest_debugStream(client),				   client, NO);	return HT_OK;    } else {	HTRequest_addError(client, ERR_FATAL, NO, HTERR_BAD_VERSION,			   NULL, 0, "ParseRequest");	return HT_ERROR;    }}/***	Searches for HTTP Request Line before going into transparent mode*/PRIVATE int HTTPReceive_put_block (HTStream * me, const char * b, int l){    if (!me->transparent) {	const char *p=b;	while (l>0 && *p!=CR && *p!=LF) l--, p++;	HTChunk_putb(me->buffer, b, p-b);	if (*p==CR || *p==LF) {	    int status = ParseRequest(me);	    HTChunk_clear(me->buffer);	    if (status != HT_OK) return status;	    me->transparent = YES;	    b=p;	}    }    if (l > 0) {	int status = PUTBLOCK(b, l);	if (status == HT_LOADED) me->transparent = NO;	return status;    }    return HT_OK;}PRIVATE int HTTPReceive_put_string (HTStream * me, const char * s){    return HTTPReceive_put_block(me, s, (int) strlen(s));}PRIVATE int HTTPReceive_put_character (HTStream * me, char c){    return HTTPReceive_put_block(me, &c, 1);}PRIVATE int HTTPReceive_flush (HTStream * me){    return (*me->target->isa->flush)(me->target);}PRIVATE int HTTPReceive_free (HTStream * me){    int status = HT_OK;    if (me->target) {	if ((status = (*me->target->isa->_free)(me->target)) == HT_WOULD_BLOCK)	    return HT_WOULD_BLOCK;    }    HTChunk_delete(me->buffer);    HT_FREE(me);    return status;}PRIVATE int HTTPReceive_abort (HTStream * me, HTList * e){    if (me->target) (*me->target->isa->abort)(me->target, e);    HTChunk_delete(me->buffer);    HT_FREE(me);    HTTRACE(PROT_TRACE, "HTTPReceive. ABORTING...\n");    return HT_ERROR;}/*	HTTPReceive Stream**	-----------------*/PRIVATE const HTStreamClass HTTPReceiveClass ={		    "HTTPReceive",    HTTPReceive_flush,    HTTPReceive_free,    HTTPReceive_abort,    HTTPReceive_put_character,    HTTPReceive_put_string,    HTTPReceive_put_block};PRIVATE HTStream * HTTPReceive_new (HTRequest * request, https_info * http){    HTStream * me;    if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)        HT_OUTOFMEM("HTTPReceive_new");    me->isa = &HTTPReceiveClass;    me->request = request;    me->http = http;    me->state = EOL_BEGIN;        me->buffer = HTChunk_new(128);		 /* Sufficiant for most URLs */    HTTRACE(STREAM_TRACE, "HTTP Request Stream %p created\n" _ me);    return me;}/* ------------------------------------------------------------------------- *//*	HTServHTTP**	----------**	Serv Document using HTTP.**	returns	HT_ERROR or HT_OK*/PRIVATE int ServEvent (SOCKET soc, void * pVoid, HTEventType type);PUBLIC int HTServHTTP (SOCKET soc, HTRequest * request){    HTNet * net = HTRequest_net(request);    https_info * http;			    /* Specific protocol information */    /*    ** Initiate a new https object and bind to request object    ** This is actually state HTTPS_BEGIN, but it can't be in the state    ** machine as we need the object first (chicken and egg problem).    */    HTTRACE(PROT_TRACE, "Serv HTTP... on socket %d\n" _ soc);    if ((http = (https_info *) HT_CALLOC(1, sizeof(https_info))) == NULL)	HT_OUTOFMEM("HTServHTTP");    http->server = request;    http->state = HTTPS_BEGIN;    http->clients = HTList_new();    HTNet_setContext(net, http);    /*     ** Create the stream pipe FROM the channel to the server request.    */    net->readStream = HTTPReceive_new(request, http);    HTRequest_setOutputConnected(request, YES);    http->state = HTTPS_BEGIN;    HTNet_setEventCallback(net, ServEvent);    HTNet_setEventParam(net, http);  /* callbacks get http* */    return ServEvent(soc, http, HTEvent_BEGIN);		/* get it started - ops is ignored */}PRIVATE int ServEvent (SOCKET soc, void * pVoid, HTEventType type){    https_info * http = (https_info *)pVoid;    int status = HT_ERROR;    HTNet * net = http->net;    HTRequest * request = HTNet_request(net);    if (!net || !request) {	HTTRACE(PROT_TRACE, "Serv HTTP... Invalid argument\n");	return HT_ERROR;    }    if (type == HTEvent_CLOSE) {			      /* Interrupted */	ServerCleanup(request, net, HT_INTERRUPTED);	return HT_OK;    } else	http = (https_info *) HTNet_context(net);	/* Get existing copy */     /* Now jump into the machine. We know the state from the previous run */    while (1) {	switch (http->state) {	case HTTPS_BEGIN:	{	    /*	    ** Create the request to handle the request and inherit the old	    ** context	    */	    HTRequest * client = HTRequest_new();	    void * context = HTRequest_context(request);	    if (context) HTRequest_setContext(client, context);	    HTRequest_setOutputConnected(client, NO);	    HTRequest_setGnHd(client, HTRequest_gnHd(request));	    HTRequest_setRsHd(client, HTRequest_rsHd(request));	    HTRequest_setEnHd(client, HTRequest_enHd(request));	    HTList_addObject(http->clients, client);	    	    /*	    ** Create the HTTP output stream for generating the reply	    ** FROM the client request to the channel	    */	    {		HTOutputStream * output = HTNet_getOutput(net, NULL, 0);		HTStream * app = HTTPReply_new(client, http,(HTStream*)output);		HTRequest_setOutputStream(client, app);		HTRequest_setOutputFormat(client, WWW_SOURCE);	    }	    http->state = HTTPS_NEED_REQUEST;	}	break;	case HTTPS_NEED_REQUEST:	    if (type == HTEvent_READ || type == HTEvent_BEGIN) {		status = HTHost_read(net->host, net);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_CLOSED)		    http->state = HTTPS_OK;		else if (status==HT_LOADED || status==HT_PAUSE) {		    http->state = HTTPS_LOAD_CLIENT;		} else		    http->state = HTTPS_ERROR;	    } else		http->state = HTTPS_ERROR;	    break;	case HTTPS_LOAD_CLIENT:	{	    HTRequest * client = HTList_removeFirstObject(http->clients);	    HTLoad(client, NO);	    http->state = HTTPS_BEGIN;	    break;	}	case HTTPS_OK:	    ServerCleanup(request, net, HT_IGNORE);	    return HT_OK;	case HTTPS_ERROR:	    ServerCleanup(request, net, HT_ERROR);	    return HT_OK;	}    }}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av在线影院| 亚洲欧美日韩一区| 欧美丰满高潮xxxx喷水动漫 | 欧美亚洲动漫精品| 色综合一区二区| 97se狠狠狠综合亚洲狠狠| 成人黄色免费短视频| 成人爽a毛片一区二区免费| 成人免费高清视频在线观看| 国产传媒久久文化传媒| 成人午夜免费av| 99久久99精品久久久久久| 色综合天天综合给合国产| 91丨九色丨尤物| 精品视频资源站| 欧美精品三级日韩久久| 欧美一区二区私人影院日本| 欧美一区永久视频免费观看| 欧美xxxxx牲另类人与| 久久久99免费| 日韩一区有码在线| 亚洲va在线va天堂| 日韩精品欧美精品| 精品无码三级在线观看视频 | 成人高清伦理免费影院在线观看| 成人黄色av电影| 欧美三区在线视频| 日韩欧美亚洲另类制服综合在线| 久久久久久电影| 亚洲激情图片qvod| 久久国产精品第一页| voyeur盗摄精品| 91麻豆精品久久久久蜜臀| 精品成人一区二区三区| 亚洲欧美二区三区| 久草中文综合在线| 欧洲中文字幕精品| 久久久夜色精品亚洲| 亚洲欧洲中文日韩久久av乱码| 婷婷国产在线综合| 不卡区在线中文字幕| 欧美一区二区三区四区视频| 中文字幕不卡在线播放| 三级在线观看一区二区| 91丝袜呻吟高潮美腿白嫩在线观看| 这里只有精品99re| 日韩美女视频一区| 国产精品亚洲第一| 日韩视频在线你懂得| 亚洲美女在线一区| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 久久嫩草精品久久久精品| 亚洲综合av网| 99精品视频在线免费观看| 91精品国产全国免费观看| 亚洲色图在线看| 国产91色综合久久免费分享| 91精品国产综合久久久久久漫画| 亚洲视频网在线直播| 国产河南妇女毛片精品久久久| 日韩欧美的一区二区| 亚洲国产视频一区二区| 色呦呦国产精品| 亚洲国产精品欧美一二99| 99久久久国产精品免费蜜臀| 国产婷婷精品av在线| 韩国一区二区在线观看| 日韩一区二区影院| 日韩成人av影视| 欧美一区二区三区小说| 午夜精品视频一区| 欧美老女人第四色| 日韩精品成人一区二区在线| 欧美老年两性高潮| 蜜桃av噜噜一区二区三区小说| 欧美日韩国产高清一区二区三区 | 色婷婷国产精品综合在线观看| 国产性色一区二区| 国产91精品久久久久久久网曝门 | 日韩av成人高清| 欧美夫妻性生活| 午夜精品久久一牛影视| 在线成人高清不卡| 青青草成人在线观看| 欧美sm美女调教| 日本高清视频一区二区| 亚洲综合免费观看高清完整版 | 日韩高清一区在线| 欧美一区二区免费视频| 韩国毛片一区二区三区| 国产日本一区二区| 色域天天综合网| 亚洲成av人片在线观看无码| 欧美一区二区三区四区高清| 国产在线国偷精品免费看| 中文字幕av一区二区三区高| 91麻豆福利精品推荐| 亚洲电影一级片| 久久久久亚洲蜜桃| 色老头久久综合| 蜜桃精品视频在线| 国产精品午夜在线| 欧美日韩久久久一区| 捆绑紧缚一区二区三区视频| 国产精品视频一二三区| 欧美猛男gaygay网站| 国产一区二区三区黄视频 | 欧美日产在线观看| 国产成人免费在线观看| 一区二区三区日韩精品| 欧美成人精品1314www| 99麻豆久久久国产精品免费优播| 亚洲成人精品影院| 国产欧美日本一区视频| 欧美影视一区二区三区| 国产毛片一区二区| 亚洲成人在线观看视频| 欧美激情一区二区三区蜜桃视频| 欧美色电影在线| 成人v精品蜜桃久久一区| 免费观看久久久4p| 亚洲欧美色一区| 久久久久久久久一| 91精品国模一区二区三区| av电影在线观看完整版一区二区| 美女视频黄免费的久久| 亚洲综合一区在线| 国产精品福利一区| 国产日韩在线不卡| 精品国产一区二区三区久久影院 | 91香蕉视频污在线| 国产成人av影院| 精品一区二区影视| 婷婷综合在线观看| 亚洲在线免费播放| 日韩一区日韩二区| 国产精品三级在线观看| 久久夜色精品国产噜噜av| 69精品人人人人| 欧美日韩色一区| 欧美亚洲禁片免费| 色综合色综合色综合| 成人福利视频在线| 不卡视频一二三| av亚洲精华国产精华精| 国产一区二区三区黄视频| 精品一区二区在线视频| 精品亚洲成av人在线观看| 麻豆精品在线观看| 久久国产生活片100| 麻豆91精品91久久久的内涵| 喷白浆一区二区| 蜜臀久久99精品久久久久久9| 午夜精品福利久久久| 日韩精品免费专区| 美女视频网站久久| 国产激情一区二区三区| 风间由美一区二区三区在线观看 | 免费观看91视频大全| 蜜桃久久久久久久| 极品尤物av久久免费看| 国产在线视视频有精品| 国产美女主播视频一区| 成人av免费网站| 色一区在线观看| 欧美精品v国产精品v日韩精品| 欧美精品色综合| 久久久久久亚洲综合影院红桃 | 91性感美女视频| 91精品国产免费| 亚洲精品在线一区二区| 国产亚洲制服色| 亚洲免费色视频| 日本中文在线一区| 国产高清亚洲一区| 99精品国产视频| 欧美一区二区视频网站| 2021中文字幕一区亚洲| 日韩一区在线看| 日韩va亚洲va欧美va久久| 国产乱理伦片在线观看夜一区| 成人午夜私人影院| 欧美日韩一区二区在线观看视频| 日韩亚洲欧美综合| 亚洲日穴在线视频| 日韩av在线免费观看不卡| 国产成人在线视频免费播放| 在线观看欧美精品| 久久婷婷久久一区二区三区| ㊣最新国产の精品bt伙计久久| 日韩福利电影在线| av影院午夜一区| 欧美成人女星排名| 亚洲国产一区二区a毛片| 国产成人综合自拍| 91精品国产综合久久精品app | 国产亚洲精品bt天堂精选| 亚洲综合久久久久| 国产99久久久精品| 日韩亚洲欧美高清|