[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请求表单内容相关推荐

  1. jQuery中的ajax、jquery中ajax全局事件、load实现页面无刷新局部加载、ajax跨域请求jsonp、利用formData对象向服务端异步发送二进制数据,表单序列化(异步获取表单内容)

    jQuery中使用ajax: 在jQuery中使用ajax首先需要引入jQuery包,其引入方式可以采用网络资源,也可以下载包到项目文件中,这里推荐下载包到文件中:市面上有多个版本的jQuery库,这 ...

  2. python:Fastapi - 请求表单与文件

    简单絮叨下,如有问题请私信 上篇文章主要唠了接口响应的一些东西,今天主要是唠Form表单和文件处理.表单可以理解为数据采集,而文件处理就是在获得客户端的文件进行数据返回或者直接上传服务器. fasta ...

  3. django通过ajax请求接口返回多条数据,并动态生成表格,请求表单后将表格数据并入库

    一.最近在做接口相关的开发,需求是这样的,通过一个接口所需要传递的参数,调用接口后,处理接口响应的参数,返回多条数据,并动态生成表格,请求表单后将表格的数据入库,下面是我改过的代码,跟实际代码有些出入 ...

  4. okhttp的post同步请求表单提交

    HttpUtil工具类 import lombok.extern.slf4j.Slf4j; import okhttp3.*; import okhttp3.internal.platform.Pla ...

  5. 8 jquery 获取 form 表单内容

    8 jquery 获取 form 表单内容 有时,我们需要获取表单内容进行发送ajax请求,通过函数方式比较方便. $("#title").serialize() 获取一个序列化的 ...

  6. php js获取表单内容,jquery form表单获取内容以及绑定数据_javascript技巧

    在日常开发的过程中,难免会用到form表单,我们需要获取表单的数据保存到数据库,或者拿到后台的一串json数据,要将数据绑定到form表单上,这里我写了一个基于jquery的,formHelp插件,使 ...

  7. webform快速创建表单内容文件--oracle 数据库

    使用方法 前台页面这样写就足够了 <form class="stdform" runat="server"><div id="fie ...

  8. 标准化设计解决方案 - 标记语言和样式手册 表单

    互动性一直是互联网的重点,让使用者与网站能够交换信息,彼此沟通.表单使我们能够有组织的,使用同一方式的从使用者那里收集资料,因此在设计网站时总是属于"任何状况都能拿来用"的那一类, ...

  9. 微信小程序提交后自动清空表单内容

    分析情况 若表单数据非常多,通过value绑定清除会非常麻烦 找不到代码调用form的reset的接口 解决思路 form使用bindreset事件提交数据,而不是使用bindsubmit事件,这样点 ...

最新文章

  1. 威纶通触摸屏与mysql_威纶通 与 信捷XC\XD系列PLC 通讯
  2. 键盘上每个键作用!!!
  3. 干活干累了,刷一道题,一天保底两道,一年也就差不多刷完了 ----------7. Reverse Integer...
  4. HLG1159 MAGI System【大整数乘法】
  5. Spring 面试题(2021最新版)赶紧收藏!
  6. 树莓派用服务方式设置开机启动
  7. String 对象内存分配策略
  8. java实现ldap服务器_Java到LDAP教程(包括如何安装LDAP服务器/客户端)
  9. JAVA程序员面试必知32个知识点
  10. robot:根据条件主动判定用例失败或者通过
  11. java listview颜色_[摘]android listview选中某一行,成选中状态颜色高亮显示
  12. Java 主流垃圾收集器
  13. 视觉SLAM十四讲学习笔记专栏汇总
  14. android4.0 锁屏实现(转)
  15. rdlc报表输入中文出现小方块
  16. Android如何判断输入框是否为空
  17. 自然语言处理——语言模型(三)
  18. Learning Efficient Single-stage Pedestrian Detectors by Asymptotic Localization Fitting行人检测ECCV2018
  19. 小区报修管理系统c语言,小区物业报修管理系统的设计与实现.pdf
  20. 【NLP】4 gensim word2vec库入门——官方手册embeddings和KeyedVectors

热门文章

  1. 洛谷 P1968 美元汇率
  2. 二、先在SD卡上启动U-boot,再烧写新的U-boot进Nandflash
  3. bzoj 2007 [Noi2010]海拔——最小割转最短路
  4. 2018-2019-1 20165203 《信息安全系统设计基础》第六周学习总结
  5. springmvc学习笔记--mybatis--使用插件自动生成实体和mapper
  6. Python中如何读取xml的数据
  7. CFUpdate上传控件的使用
  8. SilverLight学习笔记--Silverlight中WebService通讯
  9. centos7 python3安装numpy_centos 7 下安装numpy、scipy等python包
  10. python3读取ini文件_python3配置文件ini读取方法