If you use the proxy server and encounter an error "fopen(http://example.com): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request" note that in many situations you need also set the parameter "request_fulluri" to "true" in your stream options. Without this option the php script sends the empty request to the server as "GET / HTTP/0.0" and the proxy server replies to it with the "HTTP 400" error.
For example (working sample):
<?php
$stream = stream_context_create(Array("http" => Array("method" => "GET",
"timeout" => 20,
"header" => "User-agent: Myagent",
"proxy" => "tcp://my-proxy.localnet:3128",
'request_fulluri' => True /* without this option we get an HTTP error! */
)));
if ( $fp = fopen("http://example.com", 'r', false, $stream) ) {
print "well done";
}
?>
P>S> PHP 5.3.17
Opciones de contexto de HTTP
Opciones de contexto de HTTP — Lista de opciones de contexto de HTTP
Descripción
Opciones de contexto para los transports http:// y https://.
Historial de cambios
| Versión | Descripción |
|---|---|
| 5.3.4 |
Añadido follow_location.
|
| 5.3.0 |
La opción protocol_version soporta decodificación de
transferencias fragmentadas en caso de valer 1.1.
|
| 5.2.10 |
Añadido ignore_errors.
|
| 5.2.10 |
El parámetro header puede ahora ser un array de índices numéricos.
|
| 5.2.1 |
Añadido timeout.
|
| 5.1.0 | Añadido soporte para HTTPS mediante proxies HTTP. |
| 5.1.0 |
Añadido max_redirects.
|
| 5.1.0 |
Añadido protocol_version.
|
Ejemplos
Ejemplo #1 Captura una página y envía datos POST
<?php
$postdata = http_build_query(
array(
'var1' => 'contenido',
'var2' => 'doh'
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/submit.php', false, $context);
?>
Ejemplo #2 Ignora las redirecciones per captura las cabeceras y el contenido
<?php
$url = "http://www.example.org/header.php";
$opts = array('http' =>
array(
'method' => 'GET',
'max_redirects' => '0',
'ignore_errors' => '1'
)
);
$context = stream_context_create($opts);
$stream = fopen($url, 'r', false, $context);
// información de cabeceras y meta datos
// sobre el flujo
var_dump(stream_get_meta_data($stream));
// datos reales en $url
var_dump(stream_get_contents($stream));
fclose($stream);
?>
Notas
Nota: Opciones de contexto del flujo de socket subyacente
Hay soporte para opciones de contexto adicionales en el transporte subyacente Para flujos http://, deben consultarse las opciones de contexto del transporte tcp://. Para flujos https://, deben consultarse las opciones de contexto del transporte ssl://.
Nota: Línea de estado HTTP
Cuando esta envultura sigue una redirección, el wrapper_data devuelto por stream_get_meta_data() no contiene necesariamente la línea de estado HTTP que realmente se aplica al contenido del índice 0.La primera petición devolvió un 301 (redirección permanente), de manera que la envoltura automáticamente sigue la redirección para obtener una respuesta con código 200 (índice = 4).array ( 'wrapper_data' => array ( 0 => 'HTTP/1.0 301 Moved Permantenly', 1 => 'Cache-Control: no-cache', 2 => 'Connection: close', 3 => 'Location: http://example.com/foo.jpg', 4 => 'HTTP/1.1 200 OK', ...
watch your case when using methods (POST and GET)...it must be always uppercase. in case of you write it in lower case it wont work.
