📄 api.c
字号:
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 + -