Пустой Content-Type в GET-запросе curl_easy_perform - PullRequest
1 голос
/ 09 апреля 2019

Пожалуйста, не обращайте внимания на эту проблему, похоже, что проблема заключается в werkzeug.

Я считаю, что обнаружил проблему с Content-Type для запросов GET, отправленных с использованием curl_easy_perform,в libcurl версии 7.29 (CentOS 7).Проблема в том, что HTTP-заголовок Content-Type присутствует (с пустым значением) в запросе:

Content-Type:

В Ubuntu 18.04, с libcurl 7.58, эта проблема не возникает(как и ожидалось, заголовок отсутствует в запросе).Я искал 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

Тест выполняется в CentOS 7 с libcurl7.58 (который я установил вручную в /usr/local).

У меня есть простая тестовая программа, аккумулятор, написанный на 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, установив в своем слайде значение «Content-Type:», без пробела, с одним пробелом и сдва пробела после двоеточия.Я также попытался без двоеточия и, конечно, без добавления его в список (в этом случае он поставляется с типом содержимого по умолчанию).Я также пытался сообщить libcurl, что запрос является GET, сейчас не помню деталей этого вызова.

Теперь, ошибка, вероятно, моя, поскольку у меня очень мало опыта использования libcurl.Просто странно, что в Ubuntu все нормально, а в CentOS нет ...

...