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

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

?? htconlen.c

?? www工具包. 這是W3C官方支持的www支撐庫. 其中提供通用目的的客戶端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
?? C
字號:
/*							             HTConlen.c**	CONTENT LENGTH COUNTER STREAM****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTConLen.c,v 2.20 2000/06/19 13:43:33 kahan Exp $****	This stream counts the number of bytes in a stream until it reaches**	max number of bytes it can occupy. If this happens then	it gives up.*//* Library include files */#include "wwwsys.h"#include "WWWUtil.h"#include "WWWCore.h"#include "HTConLen.h"					 /* Implemented here */#define HT_MIN_BLOCK 	0x100#define HT_MAX_BLOCK	0x2000#define HT_MAX_SIZE	0x10000#define PUTBLOCK(b, l)	(*me->target->isa->put_block)(me->target,(b),(l))typedef struct _HTBufItem {    int			len;    char *		buf;    struct _HTBufItem *	next;} HTBufItem;typedef enum _BufferMode {    HT_BM_PLAIN		= 0x0,    HT_BM_DELAY		= 0x1,		/* Buffer full and we pause */    HT_BM_COUNT		= 0x2,		/* Content length counter */    HT_BM_PIPE		= 0x4		/* Pipe buffer */} BufferMode;typedef enum _BufferState {    HT_BS_OK		= 0,    HT_BS_PAUSE		= 1,    HT_BS_TRANSPARENT	= 2} BufferState;struct _HTStream {    HTStreamClass *	isa;    HTRequest *		request;    HTStream *		target;    char *		tmp_buf;    int			tmp_ind;    int			tmp_max;    HTBufItem *		head;    HTBufItem *		tail;    int			max_size;    int			cur_size;    int			conlen;    BufferMode		mode;			   /* State of the buffering */    BufferState		state;};/* ------------------------------------------------------------------------- *//***	MIME output with content-length calculation**	-------------------------------------------**	This stream also buffers the result to find out the content length.**	If a maximum buffer limit is reached Content-Length is calculated**	for logs but it is not sent to the client -- rather the buffer is**	flushed right away.**	Code taken from HTRequest.c written by Ari Luotonen and modified to**	fit new stream model*/PRIVATE BOOL free_buf (HTBufItem * me){    if (me) {	HT_FREE(me->buf);	HT_FREE(me);	return YES;    }    return NO;}PRIVATE void free_buf_all (HTStream * me){    HTBufItem * cur = me->head;    HTBufItem * killme;    me->tmp_ind = 0;    me->tmp_max = 0;    HT_FREE(me->tmp_buf);    while (cur) {	killme = cur;	cur = cur->next;	free_buf(cur);    }    me->head = me->tail = NULL;}PRIVATE void append_buf (HTStream * me){    HTBufItem * b;    if ((b = (HTBufItem  *) HT_CALLOC(1, sizeof(HTBufItem))) == NULL)        HT_OUTOFMEM("append_buf");    b->len = me->tmp_ind;    b->buf = me->tmp_buf;    me->tmp_ind = 0;    me->tmp_max = 0;    me->tmp_buf = 0;    if (me->tail)	me->tail->next = b;    else	me->head = b;    me->tail = b;}PRIVATE BOOL alloc_new (HTStream * me, int size){    if (me->conlen >= me->max_size) {	HTTRACE(STREAM_TRACE, "Buffer...... size %d reached, going transparent\n" _ 		    me->max_size);	return NO;    } else if (size) {	me->tmp_ind = 0;	me->tmp_max = size;	if ((me->tmp_buf = (char  *) HT_MALLOC(size)) == NULL)	    HT_OUTOFMEM("buf_put_char");	HTTRACE(STREAM_TRACE, "Buffer...... created with len %d\n" _ size);	return YES;    }    return NO;}/***	After flushing the buffer we go into transparent mode so that we still**	can handle incoming data. If we already are in transparent mode then**	don't do anything.*/PRIVATE int buf_flush (HTStream * me){    if (me->state != HT_BS_TRANSPARENT) {	HTBufItem * cur;	if (me->tmp_buf) append_buf(me);	while ((cur = me->head)) {	    int status;	    if ((status = PUTBLOCK(cur->buf, cur->len)) != HT_OK) {		return status;	    }	    me->head = cur->next;	    free_buf(cur);	}	/* If we are not a pipe then do no more buffering */	if ((me->mode & HT_BM_PIPE)) me->state = HT_BS_TRANSPARENT;    }    return (*me->target->isa->flush)(me->target);}PRIVATE int buf_put_block (HTStream * me, const char * b, int l){    /*    **  If we are in pause mode then don't write anything but return PAUSE.    **  The upper stream should then respect it and don't write any more data.    */    if (me->state == HT_BS_PAUSE) return HT_PAUSE;    /*    **  Start handling the incoming data. If we are still buffering then add    **  it to the buffer. Otherwise just pump it through. Note that we still    **  count the length - even if we have given up buffering!    */    me->conlen += l;    if (me->state != HT_BS_TRANSPARENT) {	/*	**  If there is still room in the existing chunk then fill it up.	**  Otherwise create a new chunk and add it to the linked list of	**  chunks. If the buffer fills up then either return HT_PAUSE or	**  flush it and go transparent.	*/	if (me->tmp_buf && me->tmp_max-me->tmp_ind >= l) {     /* Still room */	    memcpy(me->tmp_buf + me->tmp_ind, b, l);	    me->tmp_ind += l;	    return HT_OK;	} else {	    /*	    **  Add the temporary buffer (if any) to the list of chunks	    */	    if (me->tmp_buf) append_buf(me);	    /*	    **  Find the right size of the next chunk. We increase the size	    **  exponentially until we reach HT_MAX_BLOCK in order to minimize	    **  the number of mallocs.	    */	    if (me->cur_size < HT_MAX_BLOCK) {		int newsize = me->cur_size ? me->cur_size : HT_MIN_BLOCK;		while (l > newsize && newsize < HT_MAX_BLOCK) newsize *= 2;		me->cur_size = newsize;	    }	    if (alloc_new(me, me->cur_size)) {		/* Buffer could accept the new data */		memcpy(me->tmp_buf, b, l);		me->tmp_ind = l;	    } else if (me->mode & HT_BM_DELAY) {		/* Buffer ran full and we pause */		me->state = HT_BS_PAUSE;		HTTRACE(STREAM_TRACE, "Buffer....... Paused\n");		return HT_PAUSE;	    } else {		/* Buffer ran full and we flush and go transparent */		int status = buf_flush(me);		if (status != HT_OK) return status;	    }	}    }    /*    **  If we couldn't buffer the data then check whether we should give up    **  or pause the stream. If we are in transparent mode then put the rest    **  of the data down the pipe.    */    if (me->state == HT_BS_TRANSPARENT) return PUTBLOCK(b, l);    return HT_OK;}PRIVATE int buf_put_char (HTStream * me, char c){    return buf_put_block(me, &c, 1);}PRIVATE int buf_put_string (HTStream * me, const char * s){    return buf_put_block(me, s, (int) strlen(s));}PRIVATE int buf_free (HTStream * me){    int status = HT_OK;    /*    **  If the buffer has not been flushed explicit and we are a pipe buffer    **  then we don't free it.    */     if (me->mode & HT_BM_PIPE && me->state != HT_BS_TRANSPARENT) {	HTTRACE(STREAM_TRACE, "PipeBuffer Waiting to be flushed\n");	return HT_OK;    }    /*    **  Should we count the content length and assign it to the    **  anchor?    */    if (me->mode & HT_BM_COUNT && me->request) {	HTParentAnchor * anchor = HTRequest_anchor(me->request);	HTTRACE(STREAM_TRACE, "Buffer........ Calculated content-length: %d\n" _ me->conlen);	HTAnchor_setLength(anchor, me->conlen);    }    /*    **  Flush the buffered data - even if we are paused. That is, we always    **  flush - except if we have already flushed the buffer, of course.    **  Also, we don't flush if we are a PIPE buffer. Then the flush MUST be    **  called explicitly and the buffer can not be freed before this     **  happens.    */    if ((status = buf_flush(me)) != HT_OK)	return status;    if ((status = (*me->target->isa->_free)(me->target)) != HT_OK)	return status;    HT_FREE(me);    return status;}PRIVATE int buf_abort (HTStream * me, HTList * e){    if (me->target) (*me->target->isa->abort)(me->target,e);    free_buf_all(me);    HT_FREE(me);    HTTRACE(PROT_TRACE, "Buffer...... ABORTING...\n");    return HT_ERROR;}HTStreamClass HTBufferClass = {    "Buffer",    buf_flush,    buf_free,    buf_abort,    buf_put_char,    buf_put_string,    buf_put_block};PUBLIC HTStream * HTBuffer_new (HTStream *	target,				HTRequest *	request,				int		max_size){    HTStream * me;    if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)        HT_OUTOFMEM("HTBufferStream");    me->isa = &HTBufferClass;    me->target = target;    me->request = request;    me->max_size = (max_size > 0) ? max_size : HT_MAX_SIZE;    me->mode = HT_BM_PLAIN;    HTTRACE(STREAM_TRACE, "Buffer...... Created with size %d\n" _ me->max_size);    return me;}PUBLIC HTStream * HTDelayBuffer (HTStream * target, int max_size){    HTStream * me = HTBuffer_new(target, NULL, max_size);    if (me) {	me->mode = HT_BM_DELAY;	return me;    }    return HTErrorStream();}PUBLIC HTStream * HTContentCounter (HTStream *	target,				    HTRequest *	request,				    int		max_size){    HTStream * me = HTBuffer_new(target, NULL, max_size);    if (me) {	me->mode = HT_BM_COUNT;	return me;    }    return HTErrorStream();}PUBLIC HTStream * HTPipeBuffer (HTStream * target, int max_size){    HTStream * me = HTBuffer_new(target, NULL, max_size);    if (me) {	me->mode = HT_BM_PIPE;	return me;    }    return HTErrorStream();}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一二三区在线观看| 免费高清成人在线| 一本一本大道香蕉久在线精品 | 懂色av一区二区三区免费观看| 欧美一区二区三区人| 久久99九九99精品| 国产精品乱码妇女bbbb| 在线欧美日韩精品| 亚洲精品久久久蜜桃| 国产乱码精品一区二区三区av | 国内外成人在线视频| 国产精品少妇自拍| 欧美一二三四在线| 成人三级在线视频| 日韩av二区在线播放| 中文字幕中文字幕在线一区| 欧美色图片你懂的| 成人av在线电影| 奇米影视一区二区三区小说| 国产精品久久久久精k8| 欧美一区二区三区男人的天堂| 国产一区久久久| 精品一区二区三区视频在线观看 | k8久久久一区二区三区| 视频一区二区三区在线| 亚洲三级小视频| 国产日韩精品久久久| 欧美变态tickling挠脚心| 欧美男同性恋视频网站| 一道本成人在线| 色婷婷国产精品| 99久久99久久精品国产片果冻| 免费成人美女在线观看| 青椒成人免费视频| 日av在线不卡| 精品写真视频在线观看| 久草这里只有精品视频| 秋霞国产午夜精品免费视频| 亚洲国产精品一区二区www | 亚洲第一主播视频| 免费观看在线综合| 国产最新精品免费| 成人激情免费电影网址| 成人三级伦理片| 国产成人高清视频| 色噜噜狠狠成人中文综合| 99久久99久久精品国产片果冻| 91久久精品国产91性色tv | 国产v综合v亚洲欧| 成人高清免费在线播放| 色菇凉天天综合网| 日韩欧美中文字幕精品| 国产精品久久久久9999吃药| 亚洲综合免费观看高清完整版在线 | 91福利社在线观看| 欧美日韩激情一区二区| 久久夜色精品一区| 亚洲福利视频三区| www.色综合.com| 日韩一区二区三区av| 亚洲视频一区在线| 国产成人综合自拍| 久久综合中文字幕| 亚洲成人动漫在线观看| 99视频一区二区三区| 精品粉嫩aⅴ一区二区三区四区| 亚洲第一搞黄网站| 91蜜桃免费观看视频| 国产亚洲欧美中文| 国产一区二区三区免费| 日韩午夜中文字幕| 蜜桃视频在线观看一区| 色偷偷久久一区二区三区| 国产精品色噜噜| 成人激情小说网站| 中文幕一区二区三区久久蜜桃| 国产在线视视频有精品| 久久久久国产精品免费免费搜索| 免费成人在线视频观看| 中文字幕国产一区二区| 蜜桃视频在线一区| 欧美久久久久久蜜桃| 日本在线不卡视频一二三区| 欧美日韩欧美一区二区| 日本不卡一区二区| 日韩丝袜情趣美女图片| 国产自产高清不卡| 国产精品国模大尺度视频| 色综合欧美在线| 久久超级碰视频| 日本一二三不卡| 欧美女孩性生活视频| 国产一区中文字幕| 亚洲精品国产第一综合99久久| 在线影院国内精品| 国产精品亚洲午夜一区二区三区 | 日本不卡一二三| 国产精品国产三级国产aⅴ原创| 欧美性猛交xxxx乱大交退制版| 蜜桃视频一区二区三区在线观看 | 亚洲香肠在线观看| 国产午夜精品理论片a级大结局| 欧美午夜影院一区| 福利一区福利二区| 亚洲成av人影院| 日韩毛片高清在线播放| 久久久久久免费毛片精品| 欧美日韩免费观看一区二区三区| 久久99精品国产麻豆不卡| 亚洲自拍偷拍九九九| 亚洲欧美一区二区三区孕妇| 久久久精品蜜桃| 精品国产电影一区二区| 在线成人高清不卡| 91麻豆精品国产| 欧美日韩电影在线| 欧美日韩免费观看一区二区三区| 色一区在线观看| 91久久精品一区二区三区| 成人18精品视频| 91亚洲国产成人精品一区二区三 | 国产欧美精品区一区二区三区| 欧美久久婷婷综合色| 91精品国产综合久久久久久漫画| 在线免费精品视频| 欧美精品黑人性xxxx| 91精品久久久久久久91蜜桃| 91精品国产色综合久久不卡电影| 欧美一区二区视频在线观看| 欧美r级在线观看| 久久一日本道色综合| 国产精品美女www爽爽爽| 一区二区三区四区在线免费观看| 亚洲一区二区三区自拍| 精品一区二区三区视频| proumb性欧美在线观看| 91精品国产一区二区人妖| 国产日韩av一区| 亚洲一区二区三区免费视频| 日本成人在线视频网站| 不卡av电影在线播放| 91精品免费观看| 91精品国产色综合久久久蜜香臀| 中文文精品字幕一区二区| 五月婷婷欧美视频| 91激情五月电影| 国产精品国产三级国产aⅴ入口| 午夜不卡av免费| 色综合天天综合狠狠| 中文字幕精品在线不卡| 精品一区二区三区免费播放 | 欧美亚洲图片小说| 国产精品麻豆欧美日韩ww| 国产一区二区伦理| 日韩欧美综合在线| 日韩精品国产欧美| 欧美日韩中文国产| 亚洲国产精品一区二区www在线| 91丨九色丨蝌蚪富婆spa| 国产欧美视频一区二区| 国产不卡免费视频| 久久久99精品久久| 成人国产精品免费观看动漫| 国产调教视频一区| 成人av电影在线| 亚洲精品福利视频网站| 99精品国产一区二区三区不卡| 中文字幕不卡一区| 欧洲中文字幕精品| 亚洲综合丁香婷婷六月香| 欧美一区在线视频| 免费久久精品视频| 精品国产乱码久久久久久老虎| 国产成人在线视频网站| 亚洲少妇最新在线视频| 欧美日产国产精品| 成人免费视频caoporn| 亚洲香蕉伊在人在线观| 精品国产一区二区三区久久久蜜月| 国产乱码精品一区二区三| 国产精品久久久久久福利一牛影视| 欧美亚洲一区二区三区四区| 久久电影网站中文字幕| 一区二区三区四区精品在线视频| 欧美精品乱码久久久久久按摩 | 韩国欧美一区二区| 亚洲激情在线播放| 精品福利一区二区三区 | 成人深夜视频在线观看| 免费欧美在线视频| 日日夜夜一区二区| 亚洲美女精品一区| 亚洲免费观看高清完整版在线观看| 精品免费99久久| 欧美一区二区三区不卡| 欧美日韩成人激情| 欧美中文字幕不卡| 欧美在线观看18| 日本高清免费不卡视频| 成人av一区二区三区|