请忽略此问题,问题似乎出在werkzeug
上。
我相信我在libcurl版本7.29(CentOS 7)中检测到使用curl_easy_perform
发送的GET请求的 Content-Type 有问题。
问题在于请求中存在HTTP标头 Content-Type (值为空):
Content-Type:
在带有libcurl 7.58的Ubuntu 18.04中,不会发生此问题(如预期的那样,请求中不存在标头)。我搜索了Changlogs,但未找到有关此假定修复的任何信息。我确实发现有人提到过PHP-curl库中修复的同一错误。
所以,我的问题很简单:这种行为是否已固定在7.29和7.58之间的某个位置上?
我只是做了一个尽可能短的测试实现,以查看问题所在。 这是完整的代码:
#include <stdio.h> // fprintf, ...
#include <stdlib.h> // exit
#include <curl/curl.h> // curl
#include <curl/curlver.h> // VERSION
int main(int argC, char* argV[])
{
CURL* curlP;
CURLcode cc;
printf("curl version: %s\n", LIBCURL_VERSION);
curlP = curl_easy_init();
if (curlP == NULL)
{
fprintf(stderr, "curl_easy_init failed: %s\n", curl_easy_strerror(cc));
exit(1);
}
curl_easy_setopt(curlP, CURLOPT_URL, "localhost:1028/accumulate");
cc = curl_easy_perform(curlP);
if (cc != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(cc));
exit(2);
}
curl_easy_cleanup(curlP);
return 0;
}
代码在名为get.c
的文件中进行编辑,我这样编译它:
gcc get.c -o get -lcurl
该测试在带有libcurl 7.58(我在/ usr / local下手动安装)的CentOS 7中运行。
我有一个简单的测试程序,一个用python编写的累加器,侦听端口1028,记录所有进入的请求,并在接收到具有URL路径/dump
的请求时吐出。
这是整个序列:
kz@centos7:curlTest> gcc get.c -o get -lcurl
kz@centos7:curlTest> ./get
curl version: 7.58.0
kz@centos7:curlTest> curl localhost:1028/dump
GET http://localhost:1028/accumulate
Content-Length:
Host: localhost:1028
Accept: */*
Content-Type:
=======================================
kz@centos7:curlTest>
从该测试中可以看出,GET请求(由get
发送到累加器)包括不带值的HTTP标头Content-Length
和Content-Type
。
在Ubuntu 18.04中完全相同的测试如下所示:
kz@xps:libcurlTest> gcc get.c -o get -lcurl
kz@xps:libcurlTest> ./get
curl version: 7.58.0
kz@xps:libcurlTest> curl localhost:1028/dump
GET http://localhost:1028/accumulate
Accept: */*
Host: localhost:1028
=======================================
kz@xps:libcurlTest>
请注意,缺少Content-Length
和Content-Type
。
在实施这个小的测试程序之前,我作了很多尝试来避免使用Content-Type
,方法是将其列表中的var list = Array.from(document.querySelectorAll("ul > li"));
var target = new Date('09-04-2019 15:15');
var boolValue = { true: 1, false: 0 };
var sortByStartTime = function (a, b) {
var diffA = new Date(a.dataset.startdate) - target;
var diffB = new Date(b.dataset.startdate) - target;
var inplayA = boolValue[a.dataset.inplay];
var inplayB = boolValue[b.dataset.inplay];
return inplayB - inplayA || (
diffA < 0 === diffB < 0 ? Math.abs(diffA) - Math.abs(diffB) : diffB - diffA
);
};
list.sort(sortByStartTime);
for (var i = 0; i < list.length; i = i + 1) {
list[i].parentNode.appendChild(list[i]);
}
设置为“ Content-Type:”,不带空格,在冒号后有一个空格和两个空格。 。我也尝试了不使用冒号,当然也没有将其添加到slist中(在这种情况下,它带有默认的content-type)。我还试图告诉libcurl,该请求是一个GET,现在不记得该调用的详细信息了。
现在,该错误可能是我的,因为我使用libcurl的经验很少。奇怪的是,在Ubuntu中一切正常,但在CentOS中却没有...