Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4471391
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-03-25 13:08:53

   介绍完主线逻辑之后,再来看看上面用到的 error_msg函数和parse_uri函数

  1. ######################
  2. ### 将出粗信息返回给客户端浏览器

  3. void error_msg(int fd, char *cause, char *errnum,
  4.          char *shortmsg, char *longmsg)
  5. {
  6.     char buf[MAXLINE], body[MAXLINE];

########################
### 组合HTML格式HTTP响应

### sprintf函数:格式换字符输入
  1.     sprintf(body, "Error");
  2.     sprintf(body, "%s"ffffff"">\r\n", body);
  3.     sprintf(body, "%s%s: %s\r\n", body, errnum, shortmsg);
  4.     sprintf(body, "%s

    %s: %s\r\n", body, longmsg, cause);

  5.     sprintf(body, "%s
    Mini Web server\r\n"
    , body);

### 将HTTP响应写入fd(忽略了出错处理)
  1. @    sprintf(buf, "HTTP/1.0 %s %s\r\n", errnum, shortmsg);
  2.     write(fd, buf, strlen(buf));
  3.     sprintf(buf, "Content-type: text/html\r\n");
  4.     write(fd, buf, strlen(buf));
  5.     sprintf(buf, "Content-length: %d\r\n\r\n", (int)strlen(body));
  6.     write(fd, buf, strlen(buf));
  7.     write(fd, body, strlen(body));
  8. }

我们需要按照HTTP响应的规范来给浏览器端发送错误信息,响应行的格式为“”, 这体现在 @ 这一行,接下去还发送了“content-type”和“content-length”信息,以及标志HTTP响应结束的空行。


parse_uri函数的实现
  1. ##############
  2. ### 解析 URI 并保存参数filename 和 CGI args 如果是CGI请求,返回1,否则如果是静态请求,则返回0

  3. int parse_uri(char *uri, char *filename, char *cgiargs)
  4. {
  5.     char *ptr;

### 通过 uri 有无 “gi-bin”来判断所要求的是静态还是动态的内容。如果是静态内容,cigiargs设为空串,将
###  uri 补充为完整路径(以当前目录为前缀),且将默认的网页设置为 “index.html”
  1.     if (!strstr(uri, "cgi-bin")) { /* Static content */
  2.         strcpy(cgiargs, "");
  3.      strcpy(filename, "."); /*serve the current directory*/
  4.      strcat(filename, uri);
  5.      if (uri[strlen(uri)-1] == '/')
  6.      strcat(filename, "index.html");
  7.         return 0;
  8.     }

### 如果是动态内容,则解析cgiargs。按照 CGI 的规范,参数和 URI通过问号 “?”来隔开,且在参数之间用符号“&”进
### 分隔,按照这种规范 解析 CGI 的参数串,存入cgiargs 中。
  1.     else { /* CGI request */
  2.      ptr = index(uri, '?');
  3.      if (ptr) {
  4.      strcpy(cgiargs, ptr+1);
  5.      *ptr = '\0';
  6.      }
  7.      else
  8.      strcpy(cgiargs, "");
  9.     
  10.         strcpy(filename, ".");
  11.      strcat(filename, uri);
  12.      return 1;
  13.     }
  14. }

### parse_uri 函数返回值来表示所请求的是静态网页还是CGI程序
0:表示请求静态网页,
1:表示CGI程序







阅读(667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~