Ошибка 411 (требуется длина) в почтовом запросе с заголовком, но заголовок имеет Content-Length. libCurl

Я использую эти варианты:

curl_easy_setopt(curl, CURLOPT_URL, urlUpload); 
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);

Это должен быть почтовый запрос с заголовком. И в переменной заголовка есть длина

***
char sizeStr[50];
sprintf(sizeStr, "Content-Length: %d", body.length());

*** 

header = curl_slist_append(header, sizeStr);

***

Я пытаюсь загрузить видео на YouTube, используя их руководство

И получаю такую ​​ошибку.

<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<title>Error 411 (Length Required)!!1</title>
<style>
  *many symbols here* 
</style>
<a href=//www.google.com/ id=g><img src=//www.google.com/images/logo_sm.gif alt=Google></a>
<p><b>411.</b> <ins>Thatв€™s an error.</ins>
<p>POST requests require a <code>Content-length</code> header. <ins>Thatв€™s all we know.</ins>

Может быть, я должен использовать какие-то другие CURLoptions?

ОБНОВЛЕНИЕ: когда я установил

curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

я также получаю

* About to connect() to uploads.gdata.youtube.com port 80 (#0)
*   Trying 74.125.XX.XXX... * connected
* Connected to uploads.gdata.youtube.com (74.125.XX.XXX) port 80 (#0)
> POST /feeds/api/users/default/uploads HTTP/1.1

Accept: */*

Host: uploads.gdata.youtube.com

Authorization: GoogleLogin auth=DQAAAIkAAACTK9tZPCTY1XQvXGkg4qkaIuZ1QO-Bh6-    ZyzOHuigFNC_gR4Piep4NljAjdOP4s-k7vqj-j4LdckXM9jxzlElgtaxr-    CShI1vIWkjm5ZtFsj3a9v1YqFmjIkEi3NCP2ON18D9jmXSIarPqprWiOK0n3oxznCBhm4osXwJ1yRstVVM5bG5mOlC331eMCrOKp3E


GData-Version: 2

X-GData-Key:     key=AI39si59VMkm6DATDmfG_Df6D23jfto3xRVfbAEMrFBv035pdRZ5AYMPsRXbGLCRXXnK5jz6KCSWSkuXOTrlDIIKWy7Le9fkQQ

Slug: screen.avi

Content-Type: multipart/related; boundary="d31fcjR2"

Content-length: 910273

Connection: close


* HTTP 1.0, assume close after body
< HTTP/1.0 411 Length Required

< Content-Type: text/html; charset=UTF-8

< Content-Length: 11791

< Date: Fri, 02 Sep 2011 16:09:58 GMT

< Server: GFE/2.0

< 

* Closing connection #0

person Alecs    schedule 02.09.2011    source источник
comment
+1 за curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);   -  person PCoder    schedule 16.08.2012


Ответы (2)


Эта ошибка возникла из-за того, что в строке аутентификации, которую я получаю с YouTube, в конце был символ новой строки, я стираю его, и эта ошибка исчезла.

person Alecs    schedule 08.09.2011
comment
Сэкономил мне много времени. Спасибо за ответ! - person Johannes Klauß; 18.04.2013
comment
Что это значит? - person Ken Sharp; 19.01.2018

CURLOPT_POSTFIELDS заставит libcurl автоматически добавлять длину содержимого, нет необходимости создавать пользовательскую. Однако, поскольку вы уже отправляете заголовок длины содержимого, который явно не соответствует отсутствующей длине, о которой говорит сервер.

Ваш запрос также отправляет «Соединение: закрыть», поэтому есть еще кое-что в коде, который вы нам не показали.

person Daniel Stenberg    schedule 02.09.2011
comment
Я сделал это, потому что так написано в руководстве. Когда я удаляю длину содержимого из заголовка сообщения, результат тот же - person Alecs; 04.09.2011