HTTPHeader streamen Safari?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • HTTPHeader streamen Safari?

    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:
    [Blockierte Grafik: http://img152.imageshack.us/img152/9938/java1kp3.th.jpg]
    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:

    Quellcode

    1. public void send(BufferedWriter out, PrintStream ps) {
    2. try {
    3. out.write(header.toString());
    4. out.flush();
    5. ps.print(body);
    6. } catch(Exception e) { System.out.println("HTTPResponse: send failed: "+e);}
    7. }

    wenn ich nur per PrintStream sende komme ich zum gleichen Ergebniss...

    was ist der Fehler?

    Danke,
    CodingSheep
  • 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

    Quellcode

    1. BufferedReader reader = new BufferedReader(new InputStreamReader(ResourceLoader.getResourceAsStream(filename)));
    2. String line = null;
    3. String body = "";
    4. while ((line = reader.readLine()) != null) {
    5. body = body + line + "\n";
    6. }

    Danach werden noch Tags ersetzt etc etc...

    toString() Funktion des ResponseHeader(header) objekts

    Quellcode

    1. public String toString() {
    2. StringBuffer buffer = new StringBuffer(200);
    3. buffer.append(protocol).append(" ").append(code).append(" ").append(statusMsg).append("\r\n"); // Erste Zeile vom Header (z.B. HTTP\1.x 200 OK)
    4. buffer.append(getHeadersAsString()); // Header-Variablen (z.B. Server: WebServer)
    5. buffer.append("\r\n"); // Letzte Zeile des Headers um Header von der Seite zu trennen
    6. return buffer.toString();
    7. }
    8. public String getHeadersAsString() {
    9. StringBuffer buffer = new StringBuffer(200);
    10. Iterator<String> iter = getHeaderNames().iterator();
    11. String name;
    12. String value;
    13. SimpleDateFormat df = (SimpleDateFormat)Config.sys.get("df.full");
    14. buffer.append("Date").append(": ").append(df.format(new Date())).append("\r\n");
    15. buffer.append("Server").append(": ").append(Config.server.get("name")+"/"+Config.server.get("version")).append("\r\n");
    16. while (iter.hasNext()) {
    17. name = (String)iter.next();
    18. buffer.append(name).append(": ");
    19. value = (String)headers.get(name);
    20. buffer.append(value).append("\r\n");
    21. }
    22. return buffer.toString();
    23. }
    Alles anzeigen


    send() Funktion des Response Objekts

    Quellcode

    1. public void send(BufferedWriter out, PrintStream ps) {
    2. try {
    3. out.write(header.toString());
    4. out.flush();
    5. ps.print(body);
    6. } 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

    Quellcode

    1. HTTP/1.x 403 Forbidden\r\n
    2. Date: Sa, 17 Jan 2009 02:27:07 MEZ\r\n
    3. Server: FunnyWebServer/1.0\r\n
    4. Vary: accept-language,accept-charset\r\n
    5. Keep-Alive: timeout=5, max=100\r\n
    6. Content-Type: text/html\r\n
    7. Connection: Keep-Alive\r\n
    8. \r\n

    Beispiel HTML-Content, wie es an den PrintStream übergeben wird:

    HTML-Quellcode

    1. <html>\n<head>\n</head>\n<body>\n>Kleiner Test...<br>\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 / .... ?