HTTPHeader bei Safari?

Status
Nicht offen für weitere Antworten.
C

CodingSheep

Gast
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:
Code:
    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

Top Contributor
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

Top Contributor
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

Mitglied
@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 :D 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
Code:
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
Code:
    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
Code:
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
Code:
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:
Code:
<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 :D
 

Ebenius

Top Contributor
Weißt was seltsam ist: In dem File fehlt die HTTP-Version:
Code:
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

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

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!
 
G

Gast2

Gast
öhm,

Code:
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

Mitglied
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

Top Contributor
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. :)
 
G

Gast2

Gast
CodingSheep hat gesagt.:
ja verbinden kann ich mich natürlich per telnet auf einen anderen Port...
aber was dann?

Code:
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

Mitglied
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!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben