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

📄 api.c

📁 开放源代码的WEB服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
				if(cp)				{					strncpy(server->request.referer,cp,						HTTP_MAX_URL);				}			}			if (strncasecmp(buf,"If-Modified-Since: ",19) == 0)			{				cp = index(buf,':') + 2;				if(cp)				{					strncpy(server->request.ifModified,cp,						HTTP_MAX_URL);					cp = index(server->request.ifModified,						';');					if (cp)						*cp = 0;				}			}			if (strncasecmp(buf,"Content-Type: ",14) == 0)			{				cp = index(buf,':') + 2;				if(cp)				{					strncpy(server->request.contentType,cp,						HTTP_MAX_URL);				}			}			if (strncasecmp(buf,"Content-Length: ",16) == 0)			{				cp = index(buf,':') + 2;				if(cp)					server->request.contentLength=atoi(cp);			}			continue;		}	}	/*	** Process and POST data	*/	if (server->request.contentLength > 0)	{		bzero(buf, HTTP_MAX_LEN);		_httpd_readBuf(server, buf, server->request.contentLength);		_httpd_storeData(server, buf);			}	/*	** Process any URL data	*/	cp = index(server->request.path,'?');	if (cp != NULL)	{		*cp = 0;		cp++;		_httpd_storeData(server, cp);	}	return(0);}void httpdEndRequest(server)	httpd	*server;{	_httpd_freeVariables(server->variables);	server->variables = NULL;	shutdown(server->clientSock,2);	close(server->clientSock);	bzero(&server->request, sizeof(server->request));}void httpdFreeVariables(server)        httpd   *server;{        _httpd_freeVariables(server->variables);}void httpdDumpVariables(server)	httpd	*server;{	httpVar	*curVar,		*curVal;	curVar = server->variables;	while(curVar)	{		printf("Variable '%s'\n", curVar->name);		curVal = curVar;		while(curVal)		{			printf("\t= '%s'\n",curVal->value);			curVal = curVal->nextValue;		}		curVar = curVar->nextVariable;	}}void httpdSetFileBase(server, path)	httpd	*server;	char	*path;{	strncpy(server->fileBasePath, path, HTTP_MAX_URL);}int httpdAddFileContent(server, dir, name, indexFlag, preload, path)	httpd	*server;	char	*dir,		*name;	int	(*preload)();	int	indexFlag;	char	*path;{	httpDir	*dirPtr;	httpContent *newEntry;	dirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);	newEntry =  malloc(sizeof(httpContent));	if (newEntry == NULL)		return(-1);	bzero(newEntry,sizeof(httpContent));	newEntry->name = strdup(name);	newEntry->type = HTTP_FILE;	newEntry->indexFlag = indexFlag;	newEntry->preload = preload;	newEntry->next = dirPtr->entries;	dirPtr->entries = newEntry;	if (*path == '/')	{		/* Absolute path */		newEntry->path = strdup(path);	}	else	{		/* Path relative to base path */		newEntry->path = malloc(strlen(server->fileBasePath) +			strlen(path) + 2);		snprintf(newEntry->path, HTTP_MAX_URL, "%s/%s",			server->fileBasePath, path);	}	return(0);}int httpdAddWildcardContent(server, dir, preload, path)	httpd	*server;	char	*dir;	int	(*preload)();	char	*path;{	httpDir	*dirPtr;	httpContent *newEntry;	dirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);	newEntry =  malloc(sizeof(httpContent));	if (newEntry == NULL)		return(-1);	bzero(newEntry,sizeof(httpContent));	newEntry->name = NULL;	newEntry->type = HTTP_WILDCARD;	newEntry->indexFlag = HTTP_FALSE;	newEntry->preload = preload;	newEntry->next = dirPtr->entries;	dirPtr->entries = newEntry;	if (*path == '/')	{		/* Absolute path */		newEntry->path = strdup(path);	}	else	{		/* Path relative to base path */		newEntry->path = malloc(strlen(server->fileBasePath) +			strlen(path) + 2);		snprintf(newEntry->path, HTTP_MAX_URL, "%s/%s",			server->fileBasePath, path);	}	return(0);}int httpdAddCContent(server, dir, name, indexFlag, preload, function)	httpd	*server;	char	*dir;	char	*name;	int	(*preload)();	void	(*function)();{	httpDir	*dirPtr;	httpContent *newEntry;		dirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);	newEntry =  malloc(sizeof(httpContent));	if (newEntry == NULL)		return(-1);	bzero(newEntry,sizeof(httpContent));	newEntry->name = strdup(name);	newEntry->type = HTTP_C_FUNCT;	newEntry->indexFlag = indexFlag;	newEntry->function = function;	newEntry->preload = preload;	newEntry->next = dirPtr->entries;	dirPtr->entries = newEntry;	return(0);}int httpdAddCWildcardContent(server, dir, preload, function)	httpd	*server;	char	*dir;	int	(*preload)();	void	(*function)();{	httpDir	*dirPtr;	httpContent *newEntry;	dirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);	newEntry =  malloc(sizeof(httpContent));	if (newEntry == NULL)		return(-1);	bzero(newEntry,sizeof(httpContent));	newEntry->name = NULL;	newEntry->type = HTTP_C_WILDCARD;	newEntry->indexFlag = HTTP_FALSE;	newEntry->function = function;	newEntry->preload = preload;	newEntry->next = dirPtr->entries;	dirPtr->entries = newEntry;	return(0);}int httpdAddStaticContent(server, dir, name, indexFlag, preload, data)	httpd	*server;	char	*dir;	char	*name;	int	(*preload)();	char	*data;{	httpDir	*dirPtr;	httpContent *newEntry;	dirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);	newEntry =  malloc(sizeof(httpContent));	if (newEntry == NULL)		return(-1);	bzero(newEntry,sizeof(httpContent));	newEntry->name = strdup(name);	newEntry->type = HTTP_STATIC;	newEntry->indexFlag = indexFlag;	newEntry->data = data;	newEntry->preload = preload;	newEntry->next = dirPtr->entries;	dirPtr->entries = newEntry;	return(0);}void httpdSendHeaders(server)	httpd	*server;{	_httpd_sendHeaders(server, 0, 0);}void httpdSetResponse(server, msg)	httpd	*server;	char	*msg;{	strncpy(server->response.response, msg, HTTP_MAX_URL);}void httpdSetContentType(server, type)	httpd	*server;	char	*type;{	strcpy(server->response.contentType, type);}void httpdAddHeader(server, msg)	httpd	*server;	char	*msg;{	strcat(server->response.headers,msg);	if (msg[strlen(msg) - 1] != '\n')		strcat(server->response.headers,"\n");}void httpdSetCookie(server, name, value)	httpd	*server;	char	*name,		*value;{	char	buf[HTTP_MAX_URL];	snprintf(buf,HTTP_MAX_URL, "Set-Cookie: %s=%s; path=/;", name, value);	httpdAddHeader(server,buf);}void httpdOutput(server, msg)	httpd	*server;	char	*msg;{	char	buf[HTTP_MAX_LEN],		varName[80],		*src,		*dest;	int	count;	src = msg;	dest = buf;	count = 0;	while(*src && count < HTTP_MAX_LEN)	{		if (*src == '$')		{			char	*cp,				*tmp;			int	count2;			httpVar	*curVar;			tmp = src + 1;			cp = varName;			count2 = 0;			while(*tmp&&(isalnum(*tmp)||*tmp == '_')&&count2 < 80)			{				*cp++ = *tmp++;				count2++;			}			*cp = 0;			curVar = httpdGetVariableByName(server,varName);			if (curVar)			{				strcpy(dest, curVar->value);				dest = dest + strlen(dest);				count += strlen(dest);			}			else			{				*dest++ = '$';				strcpy(dest, varName);				dest += strlen(varName);				count += 1 + strlen(varName);			}			src = src + strlen(varName) + 1;			continue;		}		*dest++ = *src++;		count++;	}		*dest = 0;	server->response.responseLength += strlen(buf);	if (server->response.headersSent == 0)		httpdSendHeaders(server);	_httpd_net_write( server->clientSock, buf, strlen(buf));}#ifdef HAVE_STDARG_Hvoid httpdPrintf(httpd *server, char *fmt, ...){#elsevoid httpdPrintf(va_alist)        va_dcl{        httpd		*server;        char		*fmt;#endif        va_list         args;	char		buf[HTTP_MAX_LEN];#ifdef HAVE_STDARG_H        va_start(args, fmt);#else        va_start(args);        server = (httpd *) va_arg(args, httpd * );        fmt = (char *) va_arg(args, char *);#endif	if (server->response.headersSent == 0)		httpdSendHeaders(server);	vsnprintf(buf, HTTP_MAX_LEN, fmt, args);	server->response.responseLength += strlen(buf);	_httpd_net_write( server->clientSock, buf, strlen(buf));}void httpdProcessRequest(server)	httpd	*server;{	char	dirName[HTTP_MAX_URL],		entryName[HTTP_MAX_URL],		*cp;	httpDir	*dir;	httpContent *entry;	server->response.responseLength = 0;	strncpy(dirName, httpdRequestPath(server), HTTP_MAX_URL);	cp = rindex(dirName, '/');	if (cp == NULL)	{		printf("Invalid request path '%s'\n",dirName);		return;	}	strncpy(entryName, cp + 1, HTTP_MAX_URL);	if (cp != dirName)		*cp = 0;	else		*(cp+1) = 0;	dir = _httpd_findContentDir(server, dirName, HTTP_FALSE);	if (dir == NULL)	{		_httpd_send404(server);		_httpd_writeAccessLog(server);		return;	}	entry = _httpd_findContentEntry(server, dir, entryName);	if (entry == NULL)	{		_httpd_send404(server);		_httpd_writeAccessLog(server);		return;	}	if (entry->preload)	{		if ((entry->preload)(server) < 0)		{			_httpd_writeAccessLog(server);			return;		}	}	switch(entry->type)	{		case HTTP_C_FUNCT:		case HTTP_C_WILDCARD:			(entry->function)(server);			break;		case HTTP_STATIC:			_httpd_sendStatic(server, entry->data);			break;		case HTTP_FILE:			_httpd_sendFile(server, entry->path);			break;		case HTTP_WILDCARD:			if (_httpd_sendDirectoryEntry(server,entry,entryName)<0)			{				_httpd_send404(server);			}			break;	}	_httpd_writeAccessLog(server);}void httpdSetAccessLog(server, fp)	httpd	*server;	FILE	*fp;{	server->accessLog = fp;}void httpdSetErrorLog(server, fp)	httpd	*server;	FILE	*fp;{	server->errorLog = fp;}void httpdAuthenticate(server, realm)	httpd	*server;	char	*realm;{	char	buffer[255];	if (server->request.authLength == 0)	{		httpdSetResponse(server, "401 Please Authenticate");		snprintf(buffer,sizeof(buffer), 			"WWW-Authenticate: Basic realm=\"%s\"\n", realm);		httpdAddHeader(server, buffer);		httpdOutput(server,"\n");	}}void httpdForceAuthenticate(server, realm)	httpd	*server;	char	*realm;{	char	buffer[255];	httpdSetResponse(server, "401 Please Authenticate");	snprintf(buffer,sizeof(buffer), 		"WWW-Authenticate: Basic realm=\"%s\"\n", realm);	httpdAddHeader(server, buffer);	httpdOutput(server,"\n");}

⌨️ 快捷键说明

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