Bonjour,

J'envoi un fichier XML en POST par une connexion socket. (Il y a d'autres manières de le faire en installant des librairies, mais dans mon cas je suis obligé d'utiliser les fonctions standards). Mon problème est que lorsque, j'indique la version HTTP 1.1, le serveur attend 15 secondes avant de répondre. En HTTP 1.0, il répond directement.

Voici mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    $xml_output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
       $xml_output .= "<monxml interface_version=\"1\">\n";
        $xml_output .= "\t<dosssierid>" . $DossierId . "</dosssierid>\n";       
        $xml_output .= "</monxml>\n";
 
$xml_length = strlen($xml_output);
 
       $out = "POST ". $path . " HTTP/1.1\r\n"; 
       $out .= "Accept-Charset: utf-8\r\n";       
       $out .= "Accept-Encoding: *\r\n";
       $out .= "User-Agent: Someone/1.0\r\n";
       $out .= "Host: " . $hostname . "\r\n";
       $out .= "Content-Length: " . $xml_length . "\r\n";
       $out .= "Content-Type: text/html; charset=utf-8\r\n"; 
       $out .= "\r\n";
       $out .= $xml_output;
 
 
 
$fp = @fsockopen($hostname, $port, $errno, $errstr, $_REST_TIMEOUT_SOCKET_CONNECT);    
 
       stream_set_timeout($fp, $_REST_TIMEOUT_SOCKET_WRITE_AND_READ);
       stream_set_blocking($fp, false);
 
      fwrite($fp, $out);
 
       $answer = ''; 
       while (!feof($fp)) {
           $answer .= fgets($fp, 128); // !!! WARNING : this function BLOCKS process !!!
       }
 
       fclose($fp);
Dans la partie Header, j'indique la taille du body. Ce qui est étrange est que si je lui envoie plus de caractère que ce qui est attendu, le serveur répond directement en indiquant une erreur. Sinon, il attend. Il semble attendre un caractère supplémentaire. A ce niveau-là, qu'est-ce qui diffère en HTTP 1.1 par rapport au HTTP 1.0 ? Est-ce que l'erreur est ailleurs ?

Sinon le code fonctionne très bien. C'est ce temps d'attente que je souhaite éliminer pour éviter de faire attendre l'utilisateur.