日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言解析http请求表单内容

發布時間:2023/11/30 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言解析http请求表单内容 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[1].[文件] cgi.h?~?405B????下載(105) 跳至 [1] [2] [3] [4] [5] [6] [7] [8]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #ifndef CGI_H #define CGI_H #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct Node{ ????char *name; ????char *value; ????struct Node *next; }Node; typedef struct Index{ ????Node *head; ????char *buffer; }Index; Index *get_input(); void free_input(Index *); Node *analyze(char *); Node *analy_a(char *); Node *analy_m(char *, char *); char *get_value(Node *, char *); char fun1(char); #endif

[2].[文件] get_input.c?~?965B????下載(85) 跳至 [1] [2] [3] [4] [5] [6] [7] [8]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #include "cgi.h" Index *get_input() { ????//獲得表單發送方法 ????char *get_method = getenv("REQUEST_METHOD"); ????Index *input = (Index *)malloc(sizeof(Index)); ????Node *head; ????char *buffer; ????if (strcmp(get_method,"GET") == 0) { ????????char *get_str = getenv("QUERY_STRING"); ????????if (get_str == NULL || *get_str == 0) { ????????????return NULL; ????????} ????????//get方法,通過環境變量得到內容 ????????buffer = (char *)malloc(strlen(get_str) + 1); ????????strcpy(buffer, get_str); ????????//對內容進行解析,以鏈表的形式存在 ????????head = analy_a(buffer); ????} else if (strcmp(get_method,"POST") == 0){ ????????int get_len = atoi(getenv("CONTENT_LENGTH")); ????????if (get_len == 0) { ????????????return NULL; ????????} ????????//post方法,通過標準輸入讀取內容 ????????buffer = (char *)malloc(get_len + 1); ????????memset(buffer,0,get_len + 1); ????????int n = fread(buffer, 1,get_len, stdin); ????????if (n != get_len) { ????????????fprintf(stderr,"Read error!"); ????????} ????????head = analyze(buffer); ????} ????//鏈表頭 ????input -> head = head; ????//接受到的字符串 ????input -> buffer = buffer; ????return input; }

[3].[文件] analyze.c?~?610B????下載(81) 跳至 [1] [2] [3] [4] [5] [6] [7] [8]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include "cgi.h" //post方法獲取的內容進行解析 Node *analyze(char *buffer) { ????//獲取內容格式 ????char *c_type = getenv("CONTENT_TYPE"); ????char *bound; ????fprintf(stderr,"debug:c_type is %s\n",c_type); ????if (strcmp("application/x-www-form-urlencoded",c_type) == 0) { ????????//該格式表明獲取內容為"name=value"形式 ????????return analy_a(buffer);???? ????} else if (strcmp("text/plain", c_type) == 0) { ????????//此種編碼格式暫不討論 ????} else { ????????//編碼格式為multipart/form-data,適用大流量數據傳送 ????????//獲取等號后面的分隔符 ????????bound = index(c_type,'=') + 1; ????????fprintf(stderr,"debug:bound is %s\n",bound); ????????return analy_m(buffer, bound); ????} }

[4].[文件] analy_a.c?~?961B????下載(78) 跳至 [1] [2] [3] [4] [5] [6] [7] [8]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include "cgi.h" //編碼格式為'application/x-www-form-urlencoded'的內容 Node *analy_a(char *buffer) { ????//創建第一個節點 ????Node *head = (Node *)malloc(sizeof(Node)); ????Node *temp = head; ????temp -> name = buffer; ????char *b_temp = buffer; ????//通過移動、改變部分字符來分離字符串 ????while (*buffer != 0) { ????????if (*buffer == '=') { ????????????//'=',則表示name已經結束,value將開始 ????????????*b_temp = 0; ????????????temp -> value = b_temp + 1;? ????????}else if (*buffer == '+') { ????????????//'+'代表空格 ????????????*b_temp = ' '; ????????}else if (*buffer == '%') { ????????????//'%'則緊跟兩位十六進制表示的特殊字符 ????????????*b_temp = fun1(*(buffer + 1)) * 16 + fun1(*(buffer + 2)); ????????????buffer += 2; ????????} ????????else if (*buffer == '&') { ????????????//'&'表示value已經結束,name即將開始 ????????????*b_temp = 0; ????????????//重新申請內存,存儲新內容地址 ????????????temp -> next = (Node *)malloc(sizeof(Node)); ????????????temp = temp -> next; ????????????temp -> name = b_temp + 1;?? ????????}else { ????????????*b_temp = *buffer; ????????} ????????buffer++; ????????b_temp++;?????????? ????} ????//最后一個結束符 ????*b_temp = 0; ????return head; }

[5].[文件] analy_m.c?~?1KB????下載(80) 跳至 [1] [2] [3] [4] [5] [6] [7] [8]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include "cgi.h" //編碼格式為'multipart/form-data'的內容 Node *analy_m(char *buffer, char *bound) { ????char *start; ????char *end; ????//第一個節點 ????Node *head = (Node*)malloc(sizeof(Node)); ????Node *temp = head; ????fprintf(stderr,"debug:buffer is %s\n", buffer); ????//開始解析內容,name在兩個雙引號之間(詳見編碼格式) ????temp -> name = index(buffer, '"') + 1; ????end = index(temp -> name, '"'); ????*end = 0; ????fprintf(stderr,"debug:temp->name is %s\n", temp -> name); ????//中間間隔了兩個"\r\n" ????temp -> value = end + 5; ????buffer = strstr(temp -> value, bound); ????//到下一個間隔符,上面間隔兩個"\r\n" ????*(buffer - 4) = 0; ????fprintf(stderr,"debug:temp->valu is %s\n", temp -> value); ????while ((start = strstr(buffer,"name=")) != NULL) { ????????//循環獲取name與value地址,直到沒有name為止 ????????temp -> next = (Node *)malloc(sizeof(Node)); ????????temp = temp -> next; ????????temp -> name = index(start, '"') + 1; ????????end = index(temp -> name, '"'); ????????*end = 0; ????????fprintf(stderr,"debug:temp->name is %s\n", temp -> name); ????????temp -> value = end + 5; ????????buffer = strstr(temp -> value, bound); ????????*(buffer - 4) = 0; ????????fprintf(stderr,"debug:temp->valu is %s\n", temp -> value); ????} ????return head; }

[6].[文件] fun1.c?~?203B????下載(76) 跳至 [1] [2] [3] [4] [5] [6] [7] [8]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 //將十六進制字符轉化為十進制數 char fun1(char ch) { ????char buffer; ????if (ch < 'A') { ????????buffer = ch - 48;?????????????????????????? ????}else if (ch < 'a'){ ????????buffer = ch - 55; ????}else { ????????buffer = ch - 87; ????} ????return buffer;? }

[7].[文件] get_value.c?~?241B????下載(77) 跳至 [1] [2] [3] [4] [5] [6] [7] [8]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include "cgi.h" //根據name獲取相應的value char *get_value(Node *head, char *name) {?? ????Node *p; ????while (head != NULL) { ????????if (strcmp(head -> name, name) == 0) { ????????????return head -> value; ????????} ????????p = head -> next; ????????head = p; ????} ????return NULL; }

[8].[文件] free_input.c?~?222B????下載(79) 跳至 [1] [2] [3] [4] [5] [6] [7] [8]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include "cgi.h" //釋放動態獲取的內存 void free_input(Index *index) { ????Node *temp = index -> head; ????Node *p; ????while (temp != NULL) { ????????p = temp -> next; ????????free(temp); ????????temp = p; ????} ????free(index -> buffer); ????free(index); }

總結

以上是生活随笔為你收集整理的C语言解析http请求表单内容的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。