# HTTPHeader bei Safari?



## CodingSheep (16. Jan 2009)

Hallo,
ich arbeite im Moment an einem kleinen WebServer, der später als Basis eines ChatServers dienen soll...

Läuft auch alles perfekt, allerdings kommt Safari nicht ganz klar...
Habe hier mal 2 Screens:



wie man sieht, wird das error dokument im Firefox richtig dargestellt und Safari zeigt noch die gesendeten Header an.

Warum erkennt Safari nicht den HTTPHeader?

gesendet wird die Seite so:

```
public void send(BufferedWriter out, PrintStream ps) {
        try {
            out.write(header.toString());
            out.flush();
            ps.print(body);
        } catch(Exception e) { System.out.println("HTTPResponse: send failed: "+e);}
    }
```
wenn ich nur per PrintStream sende komme ich zum gleichen Ergebniss...

was ist der Fehler?

Danke,
CodingSheep


----------



## Ebenius (16. Jan 2009)

Melde Dich mal im Forum an, speichere das Dokument im Safari ab und lad's in Deine Eigenen Dateien. Und dann poste den Link zu Deinen Dateien.

BTW: Da fehlt ein Wort im Fehler-Text. Such's mal.


----------



## HoaX (16. Jan 2009)

ich würde dir nahe legen jetty zu verwenden, is nich groß, mächtig, und du kannst dennoch alles mit den request machen wie du magst


----------



## CodingSheep (17. Jan 2009)

@HoaX
ja, dass wäre zwar eine Möglichkeit, allerdings will ich den Server komplett selbst schreiben (gutes Training für sockets,threads, etc.)... und ich brauch den WebServer eig nur um entweder ein fehler zu senden oder den User einzuloggen oder den Chatstream zu streamen.. dafür hat Tomcat und Co. einfach zu viel Zeug das ich nicht brauche...

@Ebenius
okay, habs gemacht, hier das Dokument:
als .html: http://www.java-forum.org/de/userfiles/user15384/safarifehler.html
und als .rar weil als .html es ja erneut vom Browser geparst wird...: http://www.java-forum.org/de/userfiles/user15384/safarifehler.rar
PS: ja den fehler hab ich nach dem Posten auch bemerkt  werd ich gleich ändern. thx!

So und hier nochmal allegemein, damit man besser verstehen kann was ich meine und das Problem ist:

Also ich hab einen SocketServer, der wenn er eine Verbindung bekommt ein Connection objekt(eigener thread) erzeugt, indem das request vom browser geparst wird...
dann wird halt je nach request ein Response Objekt generiert, indem der ResponseHeader generiert und das Template geladen wird.
das Response objekt wird dann per send()-Funktion aufgefordert den Header per BufferedWriter und danach das Template per PrintStream an den OutputStream des Sockets zu senden...

*Hier die einzelnen Funktionen:*
_Template laden_

```
BufferedReader reader = new BufferedReader(new InputStreamReader(ResourceLoader.getResourceAsStream(filename)));
String line = null;
String body = "";
while ((line = reader.readLine()) != null) {
    body = body + line + "\n";
}
```
Danach werden noch Tags ersetzt etc etc...

_toString() Funktion des ResponseHeader(header) objekts_

```
public String toString()  {
        StringBuffer buffer = new StringBuffer(200);
        buffer.append(protocol).append(" ").append(code).append(" ").append(statusMsg).append("\r\n");  // Erste Zeile vom Header (z.B. HTTP\1.x 200 OK)
        buffer.append(getHeadersAsString());  // Header-Variablen (z.B. Server: WebServer)
        buffer.append("\r\n"); // Letzte Zeile des Headers um Header von der Seite zu trennen
        return buffer.toString();
    }

public String getHeadersAsString()  {
        StringBuffer buffer = new StringBuffer(200);
        Iterator<String> iter = getHeaderNames().iterator();
        String name;
        String value;
        SimpleDateFormat df = (SimpleDateFormat)Config.sys.get("df.full");
        buffer.append("Date").append(": ").append(df.format(new Date())).append("\r\n");
        buffer.append("Server").append(": ").append(Config.server.get("name")+"/"+Config.server.get("version")).append("\r\n");
        while (iter.hasNext()) {
            name = (String)iter.next();
            buffer.append(name).append(": ");
            value = (String)headers.get(name);
            buffer.append(value).append("\r\n");
        }
        return buffer.toString();
    }
```

_send() Funktion des Response Objekts_

```
public void send(BufferedWriter out, PrintStream ps) {
try {
      out.write(header.toString());
      out.flush();
      ps.print(body);
} catch(Exception e) { System.out.println("HTTPResponse: send failed: "+e);}
```

*Und hier noch ein Beispiel Header und Content:*
_Beispiel Header, so wie er an den BufferedWriter übergeben wird_

```
HTTP/1.x 403 Forbidden\r\n
Date: Sa, 17 Jan 2009 02:27:07 MEZ\r\n
Server: FunnyWebServer/1.0\r\n
Vary: accept-language,accept-charset\r\n
Keep-Alive: timeout=5, max=100\r\n
Content-Type: text/html\r\n
Connection: Keep-Alive\r\n
\r\n
```
_Beispiel HTML-Content, wie es an den PrintStream übergeben wird:_

```
<html>\n<head>\n</head>\n<body>\n>Kleiner Test...
\ntest123\n</body>\n</html>
```

Das Problem scheint zu sein das die Safari den Header nicht vom Content unterscheiden kann.. nur warum?
muss ich den header und content anders schicken als ich das über die send() methode mache?
beides per PrintStream / beides BufferedWriter / kein flush / .... ?

PS: Sry für Rechtschreibfehler etc. aber es ist schon spät


----------



## Ebenius (17. Jan 2009)

Weißt was seltsam ist: In dem File fehlt die HTTP-Version: 
	
	
	
	





```
HTTP 403 Forbidden
Date: Sa, 17 Jan 2009 02:36:01 MEZ
```

Da sollte doch HTTP/1.1 oder sowas stehen, ge?

Quatsch mal Deinen Server per Telnet an und schau was er Dir schickt.

Ebenius


----------



## CodingSheep (17. Jan 2009)

danke das war der fehler  :shock: 
hatte das /1.1 hinter HTTP vergessen   

aber jetzt gehts ja... hehe

und btw.:
Telnet geht ja nicht weil telnet 
a) port 23 ist 
und b) keinen HTTPRequest sendet

aber vielen Dank!


----------



## Gast2 (17. Jan 2009)

öhm,


```
telnet 127.0.0.1 1200
```

funktioniert nicht bei Dir? ... was hast Du für ein Betriebssystem ... funktioniert bei mir unter Linux und Windows super

hand, mogel


----------



## CodingSheep (17. Jan 2009)

ja verbinden kann ich mich natürlich per telnet auf einen anderen Port...
aber was dann?
der Server braucht ja erst mal einen HTTPRequest damit er einen Header schicken kann...
und telnet schickt ja keine Header...


----------



## Ebenius (18. Jan 2009)

Hmm.  Bist Du sicher, dass Du einen HTTP-Server entwickeln willst, wenn Du keinen HTTP-Request per Hand tippen kannst? Du kannst doch den Request im Telnet selber schicken. Dazu gehört nicht viel. Solltest Dir das Wissen definitiv aneignen, wenn Du weiter kommen willst.


----------



## Gast2 (18. Jan 2009)

CodingSheep hat gesagt.:
			
		

> ja verbinden kann ich mich natürlich per telnet auf einen anderen Port...
> aber was dann?




```
mogel@Shorty:~$ telnet [url]www.google.de[/url] 80
Trying 74.125.39.147...
Connected to [url]www.l.google.com[/url].
Escape character is '^]'.
get / http/1.1

HTTP/1.1 302 Found
Location: [url]http://www.google.de/[/url]
Cache-Control: private
Content-Type: text/html; charset=UTF-8
18-Jan-2011 12:56:36 GMT; path=/; domain=.google.com
Date: Sun, 18 Jan 2009 12:56:36 GMT
Server: gws
Content-Length: 218

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
[url="http://www.google.de/"]here[/url].
</BODY></HTML>
Connection closed by foreign host.
```

*Zeile 5* ist die wichtige Zeile ... da wartet der Server von Google auf meinen Wunsch ... und ich möchte die index-Datei haben ... das die dort nicht, sagt mir die Antwort vom Server ... im übrigen macht Telnet unter Windows kein Echo Deiner Eingaben ... dort siehst Du quasi nix

etwas Wissen über HTTP-Requests kann nicht schaden ... im übrigen kannst Du mit Telnet auch Mails verschicken/abrufen und was sonst noch so Textbasiert an Protokollen existiert ... ach ja - die Nutzung von Telnet darf in Deutschland von unwissenden Beamten als Straftat aufgefasst werden ... also pass auf welchen Server Du mit Telnet besuchst



> telnet schickt ja keine Header...


hatte ich nie behauptet ... Telnet lebte schon immer nur davon das der Benutzer etwas eingibt

hand, mogel


----------



## CodingSheep (18. Jan 2009)

ahhh okay!
Vielen Dank!

hatte bissher noch nicht wirklich mit telnet zu tun... wusste nicht das man da einfach alles mögliche ansprechen kann!
HTTPRequests kenn ich mich aus....

aber das ist echt geil, kann man viel besser testen!
thx!


----------



## Ebenius (18. Jan 2009)

Nicht wahr?


----------

