CURLOPT_HEADER Возвращает не все заголовки

_hxc-

Новичок
CURLOPT_HEADER Возвращает не все заголовки

Добрый день, у меня такая проблема.

При NOBODY 1 и HEADER 1 возвращается только часть заголовков

PHP:
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL,$url);
  curl_setopt($ch, CURLOPT_HEADER, 1);
  curl_setopt($ch, CURLOPT_NOBODY, 1);
  curl_setopt($ch, CURLOPT_COOKIE, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_exec ($ch);
  curl_close ($ch);
результат работы этого куска:

Date: Fri, 01 Dec 2006 01:38:31 GMT
Server: Apache/1.3.33 (Unix) mod_gzip/1.3.26.1a mod_ssl/2.8.22 OpenSSL/0.9.7e
Cache-Control: private
Expires: Thu, 05 Jan 1995 22:00:00 GMT
Pragma: no-cache
Connection: close
Content-Type: text/html; charset=UTF-8
Но если убрать NOBODY, только тогда получаю все хидеры:

HTTP/1.1 302 Found
Date: Fri, 01 Dec 2006 01:18:30 GMT
Server: Apache/1.3.33 (Unix) mod_gzip/1.3.26.1a mod_ssl/2.8.22 OpenSSL/0.9.7e
Cache-Control: private
Expires: Thu, 05 Jan 1995 22:00:00 GMT
Pragma: no-cache
Set-Cookie: ... / вырезано куча куки/ ...
Location: https://www.site.com/
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1

далее <html> ....
Немогу понять, в чём дело. :confused: :confused: :confused: Мне ведь только location из хидера нужно прочитать, нехочется тянуть всю страницу.
 

_hxc-

Новичок
NOBODY переделывает запрос в HEAD.
Я знаю что такое протокол HTTP =), отсюда моё такое удивление, почему часть хидера подаётся сервером(или интерпретируется curl-ом) как body, и не возвращается методами GET/POST

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

Нужные мне страницы выглядят так, и весят совсем мало:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>302 Found</TITLE>
</HEAD><BODY>
<H1>Found</H1>
The document has moved <A HREF="www.site.com/link">here</A>.<P>
<HR>
<ADDRESS>Apache/1.3.33 Server at <A HREF="mailto:[email protected]">www.site.com</A> Port 443</ADDRESS>
</BODY></HTML>
но ненужные весят много (по 40кб(в сумме очень критично)).

Если мне придётся отказаться от NOBODY=1, то можно конечно искать различия в теле странице...
Можно даже определять сразу по первой строчке, по HTML DOCTYPE-у.
НО тогда мне придётся каждый раз засовывать в хэндл (curl_exec ($ch)) всё тело страницы, ведь в curl-е, насколько я понимаю, нельзя назначить размер, как например в fread($qwe, 1024). Вот в чём беда.

P.S. Мне ненужно идти дальше по редиректу, CURLOPT_FOLLOWLOCATION непоможет.
 

Андрейка

Senior pomidor developer
PHP:
// ваше
$ch = curl_init(); 
  curl_setopt($ch, CURLOPT_URL,'http://localhost/'); 
  curl_setopt($ch, CURLOPT_HEADER, 1); 
  curl_setopt($ch, CURLOPT_NOBODY, 1); 
  curl_setopt($ch, CURLOPT_COOKIE, 1); 
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2); 
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
  curl_exec ($ch); 
  curl_close ($ch);
наше:
HTTP/1.1 302 Found
Date: Fri, 01 Dec 2006 13:42:17 GMT
Server: Apache/1.3.34 (Win32)
Location: index.php?rrr=22&amp;sss=222
Content-Type: text/html
 

_hxc-

Новичок
Ну да, на других сайтах у меня тоже всё ок, значит это конкретно тот сайт чтото мутит. Там ведь ещё ssl , может из за этого, хз.

Пробую решить проблему константой CURLOPT_RANGE, но и она не работает. Причём даже в тестах на локалхосте отказывалась возвращать только нужный участок.

В мануале написано:

CURLOPT_RANGE: Задает участок файла, который нужно загрузить, в формате "X-Y" , причем X или Y могут быть опущены. Протокол HTTP также поддерживает передачу нескольких фрагментов файла, это задается в виде "X-Y,N-M".
Ну я и делаю, допустим :

PHP:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RANGE, 1-1024);
curl_exec ($ch);
curl_close ($ch);
Пробовал и с разными кавычками, и без.. выдаёт всю страницу полностью.

-~{}~ 03.12.06 08:19:

1) Проблему с обрезанными заголовками я осознал. При NOBODY не передаётся POST запрос, что естесственно. Отсюда в хидере нехватало кук и локейшна.

2) Range. Насколько я понял, нужно, чтобы сервер поддерживал такой запрос, что бывает крайне редко.

Таким образом, неостаётся возможности принять только часть message body :confused: , посему перехожу на сокеты. :mad:
 
Сверху