gpt4 book ai didi

c - 以最有效的方式读取 CGI POST 数据

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:07 25 4
gpt4 key购买 nike

我非常需要一种方法来挖掘潜在的大量 CGI 提供的 POST 数据。

读取 GET 数据没什么大不了的,因为我可以随心所欲地重新请求 QUERY_STRING 环境变量,但是使用通过 stdin< 提供的 POST 数据。我只能读一次,必须将它存储在某个地方。

我当前的方法包括读取一个临时文件中的所有 POST 数据,该临时文件将在程序退出时被删除,并扫描它以找到我想要找到的键。在 GET 解析方法中,我可以只对 QUERY_STRING 进行 strtok(),因为 GET 数据的限制非常低,因此可以安全地在 RAM 中获取数据,但是 POST 数据可以是从空到“name=Bob”到 4 Gigabye 电影的任何内容文件。

所以,这是我目前的做法:

int get_post_data(const char *s_key, char *target, size_t target_size)
{
FILE *tmp;
int ret_val = -1;

/* postdata_temp = global variable containing the temporary file name */
if ((tmp = fopen(postdata_tempfile, "r")) == NULL)
return -1;
else
{
char *buffer = NULL;
char *temp_buffer = NULL;
int buffer_size;
int i;

if ((buffer = malloc(BUFFER_SIZE)) == NULL)
return -1;

memset(buffer, 0, sizeof(BUFFER_SIZE));
buffer_size = BUFFER_SIZE;

for (i = 0;; i++)
{
int c = fgetc(tmp);

if ((c == '&') || feof(tmp))
{
char *key = strtok(buffer, "=");
char *val = strtok(NULL, "");

if (key)
{
if (strcmp(s_key, key) == 0)
{
if (val)
{
strncpy(target, val, target_size);
ret_val = strlen(val);
}
else
{
target = NULL;
ret_val = 0;
}

break;
}
}

if (feof(tmp))
break;

memset(buffer, 0, buffer_size);
i = -1; /* because it will be 0 when the fgetc() is called the
* next time */
}
else
{
if (!(i < buffer_size))
{
buffer_size += BUFFER_SIZE;

if ((temp_buffer = realloc(buffer, buffer_size)) == NULL)
{
free(temp_buffer);
free(buffer);
target = NULL;

return -1;
}
else
buffer = temp_buffer;
}

buffer[i] = c;
}

}

free(buffer);

// printf("Final buffer size: %d<br />\n", buffer_size);
}

fclose(tmp);

return ret_val;
}

这确实有效,我可以调用 get_post_data("user_password", pass, sizeof(pass));,检查返回值(<0 = 错误,=0 = 键存在但值为 NULL,>0 = 数据长度),但看起来太肥胖了。我的意思是..我想搜索的每个 POST 参数都有巨大的 IO 开销,只是为了不让我的 RAM 中的整个字符串用于上传可能的大文件?

Stackoverflow 是怎么想的?

最佳答案

如果您想避免将大文件加载到 RAM 中,您可以使用内存映射文件 - 不可移植,但这是正确的方法。如果您的平台是 POSIX,您可以为此使用 mmap()

顺便说一句,我没有完全阅读或测试您的代码,但我想知道使用 strtok() 是否正确,因为它会破坏数据。如果您的数据可能是二进制文件,我也想知道如何使用 str...() 函数,但我不知道 CGI 部分是如何工作的,所以您可能就在那里。

关于c - 以最有效的方式读取 CGI POST 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3242904/

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