Почему HttpOpenRequest может завершиться с ошибкой 122? - PullRequest
2 голосов
/ 29 июля 2010

Следующий код

fRequestHandle = HttpOpenRequestA(
                   fConnectHandle, 
                   "POST", url.c_str(), 
                   NULL, NULL, NULL,
                   INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE, 
                   0); 

возвращает NULL с GetLastError (), возвращающим 122. Поиск предполагает, что эта ошибка

122 (ERROR_INSUFFICIENT_BUFFER) The data area passed to a system call is too small. 

, но не указывает, какой буфер может быть слишком маленьким.

К какому буферу это может относиться и как я могу увеличить его?

Обновление:

Как было указано и подробнов http://support.microsoft.com/kb/208427, Internet Explorer и, предположительно, библиотека wininet, имеют ограничение URL-адреса в 2083 символа.

Однако, глядя на мой URL-адрес, я обнаружил, что сам URL-адрес составляет около 40 символов ,650 тыс. Данных находятся в паре имя / значение, для которой в wininet нет ограничений

Ответы [ 3 ]

2 голосов
/ 29 июля 2010

В общем, ваш URL должен быть размером 2 КБ или меньше.Поскольку вы выполняете POST, вы движетесь в правильном направлении, именно для большей части ваших данных вы хотите передать это как тело HTTP-запроса, как в этом примере:

POST /login.jsp HTTP/1.1
Host: www.mysite.com
User-Agent: Mozilla/4.0
Content-Length: 27
Content-Type: application/x-www-form-urlencoded

userid=joe&password=guessme <--You need to do this!

Извлеченный отсюда: http://developers.sun.com/mobility/midp/ttips/HTTPPost/

Вот то, что я думал, что вы хотели бы сделать:

std::string url("http://host.com/url");

std::string dataPayload("name=value&othername=anothervalue");//Query string payload style.
DWORD dataPayloadLength = dataPayload.length();

std::ostringstream headerStream;
headerStream << "content-length: ";
headerStream << dataPayloadLength;
std::string headers = headerStream.str();

DWORD headerLength = headers.length();

HINTERNET handle = HttpOpenRequest(hConnect,
    "POST",
    url.c_str(), 
    NULL, NULL, NULL,
    INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE, 
    0);

if(!handle) {
    DWORD errorCode = GetLastError();
    //Handle error here.
}

//Use this thing to send POST values.
if(! HttpSendRequest(handle,
    headers.c_str(),
    headerLength,
    dataPayload, //lpOptional <--Your POST data...not really optional for you.
    dataPayloadLength) {

    DWORD errorCode = GetLastError();
    //Handle error here.
}
1 голос
/ 26 февраля 2015

После некоторого копания я получил ошибку 122, когда AV или брандмауэр заблокировали мой запрос GET.

1 голос
/ 29 июля 2010

РЕДАКТИРОВАТЬ:

Похоже, что этот парень имел ту же проблему, URL слишком длинный.

http://social.msdn.microsoft.com/Forums/en-US/windowsmobiledev/thread/68612c89-bbce-4d88-926d-5d76771be944

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...