HTTPS-Requests an Server: POST-Parameter kommen nicht an

threadi

Mitglied
Hi,

folgende Situation:
Ich habe auf einem Apache-Webserver mehrere Webseiten liegen die allesamt einzig per SSL erreichbar sind (inkl. HSTS etc.). Innerhalb der Seiten gibt es Formulare, auch mit Dateiupload, die ganz normal funktionieren und täglich von Dutzenden Besuchern normal genutzt werden. Die allermeisten Webseiten laufen mit PHP 7.0 über php-fpm, einige wenige noch auf Grund meines unten beschriebenen Problems mit PHP 5.6 über mod-php.

Jetzt habe ich einen Java-Client der auf den lokalen PCs von einigen hundert Leuten installiert ist. Dieser erzeugt in bestimmten Situationen HTTP-Requests an den Server (ebenfalls ausschließlich per SSL). Und hier entsteht auch mein Problem:

Requests vom Java-Client an den Server enthalten je nach Verwendungszweck eine unterschiedliche Anzahl POST-Parameter.
Sobald der angesprochene Vhost am Server mit PHP-FPM und PHP in Version 5.6 oder 7.0 läuft, kommen die POST-Parameter dort gar nicht am Script an.
Sobald der Vhost mit mod_php und PHP 5.6 läuft, kommen sie korrekt an.
Es ist dabei egal wie groß der Stream ist oder ob ich Binärdaten mitsende oder nicht. Es passiert auch wenn ich nur 1 POST-Parameter mit dem Wert 1 schicke.

Im Java baue ich die Requests mit folgender Funktion zusammen:

Java:
private String httpsPostRequest() throws IOException {
   // set the boundary for the parameters in this request
   String boundary = Long.toHexString(System.currentTimeMillis());

   // set the charset for this request
   String charset = "UTF-8";

   // set the linebreak
   String CRLF = "\r\n";

   // 1. step: get the URL
   URL myurl = new URL(this.url);

   // 2. step: open the connection and set its properties
   HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();

   // -> enable the usage of output from the request
   con.setDoOutput(true);

   // -> optimize httprequest-performance because we don't know the size of the
   //      transfered request
   con.setChunkedStreamingMode(-1);

   // -> send only POST-Requests
   con.setRequestMethod("POST");

   // -> set the timeout to 20000ms
   con.setConnectTimeout(20000);

   // -> set HTTP-Header-Data
   con.setRequestProperty("Accept-Encoding", "deflate");
   con.setRequestProperty("Accept-Language", config.getLanguage().toString() + "-" + config.getLanguage().toString());
   con.setRequestProperty("Pragma", "no-cache");
   con.setRequestProperty("Cache-Control", "no-cache");

   // -> set UserAgent
   //    -> do not change this because it's important for communication with the mapBase
   con.setRequestProperty("User-Agent", "mybrowser");

   // 3. step: if PHP-SessionId is available use it in HTTP-Header
   if( this.phpSessionId != null )
   {
       con.setRequestProperty("Cookie", "PHPSESSID=" + this.phpSessionId);
   }

   // 4. step: if token is available use it in the parameter-list
   if( this.token != null )
   {
       this.params.put("token", this.token);
   }
          
   // 5. step: set the parameter
   con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
   try (
       OutputStream output = con.getOutputStream();
       PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
   ) {
       // send the normal text-parameters
       if( !this.params.isEmpty() ) {
           for(Entry<String, String> entry : this.params.entrySet()) {
               String key = entry.getKey();
               String value = entry.getValue();
               // add normal parameter to the HTTP-Request
               writer.append("--" + boundary).append(CRLF);
               writer.append("Content-Disposition: form-data; name=\"" + key + "\"").append(CRLF);
               writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
               writer.append(CRLF).append(value).append(CRLF).flush(); // value and end of boundary
           }
       }
      
       // send the binary-data
       if( !this.binaryfiles.isEmpty() ) {
           for(Entry<String, File> entry : this.binaryfiles.entrySet()) {
               String key = entry.getKey();
               File binaryFile = entry.getValue();
              
               // add binary-file-data to the HTTP-Request
               writer.append("--" + boundary).append(CRLF);
               writer.append("Content-Disposition: form-data; name=\"" + key + "\"; filename=\"" + binaryFile.getName() + "\"").append(CRLF);
               writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF);
               writer.append("Content-Transfer-Encoding: binary").append(CRLF);
               writer.append(CRLF).flush();
               Files.copy(binaryFile.toPath(), output);
               output.flush(); // important before continuing with writer!
               writer.append(CRLF).flush(); // end of boundary
           }
       }
       // end of multipart/form-data.
       writer.append("--" + boundary + "--").append(CRLF).flush();
       writer.flush();
       writer.close();
   }
   catch(IOException e) {
       // add this error to the list which could be used
       // from the calling function to analyze the problem
       // and show appropriated messages to the user
       this.error.add(e.getMessage());
   }
   InputStream ins = con.getInputStream();
   InputStreamReader isr = new InputStreamReader(ins, "UTF-8");
   BufferedReader in = new BufferedReader(isr);
   String inputLine;
   StringBuffer responseBuffer = new StringBuffer();
   while( (inputLine = in.readLine()) != null ) {
       responseBuffer.append(inputLine + "\n");
   }
   return responseBuffer.toString();
}


Wenn ich mit curl den gleichen Request zusammensetze, kommen die POST-Parameter normal an (auch bei PHP 7.0). Daher tippe ich derzeit auf ein Problem beim Zusammenbauen der Header in o.g. Java-Code.

Habt ihr dazu irgendeine Idee? :)
 

threadi

Mitglied
An netcat bin ich dann verzweifelt, kenne mich eher mit tcpdump aus ;) Und dort sehe ich die Daten ankommen.
Ohne SSL hatte ich es auch schon probiert, ebenso ohne Erfolg.

Aber dein Hinweis mit localhost brachte mich darauf den Request mal an einen anderen Server zu schicken - dort bekomme ich den HTTP Status 411 zurück. Falls der jemanden nichts sagt: die Länge für den POST-Request fehlt. In o.g. Code wird der Stream auf Chunked gesetzt, was bei Nutzung von php-fpm auf dem Server offenbar nicht gut ankommt.

In der Hoffnung, dass dies nun die Ursache ist muss ich wohl meinen o.g. Code so überarbeiten, dass die reale Stream-Länge mitgeschickt wird damit der Server das dann annimmt. :/ Hab gerad keine Idee wie, aber ist ja auch schon wieder spät ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Den Content erst in ein Byte-Array schreiben, zb mit ByteArray*Streams. Damit kommst du an die Länge, und kannst die zusammen mit dem Body setzen.

Bei netcat reichst hierfür, es einfach zu starten und an nem Port lauschen zu lassen, dann wird alles ankommende geprinted
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
Thallius HTTP Kann man den Raw HTTPS Request irgendwie ausgeben lassen? Netzwerkprogrammierung 6
G localhost im Backend https vs. http Netzwerkprogrammierung 9
M HTTPS Login & etwas posten Netzwerkprogrammierung 0
M Proxy und HTTPS Netzwerkprogrammierung 3
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
GENiALi Grizzly mit HTTPS Netzwerkprogrammierung 0
N Hintergrundlogin HTTPs Webform Netzwerkprogrammierung 5
E Gruppenchat: Über HTTPS oder nicht? Netzwerkprogrammierung 5
K HTTPS Zertifikat Netzwerkprogrammierung 3
F C/S über HTTPS Netzwerkprogrammierung 2
NoXiD Java mit HTTPS verbinden Netzwerkprogrammierung 6
T Up- und Download mit https Netzwerkprogrammierung 14
M HTTP HTTPS-Verbindung mittels Java und Javascript Netzwerkprogrammierung 2
T HTTPS einloggen Netzwerkprogrammierung 9
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
Q HTTPS mit Apache HttpClient Netzwerkprogrammierung 4
M HTTPS Seiten runterladen Netzwerkprogrammierung 2
C HTTPS mit Apache HTTPClient Netzwerkprogrammierung 1
A HTTPS-Request via Proxy mit Konfigurationsskript Netzwerkprogrammierung 3
P HTTPS - öffentliches Zertifikat - ermitteln Netzwerkprogrammierung 5
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4
M HTTP Http requests aufzeichnen Netzwerkprogrammierung 2
N CURL requests in Java Netzwerkprogrammierung 6
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D HTTP Bräuchte hilfe mit Http Requests Netzwerkprogrammierung 6
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
J Requests über ein Socket Netzwerkprogrammierung 7
M HTTP Requests verarbeiten und Response senden mit Java Netzwerkprogrammierung 14
R Websockets oder server sent events? Netzwerkprogrammierung 2
W Windows 2019-Server Dienste starten unter Nutzer Netzwerkprogrammierung 1
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben