一、参考网址

  1、源码的github地址

二、网页是采用文件读写方式,还是转换为数组方式?

  1)其通过宏定义“WEBS_PAGE_ROM”来区分,我是在websPageReadData()(page.c)函数源码发现的

int websPageReadData(webs_t wp, char *buf, int nBytes)
{ #ifdef WEBS_PAGE_ROM
a_assert(websValid(wp));
return websRomPageReadData(wp, buf, nBytes);
#else
a_assert(websValid(wp));
return read(wp->docfd, buf, nBytes);
#endif
}

 2) 其保存网页的数组定义:websRomPageIndexType websRomPageIndex[], 其内部有个Page成员指向网页数组数据:

/*
* Compiled Rom Page Index
*/
typedef struct {
char_t *path; /* Web page URL path */
unsigned char *page; /* Web page data */
int size; /* Size of web page in bytes */
int pos; /* Current read position */
} websRomPageIndexType;

  3) websRomPageIndex[]数组初始化过程

      websRomOpen()

        symEnter(romTab, name, valueInteger((int) wip), 0); //填充到sym[romTab]中

  4) 从数组中读出网页的过程:

    websDefaultHandler 注册了写事件处理

      websDefaultWriteEvent

        websPageReadData

           websRomPageReadData

2、输入URL时,其默认网页定义

  在initwebs()函数中有UrlHandlerDefine(T("/"), NULL, 0, websHomePageHandler, 0); 

  其websHomePageHandler()定义如下:

static int websHomePageHandler(webs_t wp, char_t *urlPrefix, char_t *webDir,
int arg, char_t *url, char_t *path, char_t *query)
{
/*
* If the empty or "/" URL is invoked, redirect default URLs to the home page
*/
if (*url == '\0' || gstrcmp(url, T("/")) == ) {
websRedirect(wp, T("home.asp"));
return ;
}
return ;
}

3、浏览器提交的数据处理流程

  initWebs() (main.c)

    websOpenServer(port, retries);

      websOpenListen(port, retries);

        socketOpenConnection(NULL, port, websAccept, 0); 中的websAccept

          int websAccept(int sid, char *ipaddr, int port, int listenSid)

            socketCreateHandler(sid, SOCKET_READABLE, websSocketEvent, (int) wp);

              static void websSocketEvent(int sid, int mask, int iwp)

                void websReadEvent(webs_t wp)

                   websUrlHandlerRequest(wp)

                     sp = &websUrlHandler[i]; 其数组内容由websUrlHandlerDefine()函数填充           

                     if ((*sp->handler)(wp, sp->urlPrefix, sp->webDir, sp->arg,
                      wp->url, wp->path, wp->query))

                        int websFormHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,

                          char_t *url, char_t *path, char_t *query)

                             sp = symLookup(formSymtab, formName);// formSymtab数组内容由websFormDefine()函数填充

                             fn = (int (*)(void *, char_t *, char_t *)) sp->content.value.integer;

                             (*fn)((void*) wp, formName, query); 最后的表单处理函数,

4、对浏览器提交的数据处理,移植需要注意的两步(即最后两步)

  1)先由websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0);中注册的websFormHandler()函数处理

    其内部有怎么一段:fn = (int (*)(void *, char_t *, char_t *)) sp->content.value.integer;

             (*fn)((void*) wp, formName, query); 

 int websFormHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,
char_t *url, char_t *path, char_t *query)
{
printf("formhandler %s ----- %d\n", __func__, __LINE__);
sym_t *sp;
char_t formBuf[FNAMESIZE];
char_t *cp, *formName;
int (*fn)(void *sock, char_t *path, char_t *args); a_assert(websValid(wp));
a_assert(url && *url);
a_assert(path && *path == '/'); websStats.formHits++; /*
* Extract the form name
*/
gstrncpy(formBuf, path, TSZ(formBuf));
printf("path:%s\n", path);
printf("formbuf:%s\n", formBuf);
if ((formName = gstrchr(&formBuf[], '/')) == NULL) {
websError(wp, , T("Missing form name"));
return ;
}
//printf("111formname:%s\n", formName);
formName++;
//printf("222formname:%s\n", formName);
#if 1
if ((cp = gstrchr(formName, '/')) != NULL) //后续"/"之后的都失效
{
*cp = '\0';
}
#endif
//printf("333formname:%s\n", formName);
/*
* Lookup the C form function first and then try tcl (no javascript support
* yet).
*/
sp = symLookup(formSymtab, formName);
if (sp == NULL) {
websError(wp, , T("Form %s is not defined"), formName);
} else {
fn = (int (*)(void *, char_t *, char_t *)) sp->content.value.integer;
a_assert(fn);
if (fn) {
/*
* For good practice, forms must call websDone()
*/
(*fn)((void*) wp, formName, query); /*
* Remove the test to force websDone, since this prevents
* the server "push" from a form>
*/
#if 0 /* push */
if (websValid(wp)) {
websError(wp, , T("Form didn't call websDone"));
}
#endif /* push */
}
}
return ;
}

  2) 然后根据URL中判断是哪个表单,然后调用相应的在initWebs()函数中用websFormDefine()注册的回调函数:

      如:websFormDefine(T("gpio_p24"), on_gp24_set); 则表示URL中末尾是gpio_p24,则调用on_gp24_set()函数

int websFormDefine(char_t *name, void (*fn)(webs_t wp, char_t *path,
char_t *query))
{
//1 printf("formdefine %s ----- %d\n", __func__, __LINE__);
a_assert(name && *name);
a_assert(fn); if (fn == NULL) {
return -;
} symEnter(formSymtab, name, valueInteger((long) fn), );
return ;
}

3

goahead(web服务器)分析的更多相关文章

  1. java实现简单web服务器(分析+源代码)

    在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.为了简 ...

  2. web服务器分析与设计(一)

    自己写一个简单的服务器. 面向对象分析与设计第一步:获取需求(基于用例) 功能:1,支持html静态网页,2,支持常用HTTP请求,且容易扩展支持不现请求 3,可以发布站点 补充:至于对动态网页等高级 ...

  3. web服务器分析与设计(五)--一些总结

    随着年龄与经验的增加,对于软件方面的分析与设计也会有一些新的认识.下面做个近期的总结: 1,关于到底用不用作设计的问题: 在最近两个公司,原有人马是不会作设计(我自己的感觉),也察觉不到作设计的任何冲 ...

  4. web服务器分析与设计(四)

    上篇已经开始了系统内部的分析,并且得到一些分析对象.在整个动作场景中,我们得到了一些粗略的对象.有必要对对象进行分析,合并,再抽象. 实质是职责的合理分配,使得系统合乎功能性,同时得到最大的可扩展,可 ...

  5. web服务器分析与设计(三)

    面向对象分析与设计第二步:健壮性分析,完善对象 通过上一篇的分析,已经得到了构建系统中最重要的对象-----实体对象,它们封装着构成系统最重要的数据,实体数据是系统的生命. 但是光有实体还系统是运转不 ...

  6. web服务器分析与设计(二)

    面向对象分析与设计第二步:寻找对象,建立问题域模型 1,用例场景描述 接上一篇中的用例,编写用例场景 U1: 上网者:打开网站(www.xxx.com) 浏览器:连接网站 目标系统:接受连接 检查连接 ...

  7. goahead web 服务器

    https://blog.csdn.net/xieyihua1994/article/details/74002413

  8. Web服务器性能监控分析与优化

    Web服务器性能监控分析与优化 http://www.docin.com/p-759040698.html

  9. IIS Web服务器日志、日志服务器分析

    IIS Web服务器日志.日志服务器分析 EventLog Analyzer是一款全面的工具,用于审计.管理和跟踪您的Microsoft Internet Information Services(I ...

随机推荐

  1. mapper语句的一些问题,union连表查询和mapper中根据条件不同采用不同语句的查询问题

    根据业务要求,不同表查出来的内容天需要一起展示出来,并且还有分页之类的,不同表查询字段也不完全相同,这样就有一个问题,不同表如何接合在一起,不同字段怎么办? 这个问题就需要用到union联合查询,并将 ...

  2. 解决CSS背景模糊

    .banner{ background:url(banner.jpg); -moz-background-size:100% 100%; background-size:100% 100%; }

  3. 干货分享|Critique Essay写作解析

    Critique essay要求学生对另一篇文章进行批判性分析,通常是一本书.期刊文章或论文.不管你的专业是什么,你可能会被要求在某个时候写一篇Critique essay.拿心理学专业举例,评论一篇 ...

  4. AVCodecContext 结构体

    typedef struct AVCodecContext { int bit_rate; int frame_number; //扩展数据,如mov 格式中audio trak 中aac 格式中es ...

  5. iOS下JS与原生的交互二

    本篇主要讲的是UIWebView和JS的交互,UIWebView和JS交互的详解https://www.cnblogs.com/llhlj/p/6429431.html 一. WKWebView调用J ...

  6. CSS position定位属性

    css中的position属性是用于设置元素位置的定位方式 它有以下几种取值: static:默认定位方式,子容器在父容器中按照默认顺序进行摆放 absolute:绝对定位,元素不占据父容器空间,相当 ...

  7. 使用js检测页面是在electron app中运行还是在浏览器中运行

    <script type="text/javascript"> var userAgent = navigator.userAgent.toLowerCase() ){ ...

  8. 洛谷 P5663 加工零件

    题目传送门 解题思路: 最暴力的做法: bfs模拟,每次将一个阶段的所有点拿出来,将其所有直连的点都放进队列,知道本阶段结束,最后看1号点会不会在最后一个阶段被放入队列.(洛谷数据40分) 优化了一下 ...

  9. jdk 的安装教程

    1. 配置的位置 鼠标右击计算机----属性-----高级系统设置---环境变量----在系统变量中配置(推荐) 2.增加环境变量 (1)新建 -----  变量名:   JAVA_HOME 变量值 ...

  10. [SDOI2016]游戏(树剖+李超树)

    趁着我把李超树忘个一干二净的时候来复习一下吧,毕竟马上NOI了. 题解:看着那个dis就很不爽,直接把它转换成深度问题,然后一条直线x->y,假设其lca为z,可以拆分成x->z和z-&g ...