c语言获取http字符串,C语言解析http请求表单内容

基于C语言的CGI开发

1.[文件] cgi.h ~ 405B     下载(123)

#ifndef CGI_H

#define CGI_H

#include

#include

#include

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     下载(100)

#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     下载(94)

#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     下载(92)

#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     下载(95)

#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     下载(87)

//将十六进制字符转化为十进制数

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     下载(89)

#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     下载(91)

#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);

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值