Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2009.03.01;
Скачать: [xml.tar.bz2];

Вниз

HttpQueryInfo: возникает ошибка   Найти похожие ветки 

 
Danger ©   (2008-01-02 22:23) [0]

При использовании HttpQueryInfo с HTTP_QUERY_RAW_HEADERS_CRLF в моей программе часто возникают ошибки (причем, одна и та же функция для одного и того же ресурса может несколько раз нормально сработать, а потом вывалиться с ошибкой ERROR_HTTP_HEADER_NOT_FOUND). Участок кода, на котором проявляется:

var
hRequest: HINTERNET; Buf: PChar;
iBufSize, iReserved, iErrorCode: Cardinal;
......

// receiving headers (if event assigned)
HttpQueryInfo( hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, Buf, iBufSize, iReserved );
  // NB: it"s ok when "unsufficient buffer" message received now
  iErrorCode:= GetLastError;

  if ( iErrorCode = ERROR_INSUFFICIENT_BUFFER ) then
  begin
   try
    GetMem( Buf, iBufSize );
    if ( HttpQueryInfo( hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, Buf, iBufSize, iReserved ) ) then
    begin
     // .... читаем заголовки из буфера, работаем ....
    end  // "if ( HttpQueryInfo( hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, Buf, iBufSize, iReserved ) )"
    else
     if Assigned( fOnError ) then fOnError( @Self, GetLastError );

   finally
    FreeMem( Buf );
   end;
  end  // "if ( iErrorCode = ERROR_INSUFFICIENT_BUFFER )"
  else
   // !!! вот здесь частенько ERROR_HTTP_HEADER_NOT_FOUND в iErrorCode !!!
   if Assigned( fOnError ) then fOnError( @Self, iErrorCode );

hRequest инициализирована. Разъясните ситуацию, в чем может быть проблема.


 
MetalFan ©   (2008-01-02 22:36) [1]

маловато кода приведено.
какие изначально значения у iBufSize, Buf?


 
Danger ©   (2008-01-02 22:46) [2]


> MetalFan ©   (02.01.08 22:36) [1]
> маловато кода приведено.какие изначально значения у iBufSize,
>  Buf?

По MSDN (http://msdn2.microsoft.com/en-us/library/aa384238.aspx, http://msdn2.microsoft.com/en-us/library/aa385373(VS.85).aspx), чтобы получить размер заголовков, память под буфер не надо выделять, а в iBufSize возвращается размер буфера, необходимого под заголовки.
Поэтому, в общем случае до вызова HttpQueryInfo(): Buf:= nil; iBufSize:= 0;


 
MetalFan ©   (2008-01-03 20:08) [3]

ну это понятно...
но кода все равно мало.
а лучше выложи демо-проект, на котором можно эту ошибку проверить


 
umbra ©   (2008-01-04 13:09) [4]

а у вас вининет работает синхронно или асинхронно?


 
umbra ©   (2008-01-04 13:31) [5]


> hRequest: HINTERNET; Buf: PChar;
> iBufSize, iReserved, iErrorCode: Cardinal;
> ......
>
> // receiving headers (if event assigned)
> HttpQueryInfo( hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, Buf,
>  iBufSize, iReserved );

а скорее всего ошибка возникает из-за того, что вы не инициализируете iReserved. Поскольку это локальная переменная, то в ней вполне может находиться некий мусор, и она не будет равна нулю.


 
MetalFan ©   (2008-01-04 15:16) [6]


> а скорее всего ошибка возникает из-за того, что вы не инициализируете
> iReserved. Поскольку это локальная переменная, то в ней
> вполне может находиться некий мусор, и она не будет равна
> нулю.

в точку!!! вообще-то это уже не iReserved...
в MSDN этот параметр описан так:

lpdwIndex
Pointer to a zero-based header index used to enumerate multiple headers with the same name. When calling the function, this parameter is the index of the specified header to return. When the function returns, this parameter is the index of the next header. If the next index cannot be found, ERROR_HTTP_HEADER_NOT_FOUND is returned.


 
Danger ©   (2008-01-04 22:42) [7]

Вроде бы, теперь все нормально (я пользовался старым Platform SDK, в новый не глянул). Спасибо, umbra, MetalFan.

Теперь такой вопрос, уже по HttpOpenRequest: я принудительно задаю тип протокола HTTP/1.0, но в конечном счете запрос к серверу идет все равно как HTTP/1.1 (!), в перехваченных HTTP-запросах: GET /someresource.ext HTTP/1.1. Хотелось бы знать, почему?

const
 strConnectType = "Connection: close";
   ......
// prepare resource request
hRequest:= HttpOpenRequest( hConnect, nil, PChar( fPath ), "HTTP/1.0",
 nil, nil, INTERNET_FLAG_NO_UI + INTERNET_FLAG_PRAGMA_NOCACHE, 0);
// setting http headers "connection type" field (don"t allow persistent connection)
HttpAddRequestHeaders( hRequest, strConnectType, Length( strConnectType ), HTTP_ADDREQ_FLAG_ADD );
// send http request to server
HttpSendRequest( hRequest, nil, 0, nil, 0 );


 
MetalFan ©   (2008-01-05 10:10) [8]

просто укажи "1.0" без http


 
Danger ©   (2008-01-05 14:46) [9]


> MetalFan ©   (05.01.08 10:10) [8]
> просто укажи "1.0" без http


// prepare resource request
hRequest:= HttpOpenRequest( hConnect, nil, PChar( fPath ), "1.0",
 nil, nil, INTERNET_FLAG_NO_UI + INTERNET_FLAG_PRAGMA_NOCACHE, 0);


Все равно в запросе HTTP/1.1.


 
Danger ©   (2008-01-07 11:21) [10]


>> MetalFan ©   (05.01.08 10:10) [8]
>> просто укажи "1.0" без http

> // prepare resource request hRequest:= HttpOpenRequest(
> hConnect, nil, PChar( fPath ), "1.0",  nil, nil, INTERNET_FLAG_NO_UI
> + INTERNET_FLAG_PRAGMA_NOCACHE, 0);

> Все равно в запросе HTTP/1.1.


Если кто столкнется с такой же проблемой: выяснилось, что HttpOpenRequest просто игнорирует версию протокола,  формирует запрос в зависимости от настроек IE. Подробности здесь: http://support.microsoft.com/kb/258425.


 
MetalFan ©   (2008-01-07 21:05) [11]


> Подробности здесь: http://support.microsoft.com/kb/258425.

Невозможно отобразить страницу...

как решил? через
InternetSetOption+INTERNET_OPTION_HTTP_VERSION  ?


 
Danger ©   (2008-01-08 17:36) [12]


> > Подробности здесь: http://support.microsoft.com/kb/258425.
> Невозможно отобразить страницу...

Без точки на конце, просто http://support.microsoft.com/kb/258425


> как решил?

пока не придумал, работает пока по HTTP/1.1.


>через InternetSetOption+INTERNET_OPTION_HTTP_VERSION ?

а это та же шарманка ... тоже попробовал когда-то, вот так:


var
HTTPVInfo: HTTP_VERSION_INFO;
.......
InternetSetOption( hRequest, INTERNET_OPTION_HTTP_VERSION, @HTTPVInfo, SizeOf( HTTP_VERSION_INFO ) );
.......
initialization
HTTPVInfo.dwMajorVersion:= 1;
HTTPVInfo.dwMinorVersion:= 0;


Поля записи инициализированы (HTTP/1.0), InternetSetOption() возвращает TRUE, но запрос все равно идет HTTP/1.1.


 
MetalFan ©   (2008-01-08 19:10) [13]

панятно... значит через реестр только(



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2009.03.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
15-1230976017
Alkid
2009-01-03 12:46
2009.03.01
Посоветуйте простой бесплатный персональный firewall


2-1232027730
timekiller
2009-01-15 16:55
2009.03.01
Расчет площади текста


15-1230572825
Alkid
2008-12-29 20:47
2009.03.01
Перфекционизм vs. тяп-ляп.


6-1198579437
Свой
2007-12-25 13:43
2009.03.01
Webserver application и доступ к файлам под IIS 5.1


2-1232366935
Pravitel
2009-01-19 15:08
2009.03.01
Turbo Pascal





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский