#include "shrink.h" /************************************************************************ 具体处理模块 *************************************************************************/ #ifdef _NOFS struct constpage cpages[] = /* 页面注册 */ { {"index.html", indexhtml}, {"styles.css", stylescss}, {"cpustate.html", cpustatehtml}, {"gov.Graphic.js", govGraphicjs}, {"controller.html", controllerhtml}, {"about.html", abouthtml}, }; const int cpage_len = sizeof(cpages) / sizeof(*cpages); #endif /************************************************************************ ** Function name: regpath ** Descriptions: 标准化路径:把字符串里的'/'变为'\' ** output parameters: path:待标准化的路径字符串 *************************************************************************/ static void regpath(char * path) { for(;*path != '\0'; path++) { if (*path == '/') { *path = '\\'; } } } /************************************************************************ ** Function name: deal ** Descriptions: 根据method跳转到相应处理 ** output parameters: pr:服务请求指针 *************************************************************************/ void deal(struct request * pr) { if ((pr->query = strchr(pr->uri, '?')) != NULL) { *pr->query++ = '\0'; } #ifdef _WINFS _snprintf(pr->path,PATH_MAX,"%s%s",GETCONF(CONF_ROOT),pr->uri); /* 获得全路径 */ #elif _NOFS strcpy(pr->path,pr->uri); #elif _FLASHFS strcpy(pr->path,pr->uri); #endif regpath(pr->path); if (pr->http_method == HTTP_GET) /* 判断是否GET方法 */ { deal_get(pr); } else if (pr->http_method == HTTP_POST) /* 判断是否POST方法 */ { deal_post(pr); } else /* 两者都不是就出错 */ { errstatus(pr, 501, "Not Implemented", "","Method Not Implemented"); } } /************************************************************************ ** Function name: deal_get ** Descriptions: 处理get方法 ** output parameters: pr:服务请求指针 *************************************************************************/ void deal_get(struct request * pr) { if (iscgi(pr->path)) { deal_cgi(pr); } else if (isfile(pr)) { deal_file(pr); } else if (strlen(pr->uri)==1 && *(pr->uri)=='/' && GETCONF(CONF_DEFAULTPAGE)!=NULL) { deal_defaultpage(pr); } else { errstatus(pr, 404, "Not Found","", "Not Found"); } } /************************************************************************ ** Function name: deal_post ** Descriptions: 处理post方法 ** output parameters: pr:服务请求指针 *************************************************************************/ void deal_post(struct request * pr) { if (iscgi(pr->path)) { deal_cgi(pr); } else //post方法,没用到cgi { errstatus(pr, 501, "Not Implemented", "","Method Not Implemented"); } } /************************************************************************ ** Function name: deal_defaultpage ** Descriptions: 处理默认页面 ** output parameters: pr:服务请求指针 *************************************************************************/ void deal_defaultpage(struct request * pr) { const char *p, *s = GETCONF(CONF_DEFAULTPAGE); char defaultfile[FILENAME_MAX]; char oldpath[PATH_MAX]; int len; memcpy(oldpath,pr->path,sizeof(pr->path)); /* 保存旧的path */ do { if ((p = strchr(s, ',')) != NULL) /* 获取默认页面的url */ { len = p - s; (void) memcpy(defaultfile, s, len); defaultfile[len] = '\0'; } else { (void) strncpy(defaultfile, s, sizeof(defaultfile)); defaultfile[sizeof(defaultfile) - 1] = '\0'; } _snprintf(pr->path,PATH_MAX,"%s%s",oldpath,defaultfile); if (iscgi(pr->path)) { deal_cgi(pr); } else if (isfile(pr)) { deal_file(pr); } else { errstatus(pr, 404, "Not Found","", "Not Found"); } if (pr->io_local.done != 0) { return; } s = p ? p+1 : NULL; } while (s!=NULL); } /************************************************************************ ** Function name: iscgi ** Descriptions: 判断是否是cgi请求 ** input parameters: path:待分析的路径 ** Returned value: 0:不是cgi请求 *************************************************************************/ int iscgi(const char * path) { const char * ext = "cgi"; int pathlen = strlen(path), extlen = strlen(ext); return (pathlen > extlen) && !ncasecmp(path+pathlen-extlen, ext, extlen); } /************************************************************************ ** Function name: isfile ** Descriptions: 判断是否是file请求 ** output parameters: pr:服务请求指针 ** Returned value: 0:不是file请求 *************************************************************************/ int isfile(struct request * pr) { #ifdef _WINFS return (pr->fd = fs_open(pr->path,_O_RDONLY|_O_BINARY,S_IREAD))!= -1; #elif _NOFS return (int)(pr->fd = fs_open(pr->path,0,0)); #elif _FLASHFS return (pr->fd = fs_open(pr->path,0,0))!= -1; #endif // int i; // int len; // for (i=0;ipath+1,cpages[i].pagename,len)) // { // return (int)(pr->fd = fs_open(cpages[i].content,0,0)); // } // } // pr->fd = NULL; // return 0; // #endif }