Tengo el siguiente código:
function posturl($URL, $post_data, $referrer = "") { $URL_Info = parse_url ( $URL ); // Building referrer if ($referrer == "") $referrer = $_SERVER["SCRIPT_URI"]; // making string from $data foreach ( $post_data as $key => $value ) $values [] = "$key=" . urlencode ( $value ); $data_string = implode ( "&", $values ); if (! isset ( $URL_Info ["port"] )) $URL_Info ["port"] = 80; $request .= "POST " . $URL_Info ["path"] . " HTTP/1.1\n"; $request .= "Host: " . $URL_Info ["host"] . "\n"; $request .= "Referer: $referrer\n"; $request .= "Content-type: application/x-www-form-urlencoded\n"; $request .= "Content-length: " . strlen ( $data_string ) . "\n"; $request .= "Connection: close\n"; $request .= "\n"; $request .= $data_string . "\n"; echo ">>>> Request:\n"; echo($request); var_dump($URL_Info); $fp = fsockopen ( $URL_Info ["host"], $URL_Info ["port"] ); fputs ( $fp, $request ); while ( ! feof ( $fp ) ) { $result .= fgets ( $fp, 128 ); } fclose ( $fp ); $result=substr($result, strpos($result, "\r\n\r\n")); return $result; }
Y la siguiente solicitud:
POST /fia/interface/product_use_action.php HTTP/1.1 Host: orlof.is Referer: Content-type: application/x-www-form-urlencoded Content-length: 111 Connection: close task=check&ticket_number=EDDAFIA073&secret_code=htl440&seller_number=104&ternimal_number=Edda&global_language=8
Recibo la siguiente respuesta:
Mi pregunta:
¿Hay algo mal con la solicitud?
También tengo el mismo código y la misma solicitud pero Host
diferente, y no recibo errores allí.
POST /fia/interface/product_use_action.php HTTP/1.1 Host: test.orlof.is Referer: Content-type: application/x-www-form-urlencoded Content-length: 111 Connection: close task=check&ticket_number=EDDAFIA073&secret_code=htl440&seller_number=104&ternimal_number=Edda&global_language=8
Como podemos ver, la única diferencia es test.orlof.is
en lugar de orlof.is
.
Gracias.
No estoy seguro de si este es realmente el problema, pero hay dos cosas obviamente incorrectas con su solicitud:
$request .= "POST " . $URL_Info ["path"] . " HTTP/1.1\n";
El final de la línea con HTTP debe ser \r\n
, no \n
. Esto es cierto para todos los finales de línea, incluido el separador entre el encabezado HTTP y el cuerpo.
$request .= "Content-length: " . strlen ( $data_string ) . "\n"; ... $request .= $data_string . "\n";
Especifica la longitud del cuerpo con strlen ( $data_string )
, pero en realidad envía un byte más. No es necesario enviar un \n
al final del cuerpo, pero cuando lo haga, también debe tenerlo en cuenta en el encabezado content-length
.
Aparte de eso, está realizando una solicitud HTTP/1.1, pero espera que simplemente pueda tratar el cuerpo de la respuesta HTTP como los datos finales. Pero, con HTTP/1.1, el servidor solo puede usar la codificación de transferencia en fragmentos, es decir, la respuesta será en fragmentos y cada fragmento tendrá un prefijo de tamaño. Si no quiere lidiar con esto, mejor use HTTP/1.0.
En cuanto a por qué funciona con un servidor y no con el otro: podría deberse a que un servidor podría tener una implementación más indulgente del estándar HTTP y el otro más estricto. En cualquier caso, la fuente definitiva sobre cómo usar HTTP es el estándar y no algunos ejemplos que haya visto en alguna parte.