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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? handler.c

?? 開發(fā)板bios源碼 開發(fā)板bios源碼
?? C
字號:
/*
 * handler.c -- URL handler support
 *
 * Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved.
 *
 * See the file "license.txt" for usage and redistribution license requirements
 *
 * $Id: handler.c,v 1.2 2001/12/06 16:28:24 bporter Exp $
 */

/******************************** Description *********************************/

/*
 *	This module implements a URL handler interface and API to permit
 *	the addition of user definable URL processors.
 */

/********************************* Includes ***********************************/

#include	"wsIntrn.h"

/*********************************** Locals ***********************************/

static websUrlHandlerType	*websUrlHandler;			/* URL handler list */
static int					websUrlHandlerMax;			/* Number of entries */
static int					urlHandlerOpenCount = 0;	/* count of apps */

/**************************** Forward Declarations ****************************/

static int 		websUrlHandlerSort(const void *p1, const void *p2);
static int 		websPublishHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, 
				int sid, char_t *url, char_t *path, char_t *query);
static char_t	*websCondenseMultipleChars(char_t *strToCondense, char_t cCondense);

/*********************************** Code *************************************/
/*
 *	Initialize the URL handler module
 */

int websUrlHandlerOpen()
{
	if (++urlHandlerOpenCount == 1) {
		websAspOpen();
		websUrlHandler = NULL;
		websUrlHandlerMax = 0;
	}
	return 0;
}

/******************************************************************************/
/*
 *	Close the URL handler module
 */

void websUrlHandlerClose()
{
	websUrlHandlerType *sp;

	if (--urlHandlerOpenCount <= 0) {
		websAspClose();
		for (sp = websUrlHandler; sp < &websUrlHandler[websUrlHandlerMax];
			sp++) {
			bfree(B_L, sp->urlPrefix);
			if (sp->webDir) {
				bfree(B_L, sp->webDir);
			}
		}
		bfree(B_L, websUrlHandler);
		websUrlHandlerMax = 0;
	}
}

/******************************************************************************/
/*
 *	Define a new URL handler. urlPrefix is the URL prefix to match. webDir is 
 *	an optional root directory path for a web directory. arg is an optional
 *	arg to pass to the URL handler. flags defines the matching order. Valid
 *	flags include WEBS_HANDLER_LAST, WEBS_HANDLER_FIRST. If multiple users 
 *	specify last or first, their order is defined alphabetically by the 
 *	urlPrefix.
 */

int websUrlHandlerDefine(char_t *urlPrefix, char_t *webDir, int arg,
		int (*handler)(webs_t wp, char_t *urlPrefix, char_t *webdir, int arg, 
		char_t *url, char_t *path, char_t *query), int flags)
{
	websUrlHandlerType	*sp;
	int					len;

	a_assert(urlPrefix);
	a_assert(handler);

/*
 *	Grow the URL handler array to create a new slot
 */
	len = (websUrlHandlerMax + 1) * sizeof(websUrlHandlerType);
	if ((websUrlHandler = brealloc(B_L, websUrlHandler, len)) == NULL) {
		return -1;
	}
	sp = &websUrlHandler[websUrlHandlerMax++];
	memset(sp, 0, sizeof(websUrlHandlerType));

	sp->urlPrefix = bstrdup(B_L, urlPrefix);
	sp->len = gstrlen(sp->urlPrefix);
	if (webDir) {
		sp->webDir = bstrdup(B_L, webDir);
	} else {
		sp->webDir = bstrdup(B_L, T(""));
	}
	sp->handler = handler;
	sp->arg = arg;
	sp->flags = flags;

/*
 *	Sort in decreasing URL length order observing the flags for first and last
 */
	qsort(websUrlHandler, websUrlHandlerMax, sizeof(websUrlHandlerType), 
		websUrlHandlerSort);
	return 0;
}

/******************************************************************************/
/*
 *	Delete an existing URL handler. We don't reclaim the space of the old 
 *	handler, just NULL the entry. Return -1 if handler is not found.
 */

int websUrlHandlerDelete(int (*handler)(webs_t wp, char_t *urlPrefix, 
	char_t *webDir, int arg, char_t *url, char_t *path, char_t *query))
{
	websUrlHandlerType	*sp;
	int					i;

	for (i = 0; i < websUrlHandlerMax; i++) {
		sp = &websUrlHandler[i];
		if (sp->handler == handler) {
			sp->handler = NULL;
			return 0;
		}
	}
	return -1;
}

/******************************************************************************/
/*
 *	Sort in decreasing URL length order observing the flags for first and last
 */

static int websUrlHandlerSort(const void *p1, const void *p2)
{
	websUrlHandlerType	*s1, *s2;
	int					rc;

	a_assert(p1);
	a_assert(p2);

	s1 = (websUrlHandlerType*) p1;
	s2 = (websUrlHandlerType*) p2;

	if ((s1->flags & WEBS_HANDLER_FIRST) || (s2->flags & WEBS_HANDLER_LAST)) {
		return -1;
	}

	if ((s2->flags & WEBS_HANDLER_FIRST) || (s1->flags & WEBS_HANDLER_LAST)) {
		return 1;
	}

	if ((rc = gstrcmp(s1->urlPrefix, s2->urlPrefix)) == 0) {
		if (s1->len < s2->len) {
			return 1;
		} else if (s1->len > s2->len) {
			return -1;
		}
	}
	return -rc; 
}

/******************************************************************************/
/*
 *	Publish a new web directory (Use the default URL handler)
 */

int websPublish(char_t *urlPrefix, char_t *path)
{
	return websUrlHandlerDefine(urlPrefix, path, 0, websPublishHandler, 0);
}

/******************************************************************************/
/*
 *	Return the directory for a given prefix. Ignore empty prefixes
 */

char_t *websGetPublishDir(char_t *path, char_t **urlPrefix)
{
	websUrlHandlerType	*sp;
	int					i;

	for (i = 0; i < websUrlHandlerMax; i++) {
		sp = &websUrlHandler[i];
		if (sp->urlPrefix[0] == '\0') {
			continue;
		}
		if (sp->handler && gstrncmp(sp->urlPrefix, path, sp->len) == 0) {
			if (urlPrefix) {
				*urlPrefix = sp->urlPrefix;
			}
			return sp->webDir;
		}
	}
	return NULL;
}

/******************************************************************************/
/*
 *	Publish URL handler. We just patch the web page Directory and let the
 *	default handler do the rest.
 */

static int websPublishHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, 
	int sid, char_t *url, char_t *path, char_t *query)
{
	int		len;

	a_assert(websValid(wp));
	a_assert(path);

/*
 *	Trim the urlPrefix off the path and set the webdirectory. Add one to step 
 *	over the trailing '/'
 */
	len = gstrlen(urlPrefix) + 1;
	websSetRequestPath(wp, webDir, &path[len]);
	return 0;
}

/******************************************************************************/
/*
 *	See if any valid handlers are defined for this request. If so, call them
 *	and continue calling valid handlers until one accepts the request. 
 *	Return true if a handler was invoked, else return FALSE.
 */

int websUrlHandlerRequest(webs_t wp)
{
	websUrlHandlerType	*sp;
	int					i, first;

	a_assert(websValid(wp));

/*
 *	Delete the socket handler as we don't want to start reading any
 *	data on the connection as it may be for the next pipelined HTTP/1.1
 *	request if using Keep Alive
 */
	socketDeleteHandler(wp->sid);
	wp->state = WEBS_PROCESSING;
	websStats.handlerHits++;
	
	websSetRequestPath(wp, websGetDefaultDir(), NULL);

/*
 *	Eliminate security hole
 */
 	websCondenseMultipleChars(wp->path, '/');
	websCondenseMultipleChars(wp->url, '/');

/*
 *	We loop over each handler in order till one accepts the request. 
 *	The security handler will handle the request if access is NOT allowed.
 */
	first = 1;
	for (i = 0; i < websUrlHandlerMax; i++) {
		sp = &websUrlHandler[i];
		if (sp->handler && gstrncmp(sp->urlPrefix, wp->path, sp->len) == 0) {
			if (first) {
				websSetEnv(wp);
				first = 0;
			}
			if ((*sp->handler)(wp, sp->urlPrefix, sp->webDir, sp->arg, 
					wp->url, wp->path, wp->query)) {
				return 1;
			}
			if (!websValid(wp)) {
				trace(0, 
				T("webs: handler %s called websDone, but didn't return 1\n"),
					sp->urlPrefix);
				return 1;
			}
		}
	}
/*
 *	If no handler processed the request, then return an error. Note: It is 
 *	the handlers responsibility to call websDone
 */
	if (i >= websUrlHandlerMax) {
		websError(wp, 200, T("No handler for this URL %s"), wp->url);
	}
	return 0;
}

#ifdef OBSOLETE_CODE

/******************************************************************************/
/*
 *	Tidy up the URL path. Return -1 if the URL is bad.
 *  Used to eliminate repeated directory delimiters ('/').
 */

static int websTidyUrl(webs_t wp)
{
	char_t	*parts[64];					/* Array of ptr's to URL parts */
	char_t	*token, *url, *tidyurl;
	int		i, len, npart;

	a_assert(websValid(wp));

/*
 *	Copy the string so we don't destroy the original (yet)
 */
	url = bstrdup(B_L, wp->url);
	websDecodeUrl(url, url, gstrlen(url));

	len = npart = 0;
	parts[0] = NULL;
	token = gstrtok(url, T("/"));

/*
 *	Look at each directory segment and process "." and ".." segments
 *	Don't allow the browser to pop outside the root web. 
 */
	while (token != NULL) {
		if (gstrcmp(token, T("..")) == 0) {
			if (npart > 0) {
				npart--;
			}

		} else if (gstrcmp(token, T(".")) != 0) {
			parts[npart] = token;
			len += gstrlen(token) + 1;
			npart++;
		}
		token = gstrtok(NULL, T("/"));
	}

/*
 *	Re-construct URL. Need extra space all "/" and null.
 */
	if (npart || (gstrcmp(url, T("/")) == 0) || (url[0] == '\0')) {
		tidyurl = balloc(B_L, (len + 2) * sizeof(char_t));
		*tidyurl = '\0';

		for (i = 0; i < npart; i++) {
			gstrcat(tidyurl, T("/"));
			gstrcat(tidyurl, parts[i]);
		}

		bfree(B_L, url);

		bfree(B_L, wp->url);
		wp->url = tidyurl;
		return 0;
	} else {
		bfree(B_L, url);
		return -1;
	}
}

#endif

/******************************************************************************/
/*
 *	Convert multiple adjacent occurrences of a given character to a single
 *	instance.
 */

static char_t *websCondenseMultipleChars(char_t *strToCondense, char_t cCondense)
{
	if (strToCondense != NULL) {
		char_t *pStr, *pScan;

		pStr = pScan = strToCondense;

		while (*pScan && *pStr) {
/*
 *			Advance scan pointer over multiple occurences of condense character
 */
			while ((*pScan == cCondense) && (*(pScan + 1) == cCondense)) {
				pScan++;
			}
/*
 *			Copy character if an advance of the scan pointer has occurred
 */
			if (pStr != pScan) {
				*pStr = *pScan;
			}
			
			pScan++;
			pStr++;
		}
/*
 *		Zero terminate string if multiple adjacent characters were found and condensed
 */
		if (pStr != pScan) {
			*pStr = 0;
		}
	}

	return strToCondense;
}

/******************************************************************************/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
a级精品国产片在线观看| 免费观看久久久4p| 99在线精品视频| 国产精品国模大尺度视频| 成人手机在线视频| 亚洲蜜臀av乱码久久精品蜜桃| 99久久久无码国产精品| 亚洲男人的天堂在线aⅴ视频| 91福利资源站| 日韩激情一区二区| 26uuu另类欧美| 99久久婷婷国产| 香蕉加勒比综合久久| 精品国产乱码久久久久久夜甘婷婷 | 另类人妖一区二区av| 久久无码av三级| 色综合天天做天天爱| 日韩精品一二区| 中文字幕欧美区| 欧美日韩亚洲丝袜制服| 激情久久五月天| 亚洲欧美偷拍卡通变态| 欧美精品一级二级| 国产成人精品午夜视频免费| 亚洲人成精品久久久久久| 日韩三级视频在线看| 本田岬高潮一区二区三区| 视频一区欧美日韩| 亚洲国产高清在线| 欧美一级在线视频| av在线一区二区| 理论电影国产精品| 亚洲综合久久av| 国产午夜三级一区二区三| 欧美亚洲尤物久久| 国产suv精品一区二区三区| 午夜国产不卡在线观看视频| 国产欧美日韩在线看| 欧美精选在线播放| 91在线精品一区二区三区| 美女一区二区视频| 亚洲高清视频的网址| 国产精品美日韩| 久久这里只精品最新地址| 欧美老人xxxx18| 99在线热播精品免费| 国产呦萝稀缺另类资源| 五月天丁香久久| 亚洲欧美在线视频观看| 久久久久久一二三区| 欧美日韩亚洲另类| 91福利视频网站| 99视频一区二区| 国产成人99久久亚洲综合精品| 青青草视频一区| 午夜亚洲福利老司机| 亚洲色图.com| 国产精品免费久久久久| 亚洲国产激情av| 国产欧美日韩视频一区二区 | 精品在线免费观看| 麻豆久久一区二区| 同产精品九九九| 亚洲成人自拍一区| 亚洲gay无套男同| 一区二区免费在线| 亚洲视频一区在线| 1000部国产精品成人观看| 中文字幕高清一区| 国产精品久久综合| 国产精品麻豆一区二区| 国产精品情趣视频| 一区在线播放视频| 亚洲欧洲三级电影| 亚洲欧洲综合另类| 亚洲一区影音先锋| 午夜精品福利久久久| 视频一区二区三区中文字幕| 婷婷国产在线综合| 日韩高清在线不卡| 久久精品999| 国产黄色91视频| caoporn国产一区二区| 91在线看国产| 欧美亚洲动漫精品| 4438亚洲最大| 2020国产成人综合网| 欧美韩国一区二区| 自拍偷拍国产亚洲| 亚洲国产精品天堂| 麻豆国产精品视频| 国产a久久麻豆| 91免费小视频| 91精品国产91久久综合桃花| 日韩一级片在线播放| 久久精品亚洲乱码伦伦中文 | 中文字幕亚洲电影| 亚洲一区中文在线| 免费看日韩精品| 国产成人综合网| 91丝袜美腿高跟国产极品老师 | **欧美大码日韩| 亚洲成av人在线观看| 精品一区二区久久久| 成人黄色a**站在线观看| 色综合中文字幕国产| 欧美午夜影院一区| 精品国产三级a在线观看| 国产精品传媒入口麻豆| 夜夜嗨av一区二区三区网页| 久久99精品网久久| 91久久久免费一区二区| 欧美成人三级在线| 亚洲欧美一区二区三区极速播放| 亚洲电影一区二区| 国产精品综合在线视频| 日本道色综合久久| 久久久91精品国产一区二区精品 | 欧美手机在线视频| 国产人伦精品一区二区| 亚洲主播在线观看| 国产91在线|亚洲| 91麻豆精品国产91| 1区2区3区国产精品| 麻豆成人免费电影| 99re6这里只有精品视频在线观看| 日韩片之四级片| 亚洲卡通动漫在线| 韩国精品主播一区二区在线观看| 日本乱码高清不卡字幕| 久久久国产精品麻豆| 三级久久三级久久久| av电影一区二区| 国产亚洲综合性久久久影院| 日韩黄色在线观看| 91九色最新地址| 中文字幕一区在线| 国产精品一二三四五| 欧美一级理论片| 亚洲大尺度视频在线观看| aaa国产一区| 国产精品系列在线| 精品伊人久久久久7777人| 欧美性感一类影片在线播放| 综合久久给合久久狠狠狠97色| 久久国产福利国产秒拍| 欧美精品 国产精品| 亚洲一区免费观看| 一道本成人在线| 亚洲免费在线视频一区 二区| 国产高清无密码一区二区三区| 日韩欧美一区二区在线视频| 午夜久久电影网| 欧美午夜寂寞影院| 一区二区三区中文字幕精品精品| 成人天堂资源www在线| 久久精品亚洲精品国产欧美kt∨| 韩日精品视频一区| 欧美精品一区二区在线播放| 美脚の诱脚舐め脚责91| 欧美福利一区二区| 日日骚欧美日韩| 欧美精品乱码久久久久久按摩| 亚洲成a人片在线观看中文| 欧美日韩在线观看一区二区| 亚洲成a人在线观看| 欧美精品在线观看播放| 日本免费新一区视频| 日韩欧美在线网站| 黄一区二区三区| 久久久久国产精品厨房| 懂色av一区二区三区免费观看| 日本一区二区三区在线观看| 不卡高清视频专区| 一区二区三区精品在线| 欧美午夜精品一区二区三区| 亚洲1区2区3区视频| 日韩一区二区三区精品视频| 九色综合狠狠综合久久| 久久久精品国产99久久精品芒果| 成人在线一区二区三区| 18欧美亚洲精品| 欧美性猛交xxxx黑人交| 老司机午夜精品99久久| 精品精品国产高清一毛片一天堂| 国产一区二区电影| 日韩美女精品在线| 在线91免费看| 国产大陆a不卡| 亚洲丝袜另类动漫二区| 欧美日韩精品一区二区天天拍小说| 日韩精品视频网站| 欧美激情一区二区三区不卡| 91视频.com| 日本美女一区二区三区视频| 欧美国产日韩在线观看| 欧美在线看片a免费观看| 久久99久久99精品免视看婷婷| 国产精品妹子av| 欧美一区欧美二区|