上一小节已经实现了对图片的传输,接下来就是判断文件是否为js,css,png等格式。我们增加一个函数用于判断格式
1 int WebServer::get_filetype(char *type,char *path)//用于判断该url指向文件的后缀 2 { 3 if(strstr(path,".html")) 4 strcpy(type,"text/html"); 5 else if(strstr(path,".gif")) 6 strcpy(type,"image/gif"); 7 else if(strstr(path,".jpg")) 8 strcpy(type,"image/jpeg"); 9 else if(strstr(path,".png"))10 strcpy(type,"image/png");11 else if(strstr(path,".ico"))12 strcpy(type,"image/x-icon");13 else if(strstr(path,".js"))14 strcpy(type,"text/javascript");15 else if(strstr(path,".json"))16 strcpy(type,"application/json");17 else if(strstr(path,".css"))18 strcpy(type,"text/css");19 else20 strcpy(type,"text/plain");21 return 0;22 }
然后修改一下主页index.html的文件
1 2 3Test 4 5 6 7 8 9 10图片11 12 13
两个外部文件如下
1 [myuser@bogon www]$ cat style.css2 .ceshi {font-size:20px; color:#ff0000;}3 [myuser@bogon www]$ cat javascript.js4 function hi()5 {6 alert("js 调用,你单机了按钮");7 }8 [myuser@bogon www]$
下面这个是运行的结果图
用chrome浏览器的F12调试工具获取到的状态,可以看到,该网页可以获取到index.html,然后浏览器会根据这个页面再发送index.html文件所需要的外部文件的请求,从上面可以看出请求了style.css,javascript.js和ab.jpg图片。然后显示网页,我单击了那个button也是可以调用js脚本的。
接下来就是判断一个提交是get还是post,网页index.html的源代码
1 217图片3 4 5
6 使用post方式 7
18 使用get方式19 29
修改后的ServerRequest函数
1 int WebServer::ServerRequest(int cli_fd) 2 { 3 char buf[1024]; 4 int size=1024; 5 int i,j; 6 char method[255];//用于保存请求方式 7 char url[512]; 8 char path[1024]; 9 char args[1024]; 10 struct stat st; 11 int cgi;//cgi 为0 表示get普通方法 1表示get带参方法 2表示post方法 12 pid_t pid; 13 memset(buf,0,sizeof(buf)); 14 cgi=0; 15 //获取第一行请求信息 一般格式为: GET / HTTP/1.1 16 // POST / HTTP/1.1 17 size=get_line(cli_fd,buf,sizeof(buf)); 18 //cout<<"\t\t"<< 此次请求的地址为:"< <<":"< < 0) && strcmp("\n",buf))//去除掉多余的请求头信息 88 size=get_line(cli_fd,buf,sizeof(buf)); 89 Page_404(cli_fd); 90 } 91 else 92 { 93 if(S_ISDIR(st.st_mode))//判断url地址,如果是个目录,那么就访问该目录的index.html 94 { 95 strcat(path,"/index.html"); 96 //cout<<"此次请求的地址为:"< < 0) && strcmp("\n",buf))//去除掉多余的请求头信息116 size=get_line(cli_fd,buf,sizeof(buf));117 ServerGetFunction(cli_fd,path,args);118 }119 }120 else if(cgi==2)//post方法121 {122 pid=fork();123 if(pid==0)124 {125 int content_length=0;126 while((size>0) && strcmp("\n",buf))//去除掉多余的请求头信息127 {128 size=get_line(cli_fd,buf,sizeof(buf));129 buf[15]='\0';130 if(strcasecmp(buf,"Content-Length:")==0)131 {132 content_length=atoi(&(buf[16]));133 }134 }135 if(content_length==0)136 {137 Page_400(cli_fd);138 return 0;139 }140 char c;141 j=0;142 for(int i=0;i
增加的两个处理cgi程序的函数(下小节实现)
1 int WebServer::ServerGetFunction(int cli_fd,char *path,char *args) 2 { 3 cout<<"cli_fd:"<<<" path:"< <<" args:"< <
下面这个是运行的结果
从上图可以看出通过GET方法和POST方法都可以正常的获取到从表单那里传过去的参数。我们知道中文在url地址中的显示是显示成16进制的。这个是URL编码。接下来要实现对这个URL编码进行转换,这里使用网上别人提供的代码。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 static int php_htoi(char *s) 9 {10 int value;11 int c;12 13 c = ((unsigned char *)s)[0];14 if (isupper(c))15 c = tolower(c);16 value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;17 18 c = ((unsigned char *)s)[1];19 if (isupper(c))20 c = tolower(c);21 value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;22 23 return (value);24 }25 /*26 *URL解码,提取自PHP 5.2.1727 *用法:string urldecode(string str_source)28 *时间:2012-8-14 By Dewei29 * */30 string urldecode(string &str_source)31 {32 char const *in_str = str_source.c_str();33 int in_str_len = strlen(in_str);34 int out_str_len = 0;35 string out_str;36 char *str;37 38 str = strdup(in_str);39 char *dest = str;40 char *data = str;41 42 while (in_str_len--) {43 if (*data == '+') {44 *dest = ' ';45 }46 else if (*data == '%' && in_str_len >= 2 && isxdigit((int) *(data + 1))47 && isxdigit((int) *(data + 2))) {48 *dest = (char) php_htoi(data + 1);49 data += 2;50 in_str_len -= 2;51 } else {52 *dest = *data;53 }54 data++;55 dest++;56 }57 *dest = '\0';58 out_str_len = dest - str;59 out_str = str;60 free(str);61 return out_str;62 }63 64 int main()65 {66 string str="username=%E7%99%BB%E5%BD%95";67 string out=urldecode(str);68 cout< <
我们通过在传参的时候调用urldecode进行解码就可以实现中文显示了。
这一节就到这里,下一小节将实现对cgi的支持。
参考资料:
: (关于URL编码解码代码)
本文地址: