⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htpep.c

📁 www工具包. 这是W3C官方支持的www支撑库. 其中提供通用目的的客户端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
💻 C
字号:
/***	PEP ENGINE****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTPEP.c,v 2.7 1999/02/22 22:10:11 frystyk Exp $****** AUTHORS:**	HFN	Henrik Frystyk**** HISTORY:**	July 96	HFN	Written first version*//* Library include files */#include "wwwsys.h"#include "WWWUtil.h"#include "WWWCore.h"#include "HTPEP.h"					 /* Implemented here */#define PEP_NAME		"w3c-pep"	     /* Name of the PEP tree */#define DEFAULT_PORT		80		      /* Concentrate on HTTP */struct _HTPEPModule {    char *		name;    HTNetBefore *	before;    HTNetAfter *	after;    HTUTree_gc *	gc;};typedef struct _HTPEPElement {    char * 		name;    void * 		context;} HTPEPElement;PRIVATE HTList ** HTModules;		   /* List of registered PEP modules *//* ------------------------------------------------------------------------- *//*				PEP MODULE MANAGEMENT			     *//* ------------------------------------------------------------------------- */PRIVATE BOOL delete_module (HTPEPModule * module){    if (module) {	HT_FREE(module->name);	HT_FREE(module);	return YES;    }    return NO;}/***	Case sensitive search for module*/PRIVATE HTPEPModule * find_module (const char * name, HTList ** hashlist){    HTPEPModule * pres = NULL;    *hashlist = NULL;    if (!name) {	HTTRACE(APP_TRACE, "PEP Engine.. Bad argument\n");	return NULL;    }    /* Find a hash for this PEP module */    {	int hash;	const unsigned char * p;	for (p=name, hash=0; *p; p++) {	    hash = (hash * 3 + *p) % HT_M_HASH_SIZE;	}	if (!HTModules) {	    if ((HTModules = (HTList **) HT_CALLOC(HT_M_HASH_SIZE,						   sizeof(HTList *))) == NULL)	        HT_OUTOFMEM("find_module");	}	if (!HTModules[hash])	    HTModules[hash] = *hashlist = HTList_new();	else	    *hashlist = HTModules[hash];    }    /* Search the existing list to see if we already have this entry */    {	HTList * cur = *hashlist;	while ((pres = (HTPEPModule *) HTList_nextObject(cur))) {	    if (!strcmp(pres->name, name)) return pres;	}    }    return NULL;}PUBLIC HTPEPModule * HTPEP_newModule (const char *	name,				      HTNetBefore *	before,				      HTNetAfter *	after,				      HTUTree_gc *	gc){    if (name) {	HTList * hashlist = NULL;	HTPEPModule * pres = find_module(name, &hashlist);	/* If found then update entry - else create a new one */	if (!pres) {	    if (!(pres = (HTPEPModule *) HT_CALLOC(1, sizeof(HTPEPModule))))		HT_OUTOFMEM("HTPEP_newModule");	    StrAllocCopy(pres->name, name);	    pres->before = before;	    pres->after = after;	    pres->gc = gc;	    /* Add the new PEP Module to the hash table */	    HTList_addObject(hashlist, (void *) pres);	    HTTRACE(APP_TRACE, "PEP Engine.. Created module %p\n" _ pres);	} else {	    HTTRACE(APP_TRACE, "PEP Engine.. Found module %p\n" _ pres);	}	return pres;    } else {	HTTRACE(APP_TRACE, "PEP Engine.. Bad argument\n");	return NULL;    }}PUBLIC HTPEPModule * HTPEP_findModule (const char * name){    if (name) {	HTList * hashlist = NULL;	HTPEPModule * pres = find_module(name, &hashlist);	HTTRACE(APP_TRACE, "PEP Engine.. did %sfind %s\n" _ pres ? "" : "NOT " _ name);	return pres;    } else {	HTTRACE(APP_TRACE, "PEP Engine.. Bad augument\n");    }    return NULL;}PUBLIC BOOL HTPEP_deleteModule (const char * name){    if (name) {	HTList * hashlist = NULL;	HTPEPModule * pres = find_module(name, &hashlist);	if (pres) {	    HTList_removeObject(hashlist, pres);	    HTTRACE(APP_TRACE, "PEP Engine.. deleted %p\n" _ pres);	    delete_module(pres);	    return YES;	}    }    return NO;}PUBLIC BOOL HTPEP_deleteAllModules (void){    if (HTModules) {	int cnt;	HTList * cur;	for (cnt=0; cnt<HT_M_HASH_SIZE; cnt++) {	    if ((cur = HTModules[cnt])) { 		HTPEPModule * pres;		while ((pres = (HTPEPModule *) HTList_nextObject(cur)))		    delete_module(pres);	    }	    HTList_delete(HTModules[cnt]);	}	HT_FREE(HTModules);	return YES;    }    return NO;}/* ------------------------------------------------------------------------- *//*			    HANDLE THE PEP URL TREE			     *//* ------------------------------------------------------------------------- *//***	A PEP element is a particular PEP procotol associated with a**	particular point in the URL tree. The name is the name of the**	protocol known to be able to handle this context. This protocol**	must have been registered as a PEP module.*/PRIVATE HTPEPElement * HTPEP_newElement (const char * name, void * context){    if (name) {	HTPEPElement * me;	if ((me = (HTPEPElement *) HT_CALLOC(1, sizeof(HTPEPElement))) == NULL)	    HT_OUTOFMEM("HTPEPElement_new");	StrAllocCopy(me->name, name);	me->context = context;	HTTRACE(APP_TRACE, "PEP Engine.. Created element %p\n" _ me);	return me;    }    return NULL;}PRIVATE BOOL HTPEP_deleteElement (HTPEPElement * me){    if (me) {	HTTRACE(APP_TRACE, "PEP Engine.. Deleted element %p\n" _ me);	HT_FREE(me->name);	HT_FREE(me);	return YES;    }    return NO;}/***	A PEP list is a list of PEP elements and the "thing" we store in the**	PEP URL Tree*/PRIVATE HTList * HTPEP_newList (void){    HTList * me = HTList_new();    HTTRACE(APP_TRACE, "PEP Engine.. Created list %p\n" _ me);    return me;}PRIVATE int HTPEP_deleteList (void * context){    HTList * list = (HTList *) context;    if (list) {	HTPEPElement * pres;	while ((pres = (HTPEPElement *) HTList_nextObject(list)))	    HTPEP_deleteElement(pres);	HTTRACE(APP_TRACE, "PEP Engine.. Deleted list %p\n" _ list);	HTList_delete(list);	return YES;    }    return NO;}/***	Find a PEP List**	---------------**	Seaches the set PEP tree for a match. We do the following:****		1) Find the PEP tree for this host**		2) See if there is a realm match**		3) See if there is a template match for URL****	Return the node found else NULL which means that we don't have any**	authentication information to hook on to this request or response*/PRIVATE HTList * HTPEP_findList (const char * realm, const char * url){    HTUTree * tree;    if (!url) {	HTTRACE(APP_TRACE, "PEP Engine.. Bad argument\n");	return NULL;    }    HTTRACE(APP_TRACE, "PEP Engine.. Looking for info on `%s'\n" _ url);    /* Find a URLTree for this URL (if any) */    {	char * host = HTParse(url, "", PARSE_HOST);	char * colon = strchr(host, ':');	int port = DEFAULT_PORT;	if (colon ) {	    *(colon++) = '\0';			     /* Chop off port number */	    port = atoi(colon);	}		tree = HTUTree_find(PEP_NAME, host, port);	HT_FREE(host);	if (!tree) {	    HTTRACE(APP_TRACE, "PEP Engine.. No information\n");	    return NULL;	}    }    /* Find a matchind PEP element (if any)) */    {	char * path = HTParse(url, "", PARSE_PATH);	HTList * list = (HTList *) HTUTree_findNode(tree, realm, path);	HT_FREE(path);	return list;    }    return NULL;						 /* No match */}/*	Add a PEP element to the URL tree**	---------------------------------**	Add a protocol context to the PEP tree*/PUBLIC BOOL HTPEP_addNode (const char * protocol,			   const char * realm, const char * url,			   void * context){    HTUTree * tree = NULL;    HTPEPModule * module = NULL;    if (!protocol || !url) {	HTTRACE(APP_TRACE, "PEP Engine.. Bad argument\n");	return NO;    }    HTTRACE(APP_TRACE, "PEP Engine.. Adding info for `%s'\n" _ url);    /* Find the PEP module with this name */    if ((module = HTPEP_findModule(protocol)) == NULL) {	HTTRACE(APP_TRACE, "PEP Engine.. Module `%s\' not registered\n" _ 			       protocol ? protocol : "<null>");	return NO;    }    /* Find an existing PEP tree or create a new one */    {	char * host = HTParse(url, "", PARSE_HOST);	char * colon = strchr(host, ':');	int port = DEFAULT_PORT;	if (colon ) {	    *(colon++) = '\0';			     /* Chop off port number */	    port = atoi(colon);	}	tree = HTUTree_new(PEP_NAME, host, port, HTPEP_deleteList);	HT_FREE(host);	if (!tree) {	    HTTRACE(APP_TRACE, "PEP Engine.. Can't create tree\n");	    return NO;	}    }    /* Find a matching PEP element or create a new one */    {	char * path = HTParse(url, "", PARSE_PATH);	HTList * list = NULL;	HTPEPElement * element = HTPEP_newElement(protocol, context);	/*	** If existing list not found then create a new list and add it	** to the tree	*/	if ((list = (HTList *) HTUTree_findNode(tree, realm, path)) == NULL) {	    list = HTPEP_newList();	    HTUTree_addNode(tree, realm, path, list);	}	HT_FREE(path);	/* Now add the new element */	return HTList_addObject(list, element);    }}/* ------------------------------------------------------------------------- *//*				   PEP ENGINE 				     *//* ------------------------------------------------------------------------- *//*	HTPEP_beforeFilter**	------------------**	Return YES or whatever callback returns*/PUBLIC int HTPEP_beforeFilter (HTRequest * request, void * param, int mode){    int ret = HT_OK;    char * url = HTAnchor_physical(HTRequest_anchor(request));    const char * realm = HTRequest_realm(request);    HTList * list = HTPEP_findList(realm, url);    if (list) {	HTPEPElement * pres;	HTTRACE(APP_TRACE, "PEP Engine.. Calling BEFORE protocols %p\n" _ list);	while ((pres = (HTPEPElement *) HTList_nextObject(list))) {	    HTPEPModule * module = HTPEP_findModule(pres->name);	    if (module) {		ret = (*module->before)(request, pres->context, mode);		if (ret != HT_OK) break;	    }	}    }    return HT_OK;}/*	HTPEP_afterFilter**	-----------------**	Return YES or whatever callback returns*/PUBLIC int HTPEP_afterFilter (HTRequest * request, HTResponse * response,			      void * param, int status){    int ret = HT_OK;    HTAssocList * protocols = HTResponse_protocol(response);    if (protocols) {	HTPEPElement * pres;	HTTRACE(APP_TRACE, "PEP Engine.. Calling AFTER protocols %p\n" _ protocols);	while ((pres = (HTPEPElement *) HTList_nextObject(protocols))) {	    HTPEPModule * module = HTPEP_findModule(pres->name);	    if (module) {		ret = (*module->after)(request, response, pres->context, status);		if (ret != HT_OK) break;	    }	}    }    return HT_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -