Axel Richter: HTTP-Proxyserver programmieren

Beitrag lesen

Hallo,

Aber jetzt habe ich ein anderes Problem, und zwar würde ich gerne den HTML-Quelltext verändern können. Das heißt ich will z.B. jeden enthaltenen String "Computer" gegen "Kaltschrank" ersetzen. Nur ist das dann wieder komplizierter als ich vermutet hätte.

So funktioniert es wunderbar, indem ich die Bytes direkt vom Server an den Client weiterreiche:

Nur so funktioniert es nicht mehr richtig:

byte[] buf = new byte[4096];
int bytesIn = 0;
String str_buf = "";
if (contentType.equals("text/html")) {
    while ( ((byteCount < contentLength) || (waitForDisconnect))
                         && ((bytesIn = from_serv.read(buf)) >= 0) )
    {
        String str = new String(buf);
        str = str.replaceAll("Computer", "Kaltschrank");
        out.write(str.getBytes(), 0, str.length());
        byteCount += bytesIn;
    }
}
Ist nicht jedes Zeichen im String ein Byte?

Nicht immer. Das ist abhängig vom Charset. Bei UTF-8 hat ein Zeichen manchmal zwei Byte.

class Main {
    public static void main(String[] args) {
        try {
            String str = new String("01234\u20AC56789");
            byte[] def = str.getBytes();
            byte[] utf = str.getBytes("UTF-8");
            byte[] iso = str.getBytes("ISO-8859-1");
            System.out.println(str);
            System.out.println(str.length());
            System.out.println(def.length);
            System.out.println(utf.length);
            System.out.println(iso.length);
        } catch (java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

Allerdings ist das, wie ich glaube, nicht Dein Problem. Das liegt wohl darin, dass Du _nachträglich_ durch Deine Manipulationen die contentLength veränderst, welche Du aber schon im Header übertragen hast.

viele Grüße

Axel