[PHP] trasmettere gli header

Salve ragazzi, allora: devo fare una richiesta ad una servelet remota e vorrei prendere il responso di ritorno per elaborarlo.

Nulla di pericoloso, solo una richiesta a Planet Domain, che per questo tipo di domande/risposte ti forniscono un'API e un link ad una loro servelet che risponde in modalità stringa o xml.

Fino a qui nulla di complicato, ma quando ho cercato di trasmettere gli header il mio server mi ha dato errore 500, ho pensato di aver sbagliato qualche cosa io ma non riesco a capire dove sbaglio, comunque ora vi dico cosa ho fatto.

Ebbene, con un semplice form mando una richiesta alla servelet remota per sapere se uno username è registrato (tanto per provare) e il file è questo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
   <head>
      <title>Interrogazioni a Planet Domain</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
   </head>
   <body>
      <form method="post" action="prova.php">
         <p><label for="verify">L'utente esiste?</label>
         <input type="text" id="verify" name="verify" value="" /></p>
         <p><input type="submit" name="invia" value="verifica!" /></p>
      </form>
   </body>
</html>

il file prova.php definito nella action del form formatta e manda gli header, in questo modo:

<?php
ob_start();
   //   prove per l'uso delle API di Planet Domain
   
   if (isset($_POST['invia'])) {
      //  Prendo e formatto i dati del form
      $postData = urlencode('user.verify=' . $_POST['verify']);
      $lenght = strlen($postData); //  Calcolo la lunghezza dei dati da inviare
      
      header("POST //servlet/TLDServlet HTTP/1.0\r\n");
      header("Host: api.planetdomain.com\r\n");
      header("Connection: close\r\n");
      header("Content-type: application/x-www-form-urlencoded\r\n");
      header("Content-length: $lenght\r\n\r\n");
      header($postData);
        }
ob_end_flush();
?>

ho provato a mettere e togliere all'interno delle chiamate header gli \r\n ma non da soluzione, l'errore è sempre error 500, a mettere o togliere il parametro Connection: close, nulla.

mi rimane  da pensare che a) non posso trasmettere user.verify in questo modo, ma il nome deve essere sempre trasmesso così se no non lo accetta; b) che sbaglio qualche cosa nella trasmissione degli header.

Ho provato a trasmettere via socket ma la connessione viene rifiutatata dalla servelet, via fopen uguale stesso risultato.

Se nel file html, in action al form, invece di far puntare a prova.php metto l'url della servelet questa mi risponde e nel modo giusto tra l'altro.

Ma che devo fare?

Da notare che Planet domain vuole che: la connessione deve avvenire per forza come HTTP/1.0 ma la sua servelet risponde solo a connessioni sicure, cioè HTTPS come riportato da un'estratto del loro manuale:

Input Format

The input format required is a standard HTTP/1.0 POST packet. The following rules

apply:

· All field values are free format strings format restrictions are defined where

appropriate later in this document;

· All fields marked mandatory must be present and contain at least one non-white space

character;

· Fields must not exceed the maximum length; and

· All requests must be sent via the HTTPS protocol (i.e. HTTP/SSL).

inviato 5 anni fa
Marco Grazia
X 0 X

L'errore 500 dovrebbe essere usato solo per problemi interni, quindi questo problema non dovrebbe dipendere da te ma da loro.

Secondo me la cosa migliore è chiedere (a loro)

risposto 5 anni fa
Massimiliano Arione
X 0 X

No dipende dal mio di server dato che è lì che gira lo script, inoltre te l'assicuro era il mio di server a rispondere error 500 non il loro  ;D

Bastava guiardare la barra dell'url  ;)

Comunque questa mattina l'ho provato anche in locale e invece di darmi error 500 mi faceva scaricare lo script  :(

Morale ho tagliato la testa al toro (e allo script) e visto che si tratta di una servlet da interrogarsi via http, comunque ho deciso che i socket dovevano andare bene, per forza!  :tichedoff:

E ce l'ho fatta, ha funzionato, certo che sono fantastici, in pratica ti danno l'indirizzo alla servlet, un PDF esauriente ma senza nessunno snipet di codice, e indicazioni false e tendenziose.

Il protocollo che usano è (ma và) HTTP/1.1 ma sia sul sito che sul pdf dicono che è HTTP/1.0, probabilmente hanno modificato i parametri del server ma non l'hanno comunicato 'sti...   :o

Ora sto impazzendo con i loro "comandi" sono una marea e a quanto pare non ce ne sono di default, che ignoranti 'sti australiani.

Se a qualcuno interessa posto il codice funzionante, o meglio abbastanza funzionante per ora, ho un problema con gli header di ritorno, vorrei toglierli e se qualcuno mi da una mano gliene sarei grato.

risposto 5 anni fa
Marco Grazia
X 0 X

Be' ma se è il tuo server, guarda nei log  :P

risposto 5 anni fa
Massimiliano Arione
X 0 X
Be' ma se è il tuo server, guarda nei log  :P

Già fatto mi diceva che non poteva aprire uno streaming in quel modo in https, in realtà non sapevo come fare dato che il protocollo HTTP/1.0 non accetta la codifica HTTPS.

Comunque ora va ma in locale, poi lo provo online.

risposto 5 anni fa
Marco Grazia
X 0 X

Ma porc... @#%£% si è rotto l'hard disk del server di produzione.

Sei anni di funzionamento ininterrotto, e quest'oggi si rompe lo str...ano tipo!

Domani parto per le ferie e porc.... Dai Marco è solo sfiga dopotutto sgrunt.

risposto 5 anni fa
Marco Grazia
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda