tom: Wiedermal premature end of script header

Hi!

Ich versuche gerade krampfhaft den Apache mit java zum Laufen zu bringen (sprich Java-Programme als cgi's, keine Servlets) aber
irgendwie scheine ich ziemlich grob daran zu scheitern.

Java-Code

public class MyClass1 {
  public MyClass1() {
  }
  public static void main(String[] args) {
    MyClass1 myClass1 = new MyClass1();
    try {

System.out.println("Content-type: text/html\n\n");
    System.out.println("<html>\n");
    System.out.println("TEST");
    System.out.println("</html>");
    } catch (Exception e) {
      System.out.println("UPS");
    }
  }
}

Also Content-type ist als erstes, Permissions sind auch auf 0755 gesetzt und beim lokalen aufruf von java MyClass1 klappt auch alles.
Nur wenn ichs ueber Browser aufruf sprich http://www.my.server:8080/test/cgi-bin/ dann birnt es ihn jedesmal. Perl oder Shellscripts laufen aber ...

wo kann der Fehler liegen?

lg, tom

  1. Nur wenn ichs ueber Browser aufruf sprich http://www.my.server:8080/test/cgi-bin/ dann birnt es ihn jedesmal. Perl oder Shellscripts laufen aber ...
    wo kann der Fehler liegen?

    "Premature end of ..." kann alles Mögliche bedeuten - im Wesentlichen schließe ich daraus, daß *nicht* Dein "Content-type" ausgegeben wird, sondern irgend eine Fehlermeldung von irgendwem.
    Und die möchte ich gerne sehen, also:

    • Ist das Dein lokaler Webserver?
    • Was steht im Error-Log?
    • Hast Du eine separate Logdatei für CGI-Fehler?
    1. "Premature end of ..." kann alles Mögliche bedeuten - im Wesentlichen schließe ich daraus, daß *nicht* Dein "Content-type" ausgegeben wird, sondern irgend eine Fehlermeldung von irgendwem.
      Und die möchte ich gerne sehen, also:

      • Ist das Dein lokaler Webserver?
      • Was steht im Error-Log?
      • Hast Du eine separate Logdatei für CGI-Fehler?

      grundsaetzlich vermute ich das auch, allerdings glaube ich eher das die Konfiguration nicht wirklich hinhaut (also nicht ein script-fehler). Ich vermute eher, dass der Apache nicht wirklich das class-file mit dem java-interpreter aufruft.

      (Apache 1.3.6, AIX 4.3.3, JDK 1.2.2.0)

      Script-output:
      ------ >8 Snipp ------
      Content-type: text/html

      <html>

      TEST
      </html>
      ------ >8 Snipp ------

      Errorlog:
      ------ >8 Snipp ------
      [Thu Mar 16 16:13:22 2000] [error] (8)Exec format error: exec of /www/cgi-bin/MyClass.class failed
      [Thu Mar 16 16:13:22 2000] [error] [client 192.168.1.186] Premature end of script headers: /www/cgi-bin/MyClass.class
      ------ >8 Snipp ------

      1. [Thu Mar 16 16:13:22 2000] [error] (8)Exec format error: exec of /www/cgi-bin/MyClass.class failed

        Na, das hilft doch schon mal.

        Der Webserver hat also versucht, "MyClass.class" vom Betriebssystem als Programm (Binärcode!) ausführen zu lassen.
        Offensichtlich befindet sich darin aber kein Maschinenprogramm, sondern irgendwas Anderes (ein JavaQuelltext?).

        Ich weiß nicht, wie Java via CGI funktioniert, aber offensichtlich hätte der Webserver den Aufruf eines Java-Interpreters oder so was gebraucht.
        Ob man den nun in Deinen Source hineinschreiben muß (z. B. in Zeile 1) oder irgendwo anders konfigurieren (beispielsweise eine Abbildung zwischeh *.class und einem Handler in der Webserver-Konfiguration) - RTFM ...

        1. Ich weiß nicht, wie Java via CGI funktioniert, aber offensichtlich hätte der Webserver den Aufruf eines Java-Interpreters oder so was gebraucht.
          Ob man den nun in Deinen Source hineinschreiben muß (z. B. in Zeile 1) oder irgendwo anders konfigurieren (beispielsweise eine Abbildung zwischeh *.class und einem Handler in der Webserver-Konfiguration) - RTFM ...

          Jep hab ich gemacht, aber irgendwie werd ich nicht schlau daraus. Ich habs sowohl ueber AddHandler und AddType als auch ueber Action versucht, aber es will nciht funken. Wenn ich mir allerdings einen primitiv wrapper in perl bastle (exec("java MyClass")) dann bekomme ich den output retour. Somit ist meine Frage mit welcher option kann ich dem Apache beibringen, bei einem bestimmten Handler einen bestimmten Interpreter aufzurufen?

          1. Hi Tom

            Wenn ich mir allerdings einen primitiv wrapper in perl bastle (exec("java MyClass")) dann bekomme ich
            den output retour.

            Na so'ne Ueberraschung auch. Dir ist der Unterschied hoffentlich klar. Beim ersten mal wolltest Du einfach
              MyClass.class
            ausfuehren, hier jetzt jedoch
              java MyClass
            . Letzteres ist natuerlich iO, aber ersteres setzt vorraus, dass es entweder eine gueltige Binaerdatei ist
            (was sie aber nicht ist, vielmehr handelt es sich um Java-Byte-Code), oder es ist eine Textdatei, deren
            erste Zeile den Interpreteraufruf enthaelt, z.B. #!/path/to/your/java. Das kannst Du aber auch nicht machen,
            denn dann ist es ja keine gueltige Class-Datei mehr. Der Umweg ueber einen Wrapper wird Dir also nicht
            erspart bleiben. Dann nimm aber lieber /bin/sh statt perl, denn die Shell ist um ein vielfaches schneller
            geladen.

            Somit ist meine Frage mit welcher option kann ich dem Apache beibringen, bei
            einem bestimmten Handler einen bestimmten Interpreter aufzurufen?

            Die erste Zeile der Textdatei. Aber geht ja hier leider nicht.

            So long, Calocybe