gpt4 book ai didi

c - 用 C 处理 microhttp 服务器中的 POST 数据

转载 作者:行者123 更新时间:2023-11-30 15:10:03 25 4
gpt4 key购买 nike

我有以下代码来处理 microhttp 服务器中的 POST 数据:

#include <microhttpd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>

#define PAGE "<html><head><title>libmicrohttpd demo</title>"\
"</head><body>libmicrohttpd demo!!</body></html>"

struct postStatus {
bool status;
char *buff;
};


static int ahc_echo(void * cls,
struct MHD_Connection * connection,
const char * url,
const char * method,
const char * version,
const char * upload_data,
size_t * upload_data_size,
void ** ptr) {
const char * page = cls;
struct MHD_Response * response;
int ret;

struct postStatus *post = NULL;
post = (struct postStatus*)*ptr;

if(post == NULL) {
post = malloc(sizeof(struct postStatus));
post->status = false;
*ptr = post;
}

if(!post->status) {
post->status = true;
return MHD_YES;
} else {
if(*upload_data_size != 0) {
post->buff = malloc(*upload_data_size + 1);
snprintf(post->buff, *upload_data_size,"%s",upload_data);
*upload_data_size = 0;
return MHD_YES;
} else {
printf("Post data: %s\n",post->buff);
free(post->buff);
}
}

if(post != NULL)
free(post);

response = MHD_create_response_from_buffer (strlen(page),
(void*) page,
MHD_RESPMEM_PERSISTENT);
ret = MHD_queue_response(connection,
MHD_HTTP_OK,
response);
MHD_destroy_response(response);
return ret;
}

int main(int argc,
char ** argv) {
struct MHD_Daemon * d;

d = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY,
9000,
NULL,
NULL,
&ahc_echo,
PAGE,
MHD_OPTION_END);
if (d == NULL)
return 1;
sleep(10000);
MHD_stop_daemon(d);
return 0;
}

我尝试以下 CURL 命令来测试 POST 数据处理:

curl -XPOST -d '{"email":"test@gmail.com","password":"test"}' 'http://192.168.1.17:9000'

但我得到输出{"email":"test@gmail.com","password":"test"。我没有得到最后一个 }。我也尝试了更大长度的 json 输入。还是一样。无法获取最后一个大括号。有人可以帮忙吗?

谢谢

编辑:我成功了。我使用了 strncpy(post->buff, upload_data, *upload_data_size) 而不是 snprintf

有人可以解释一下为什么 snprintf 不起作用吗?

最佳答案

ahc_echo() 将针对该请求至少调用两次。请求数据可能会分成多个调用,并且这种碎片非常随机(取决于请求的缓冲方式以及套接字上的每个 read() 调用返回的内容)。因此,您当前的代码只能处理小请求,但仍然不安全。

MHD_create_post_processor() 是解析此部分缓冲区的助手。

https://www.gnu.org/software/libmicrohttpd/tutorial.html#Processing-POST-data经历了这个

原因

 snprintf(post->buff, *upload_data_size,"%s",upload_data);

不起作用,这是应该的

 snprintf(post->buff, *upload_data_size + 1,"%s",upload_data);

为了匹配 malloc() 中使用的内存大小,它为\0 终止符留有空间。

strncpy(post->buff, upload_data, *upload_data_size);

实际上很危险,因为它应该是

strncpy(post->buff, upload_data, *upload_data_size);
post->buff[*upload_data_size] = 0;

由于您需要确保结果以零结尾(幸运的是内存现在已经包含零,因此这是使用 malloc() 时的随机行为,而不是 calloc ()),并且将副本大小增加到 *upload_data_size + 1 是错误的,因为这会使源溢出一个字节,其中还包含随机数据,甚至可能包含无效内存.

关于c - 用 C 处理 microhttp 服务器中的 POST 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36416422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com