2017-10-09 7 views
0

Diese Funktion ist Teil eines PHP-CLI-Skripts mit wxWidgets, das versucht, einige Felder an einen Apache2-Webserver in meinem LAN zu senden. Es schlägt immer "400 Bad Request" fehl und gibt den "/blog/update.php" Code nicht ein. Der Wert der Domäne/des Hosts, der ein kritischer Teil dieses Fehlers sein könnte, ist korrekt. Warum ist es eine schlechte Anfrage? Alle Fragen, die genau wie meine sind, haben keine Antworten."400 schlechte Anfrage" Warum?

<?php 

[...] 

function upload_button_clicked() 
{ global $file_box, $frame, $html_box, $remote_host, $title_box, $upload_button ; 
    // collect global variables 
    $upload_button->Disable(); 
    $file = $file_box->GetValue(); 
    $title = $title_box->GetValue(); 
    $html = $html_box->GetValue(); 

    // open stream to server 
    $messages = ""; 
    $server = fsockopen($remote_host, 80, $errno, $errstring, 5); 
    if(!$server) 
    { $messages .= "Cannot connect to $remote_host: $errno $errstring\n"; 
     goto end; 
    } 
    $messages .= "Connected to $remote_host\n"; 
    stream_set_timeout($server, 5); 

    // urlencode parameters 
    $body = "date=" . urlencode(date('d m Y')) 
       ."&file=" . urlencode($file) 
       ."&title=" . urlencode($title) 
       ."&html=" . urlencode($html) ; 
    $body_length = strlen($body) +1; for the "\n" to terminate 

    // build POST request 
    $request = "POST /blog/update.php HTTP/1.1\n" 
       ."Host: $remote_host\n" 
       ."Content-Type: application/x-www-form-urlencoded\n" 
       ."Content-Length: $body_length\n" 
       ."\n" 
       .$body."\n"; 


    // fwrite request to stream 
    loop: 
    $request_length = strlen($request); 
    $bytes_written = fwrite($server, $request, $request_length); 
    if($bytes_written === false) 
    { $messages .= "Writing POST to $remote_host failed"; 
     goto end ; 
    } 

    // deal with partial write 
    if($bytes_written < $request_length) // not all written 
    { $request = substr($request, $bytes_written); 
     goto loop; 
    } 
    $messages .= "sent $file OK\n"; 

    // read responses to POST 
    while(!feof($server)) 
    { $response = fgets($server, 1024); 
     $messages .= "$response\n"; 
    } 

    // tidy up 
    end: 
    $report = new wxMessageDialog($frame, $messages, "Upload", wxOK|wxCENTRE); 
    fclose($server); 
    $upload_button->Enable(); 
    return ; 
} 

[...] 

?> 

Terminal-Ausgang:

Connected to mydomain.com 
sent /home/.../blog/contents/201710090746+title.htm OK 
HTTP/1.1 400 Bad Request 

Date: Sun, 08 Oct 2017 21:46:08 GMT 

Server: Apache 

Content-Length: 285 

Connection: close 

Content-Type: text/html; charset=iso-8859-1 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 

<html><head> 

<title>400 Bad Request</title> 

</head><body> 

<h1>Bad Request</h1> 

<p>Your browser sent a request that this server could not understand.<br /> 

</p> 

<hr> 

<address>Apache Server at 127.0.0.1 Port 80</address> 

</body></html> 

Antwort

0

Versuchen

$body_length = strlen($body."\n"); 

Der Körper Sie Apache senden ist etwas länger als strlen($body) da Sie eine "\n" bis Ende $body anhängt. Mindestens one other coder bekam eine 400 Bad Anfrage wegen dieser.

+0

Vielen Dank für das Auffinden. Ich habe oben im Code "+1" hinzugefügt, aber es wurde nicht behoben. – Palloy

0

Ausprobieren Verwenden \r\n statt nur \n wie folgt aus:

$body_length = strlen($body); 

// build POST request 
$request = "POST /blog/update.php HTTP/1.1\r\n" 
      ."Host: $remote_host\r\n" 
      ."Content-Type: application/x-www-form-urlencoded\r\n" 
      ."Content-Length: $body_length\r\n" 
      ."\r\n" 
      .$body; 
+0

Das hat funktioniert! Warum ist das, wenn der Server Apache unter Ubuntu 17.04 und der Client unter Ubuntu 16.04 läuft? – Palloy

+0

@Palloy, weil es in Standard ist https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html – Kazz

+0

Sie lernen jeden Tag etwas, danke. – Palloy