# HTTP Post?!? - Java Server



## SuchtyTV (25. Jun 2020)

Hallo,

ich baue mir gerade einen redundanten HTTP-Server um mir die ganze Thematik verständlicher zu machen.
Der folgende Code liest einen HTTPRequest/post aus und antwortet... (er ist noch nicht fertig)


```
package com.company;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class HttpThread implements Runnable {

    private Socket socket;

    public HttpThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {

        try {
            PrintWriter out =
                    new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in =
                    new BufferedReader(
                            new InputStreamReader(socket.getInputStream()));


            String userInput;
            StringBuffer buffer = new StringBuffer();
            System.out.println("Test");
            while ((userInput = in.readLine()).length()!=0) {
                buffer.append(userInput);
                buffer.append('\n');
                System.out.println(userInput);
            }
            ...


    }

}
```

Aber vor allen Dingen liest er die Anfragen der Browser aus.
Ihr könnt euch hier selbst überzeugen: www.rosenheim-cainsdorf.de:903

Die Get-requests werden korrekt gelesen, aber bei einem Passwordpost kommt nur Müll raus.
Vllt könnt ihr mir ja sagen, woran das liegt 🙂 Ich finde es aber schon sehr eigenartig.




```
GET / HTTP/1.1
Host: www.rosenheim-cainsdorf.de:903
Connection: keep-alive
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,eu;q=0.6

HTTP/1.1 200 OK

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login!</title>
</head>
<body>
<form action="https://www.rosenheim-cainsdorf.de:903" method="post">
    <ul>
        <li>
            <label for="login">Benutzer</label>
            <input id="login" name="login">
        </li>
        <li>
            <label for="pass">Passwort</label>
            <input id="pass" name="pass" type="password">
        </li>
        <li>
            <button>anmelden</button>
        </li>
    </ul>
</form>
</body>
</html>
GET /favicon.ico HTTP/1.1
Host: www.rosenheim-cainsdorf.de:903
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
DNT: 1
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://www.rosenheim-cainsdorf.de:903/
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,eu;q=0.6

HTTP/1.1 404 Not Found


Test
Test
�p�P3�W:!���-�C�I��
g���m���sx0� C��8�#r<'=��m��/����)�r��xJ� ZZ�+�/�,�0̨̩����/5���www.rosenheim-cainsdorf.de�


#
hhttp/1.1
3+)
    �����a�uG��[��Ҵ���/���r�%�(-+

�����
Jz�
��Z�
^[[?1;2c^C
```


----------



## httpdigest (25. Jun 2020)

Liegt höchstwahrscheinlich daran, dass der Response-Body eben gzip't ist, wie der Browser es auch wollte: `Accept-Encoding: gzip, deflate`


----------



## SuchtyTV (25. Jun 2020)

httpdigest hat gesagt.:


> Liegt höchstwahrscheinlich daran, dass der Response-Body eben gzip't ist, wie der Browser es auch wollte: `Accept-Encoding: gzip, deflate`


Komisch, eigentlich habe ich nichts encoded (also nicht wissentlich *ahha*)...


----------



## SuchtyTV (26. Jun 2020)

Hat jemand vll noch eine Idee woran das liefen kann?


----------



## mrBrown (26. Jun 2020)

Was soll denn die Ausgabe überhaupt darstellen? 


In dem Java-Code dürfte aber mindestens das Einlesen fehlerhaft sein, `(userInput = in.readLine()).length()!=0` liest bis zur ersten leeren Zeile, würde aber beim Stream-Ende einen NPE werfen.


----------



## SuchtyTV (27. Jun 2020)

mrBrown hat gesagt.:


> Was soll denn die Ausgabe überhaupt darstellen?
> 
> 
> In dem Java-Code dürfte aber mindestens das Einlesen fehlerhaft sein, `(userInput = in.readLine()).length()!=0` liest bis zur ersten leeren Zeile, würde aber beim Stream-Ende einen NPE werfen.



Ok, danke 😊
(Eine Leerzeile bedeutet doch s.equals("\0") Was EOF bedeutet??? Sehe ich da was falsch)
Wie würdest du es machen? Leider geht != null nicht, weil Chrome den Stream nie terminiert.

Ich poste mal den ganzen Code:


```
package com.company;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class HttpThread implements Runnable {

    private Socket socket;

    public HttpThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {

        try {
            PrintWriter out =
                    new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in =
                    new BufferedReader(
                            new InputStreamReader(socket.getInputStream()));


            String userInput;
            StringBuffer buffer = new StringBuffer();
            System.out.println("HTML REQUEST/POST:\n");
            while ((userInput = in.readLine()).length()!=0) {
                buffer.append(userInput);
                buffer.append('\n');
                System.out.println(userInput);
            }
            System.out.println("HTML REQUEST END\n");

            System.out.println("HTML RESPONSE:\n");
            String answer = process(buffer.toString());
            System.out.println("\n"+answer);
            System.out.println("HTML RESPONSE END\n");

            out.println(answer);
            out.close();
            in.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    private String process(String request) {
        StringBuffer buf = new StringBuffer();
        if(request.contains("GET /favicon.ico HTTP/1.1")){
            buf.append("HTTP/1.1 404 Not Found\n\n");
            return buf.toString();
        } else {
            buf.append("HTTP/1.1 200 OK\n\n");
            buf.append(Server.HTMLLOGIN);
            return buf.toString();
        }
    }
}
```


```
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.company;

import java.io.IOException;

public class Main {
    public Main() {
    }

    public static void main(String[] args) {
        System.out.println("This Server starts running.\n");
        Server server = new Server(Integer.parseInt(args[0]));

        try {
            server.start();
        } catch (IOException var3) {
            var3.printStackTrace();
        }

    }
}
```


```
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.company;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {
    public static String HTMLLOGIN;
    private int portnum;
    private ServerSocket serverSocket;
    private ExecutorService executorService;

    public Server(int portnum) {
        this.portnum = portnum;

        try {
            this.serverSocket = new ServerSocket(portnum);
        } catch (IOException var6) {
            var6.printStackTrace();
        }

        try {
            InputStream input = this.getClass().getResourceAsStream("login.html");
            BufferedReader reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
            StringBuilder stringBuilder = new StringBuilder();

            for(char[] buffer = new char[10]; reader.read(buffer) != -1; buffer = new char[10]) {
                stringBuilder.append(new String(buffer));
            }

            reader.close();
            HTMLLOGIN = stringBuilder.toString();
        } catch (IOException var7) {
            var7.printStackTrace();
        }

        this.executorService = Executors.newFixedThreadPool(4);
    }

    public void start() throws IOException {
        while(true) {
            Socket socket = this.serverSocket.accept();
            this.executorService.submit(new HttpThread(socket));
        }
    }
}
```


Ich mache jetzt folgendes. Server starten. Mit Chrome darauf zu greifen. (www.rosenheim-cainsdorf.de:902) Das Formular ausfüllen.
Das Formular abschicken.

Ich bekomme dann diesen Output:


```
HTML REQUEST/POST:

HTML REQUEST/POST:

GET / HTTP/1.1
Host: www.rosenheim-cainsdorf.de:903
Connection: keep-alive
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Purpose: prefetch
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,eu;q=0.6
HTML REQUEST END

HTML RESPONSE:


HTTP/1.1 200 OK

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login!</title>
</head>
<body>
<form action="https://www.rosenheim-cainsdorf.de:903" method="post">
    <ul>
        <li>
            <label for="login">Benutzer</label>
            <input id="login" name="login">
        </li>
        <li>
            <label for="pass">Passwort</label>
            <input id="pass" name="pass" type="password">
        </li>
        <li>
            <button>anmelden</button>
        </li>
    </ul>
</form>
</body>
</html>
HTML RESPONSE END

HTML REQUEST/POST:

HTML REQUEST/POST:

HTML REQUEST/POST:

��U��³�ďI
�El+�@O��    y�y(U ��^��ۼ�����L��ظas����
HTML REQUEST END

HTML RESPONSE:


HTTP/1.1 200 OK

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login!</title>
</head>
<body>
<form action="https://www.rosenheim-cainsdorf.de:903" method="post">
    <ul>
        <li>
            <label for="login">Benutzer</label>
            <input id="login" name="login">
        </li>
        <li>
            <label for="pass">Passwort</label>
            <input id="pass" name="pass" type="password">
        </li>
        <li>
            <button>anmelden</button>
        </li>
    </ul>
</form>
</body>
</html>
HTML RESPONSE END
```

Was offensichtlich keinen Sinn ergibt. (also nicht richtig ist)


----------



## SuchtyTV (27. Jun 2020)

Eine weiterführende Frage wäre vllt:

Woher weiß ich, dass der Request:



```
GET / HTTP/1.1
Host: www.rosenheim-cainsdorf.de:903
Connection: keep-alive
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Purpose: prefetch
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,eu;q=0.6
```


Tatsächlich dort endet...


----------



## mihe7 (27. Jun 2020)

Anhand des folgenden CRLF (s. RFC 7230, S. 19, https://tools.ietf.org/html/rfc7230#section-3)


----------

