- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码来处理 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/
我有以下代码来处理 microhttp 服务器中的 POST 数据: #include #include #include #include #include #define PAGE "l
我是一名优秀的程序员,十分优秀!