замута с сокетами
http_read($url, $post, $cookies, &$header, &$response, $proxy = "", $proxy_port = "")
$url - адрес запроса
$post - данные (передаются методом POST)
$cookies - массив с куками
$header - возвращается http-заголовок
$response - возвращается содержимое
$proxy - адрес прокси (если прокси не используется ="")
$proxy_port - порт прокси (если прокси не используется, то "")
при чтении сайта - чанки (1ea1 2000 2000 2000 1000 c000), может это ещё не все, на последнем зависает (на какой строке - пометил).... немогу понять где затуп
my_fread - для чтения блоков, размер которых больше 8192
Код:
function my_fread($handle, $length) {
$r = "";
$s = "a";
while ($length && strlen($s)) {
$s = fread($handle, $length);
$r .= $s;
$length -= strlen($s);
}
return $r;
}
function http_read($url, $post, $cookies, &$header, &$response, $proxy = "", $proxy_port = "") {
$header = "";
$response = "";
$parse_url = parse_url($url);
$path = $parse_url["path"];
if ($parse_url["query"]) { $path .= "?{$parse_url["query"]}"; }
$host = $parse_url["host"];
$target = $proxy == "" ? $host : $proxy;
$port = $proxy_port == "" ? 80 : $proxy_port;
$out = "POST {$path} HTTP/1.1\r\n";
$out .= "Host: {$host}\r\n";
$out .= "Referer: {$url}/\n";
$out .= "User-Agent: Opera\n";
if (is_array($cookies)) {
foreach ($cookies as $value) {
if ($value != "") { $out .= "Cookie: {$value}\r\n"; }
}
}
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: " . strlen($data) . "\r\n\r\n";
$out .= "{$data}\r\n\r\n";
if ($request = fsockopen($target, $port, $errno, $errstr)) {
socket_set_timeout($request, 10);
fwrite($request, $out);
do {
$header .= fread($request, 1);
} while (!preg_match('/\\r\\n\\r\\n$/', $header));
if (preg_match('/Transfer\\-Encoding:\\s+chunked\\r\\n/', $header)) {
do {
if (feof($request)) { break; }
$chunk_size = "";
$byte = fread($request, 1); //здесь зависает
while ($byte != "\r") {
$chunk_size .= $byte;
$byte = fread($request, 1);
}
fread($request, 1);
$chunk_size = hexdec($chunk_size);
$response .= my_fread($request, $chunk_size);
fread($request, 2);
} while ($chunk_size);
} else {
if (preg_match('/Content\\-Length:\\s+([0-9]*)\\r\\n/', $header, $matches)) {
$response = fread($request, $matches[1]);
} else {
while (!feof($request)) { $response .= fread($request, 4096); }
}
}
fclose($request);
}
}
$r = "";
$s = "a";
while ($length && strlen($s)) {
$s = fread($handle, $length);
$r .= $s;
$length -= strlen($s);
}
return $r;
}
function http_read($url, $post, $cookies, &$header, &$response, $proxy = "", $proxy_port = "") {
$header = "";
$response = "";
$parse_url = parse_url($url);
$path = $parse_url["path"];
if ($parse_url["query"]) { $path .= "?{$parse_url["query"]}"; }
$host = $parse_url["host"];
$target = $proxy == "" ? $host : $proxy;
$port = $proxy_port == "" ? 80 : $proxy_port;
$out = "POST {$path} HTTP/1.1\r\n";
$out .= "Host: {$host}\r\n";
$out .= "Referer: {$url}/\n";
$out .= "User-Agent: Opera\n";
if (is_array($cookies)) {
foreach ($cookies as $value) {
if ($value != "") { $out .= "Cookie: {$value}\r\n"; }
}
}
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: " . strlen($data) . "\r\n\r\n";
$out .= "{$data}\r\n\r\n";
if ($request = fsockopen($target, $port, $errno, $errstr)) {
socket_set_timeout($request, 10);
fwrite($request, $out);
do {
$header .= fread($request, 1);
} while (!preg_match('/\\r\\n\\r\\n$/', $header));
if (preg_match('/Transfer\\-Encoding:\\s+chunked\\r\\n/', $header)) {
do {
if (feof($request)) { break; }
$chunk_size = "";
$byte = fread($request, 1); //здесь зависает
while ($byte != "\r") {
$chunk_size .= $byte;
$byte = fread($request, 1);
}
fread($request, 1);
$chunk_size = hexdec($chunk_size);
$response .= my_fread($request, $chunk_size);
fread($request, 2);
} while ($chunk_size);
} else {
if (preg_match('/Content\\-Length:\\s+([0-9]*)\\r\\n/', $header, $matches)) {
$response = fread($request, $matches[1]);
} else {
while (!feof($request)) { $response .= fread($request, 4096); }
}
}
fclose($request);
}
}
заранее благодарен за любую помощь
при работе через прокси - не полностью грузится контент :((