Kurti: malformed header

Moin Jungs..  und Maedels! ;)

folgendes bekomme ich bei meinem Schript...  
malformed header from script. Bad header=: /.../cgi-bin/vollm.cgi

wenn ich das teil ,it perl -c prüfe ist alles ok.
Kann es evt an einem HTML-Haeder liegen, den das Script in eine Datei schreibt ?

Danke schonmal !

denn bis dann,
                                 Kurti

  1. Hi,

    wenn ich das teil ,it perl -c prüfe ist alles ok.

    Dir sollte bewußt werden, daß Du genau steuern kannst, in welchem Verzeichnis Du Dich bei perl -c script.pl befindest - im CGI-Einsatz ist das unmöglich. Häufig ist eine nicht gefundene Datei Ursache für eine Fehlermeldung, die dann ein falscher HTTP-Header ist.

    Kann es evt an einem HTML-Haeder liegen, den das Script in eine Datei schreibt ?

    Im CGI-Einsatz mußt Du einen HTTP-Header nach STDOUT zurückprinten. Was Du in eine Datei schreibst ist egal, aber prüfe in jedem Fall den Fehlercode:

    open(...) or die "Kann Datei nicht oeffnen: $!";

    Der Fehler steht dann im Error-Log.

    Cheatah

    1. Hi,

      wenn ich das teil ,it perl -c prüfe ist alles ok.

      Dir sollte bewußt werden, daß Du genau steuern kannst, in welchem Verzeichnis Du Dich bei perl -c script.pl befindest - im CGI-Einsatz ist das unmöglich.

      Was meinst du damit ?

      Häufig ist eine nicht gefundene Datei Ursache für eine Fehlermeldung, die dann ein falscher HTTP-Header ist.
      Ja, as hab ich schon mitbekommen. Der vorherige Fehler ruehrte von einer falsch benannten html-Dati.

      Im CGI-Einsatz mußt Du einen HTTP-Header nach STDOUT zurückprinten. Was Du in eine Datei schreibst ist egal, aber prüfe in jedem Fall den Fehlercode:

      open(...) or die "Kann Datei nicht oeffnen: $!";

      Der Fehler steht dann im Error-Log.

      ist das hier :
      ####################################

      open(VOLLMACHT, ">vollma.htm");
      print VOLLMACHT << "[END]";

      <html>
      <head>
      [...]

      [END]

      EOP

      close(VOLLMACHT);
      ####################################
      evt. falsch ?

      das wird in eine html geschrieben, die Teil eines Frames ist, der dann übers script ausgegeben wird.
      denn bis dann,
                                     Kurti
      ####################################

      1. Hi,

        Dir sollte bewußt werden, daß Du genau steuern kannst, in welchem Verzeichnis Du Dich bei perl -c script.pl befindest - im CGI-Einsatz ist das unmöglich.
        Was meinst du damit ?

        wenn Du von der Kommandozeile aus das Script testest, weißt Du, in welchem Verzeichnis Du Dich befindest. Wenn Du das Script über HTTP startest, kannst Du überall sein. Relative Pfadangaben sind daher sinnfrei.

        open(...) or die "Kann Datei nicht oeffnen: $!";

        Der Fehler steht dann im Error-Log.

        ist das hier :

        open(VOLLMACHT, ">vollma.htm");

        [...]

        close(VOLLMACHT);

        evt. falsch ?

        Ja, weil Du den Rückgabewert nicht wie oben beschrieben abfängst. Füge einen geeigneten "or die"-Text sowohl beim open als auch (bei Schreibzugriffen) beim close hinzu. Die Fehlermeldungen findest Du dann im Error-Log Deines Servers.

        Cheatah

        1. Moins !

          wenn Du von der Kommandozeile aus das Script testest, weißt Du, in welchem Verzeichnis Du Dich befindest. Wenn Du das Script über HTTP startest, kannst Du überall sein. Relative Pfadangaben sind daher sinnfrei.

          Achso!  Ja, das ist klar. :)

          ist das hier :
          open(VOLLMACHT, ">vollma.htm");
          »»[...]
          close(VOLLMACHT);

          evt. falsch ?

          Ja, weil Du den Rückgabewert nicht wie oben beschrieben abfängst. Füge einen geeigneten "or die"-Text sowohl beim open als auch (bei Schreibzugriffen) beim close hinzu. Die Fehlermeldungen findest Du dann im Error-Log Deines Servers.

          Aber ansich funktioniert diese Kombination, oder ?

          Danke nochmal !!

          denn bis dann,
                                          Kurti

          1. Hi,

            wenn Du von der Kommandozeile aus das Script testest, weißt Du, in welchem Verzeichnis Du Dich befindest. Wenn Du das Script über HTTP startest, kannst Du überall sein. Relative Pfadangaben sind daher sinnfrei.
            Achso!  Ja, das ist klar. :)

            könntest Du bitte zwischen zitiertem und eigenem Text eine Leerzeile lassen? Dann brauche ich nicht zu suchen, was jetzt eigentlich von Dir stammt... :-(

            [HERE-Dokument in Datei]

            Aber ansich funktioniert diese Kombination, oder ?

            Hab ich zwar noch nie getestet, sollte aber an sich kein Problem darstellen.

            Cheatah

            1. Moins!

              könntest Du bitte zwischen zitiertem und eigenem Text eine Leerzeile lassen? Dann brauche ich nicht zu suchen, was jetzt eigentlich von Dir stammt... :-(

              Oki, geht klar. :-)

              Sorry, aber eins ist immer noch:

              #############
              print << "[END]" or die "geht nich... : $!";

              <html>

              <head>
              <title>Vollmacht für $Formular{'Minderjaehriger'} drucken</title>
              <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
              </head>

              <frameset framespacing="0" border="false" frameborder="0" rows="*,20%">
                <frame name="Vollmacht" target="Fussnoten" src="vollma.htm" scrolling="auto"
                marginwidth="0" marginheight="0">
                <frame name="Drucktaste" src="button.htm">
              </frameset>
              </html>
              [END]
              EOP
              ###########

              Dieses sollte ja eigendlich eine Frameseite mit zwei seiten ausgeben. Den Frame krieg ich auch allerdings nur mit "premture end of script haeders: [pfad]/button.htm bzw. vollma.htm

              das serverlog krieg ich erst morgen da ich das bei mienem hoster teste...

              denn bis dann,
                                            Kurti

              1. Hi,

                print << "[END]" or die "geht nich... : $!";

                nein nein, Du sollst bei _open_ und _close_ den Fehlercode abfangen, nicht bei print! :-)

                Dieses sollte ja eigendlich eine Frameseite mit zwei seiten ausgeben. Den Frame krieg ich auch allerdings nur mit "premture end of script haeders: [pfad]/button.htm bzw. vollma.htm

                Wo gibst Du denn den HTTP-Header aus? Den brauchst Du bei Ausgaben in eine Datei nicht, bei Ausgaben, die über HTTP zurückgehen aber selbstverständlich schon.

                Cheatah

                1. Moins!

                  nein nein, Du sollst bei _open_ und _close_ den Fehlercode abfangen, nicht bei print! :-)

                  Ich habs überall da angewendet wo Fehler haetten auftreten koennen, natuerlich auch bei den opens und closes.. :-)

                  Dieses sollte ja eigendlich eine Frameseite mit zwei seiten ausgeben. Den Frame krieg ich auch allerdings nur mit "premture end of script haeders: [pfad]/button.htm bzw. vollma.htm

                  Wo gibst Du denn den HTTP-Header aus? Den brauchst Du bei Ausgaben in eine Datei nicht, bei Ausgaben, die über HTTP zurückgehen aber selbstverständlich schon.

                  Ich hab eine Fertige html-datei die nicht geaendert wird, Das ist die untere Seite. Die obere wird vom Script geschrieben. Die Hauptseite wird direkt vom Skript auf den Schirm mittels print << "[END]" gegeben.

                  Jede Datei mit nem eigenen Haeder.

                  denn bis dann,
                                              Kurti

                  1. Hi,

                    nein nein, Du sollst bei _open_ und _close_ den Fehlercode abfangen, nicht bei print! :-)

                    Ich habs überall da angewendet wo Fehler haetten auftreten koennen, natuerlich auch bei den opens und closes.. :-)

                    zu viel ist aber auch nicht gut. Nur da, wo es Sinn macht, aber eben auch in allen diesen Fällen.

                    Wo gibst Du denn den HTTP-Header aus?

                    Ich hab eine Fertige html-datei die nicht geaendert wird, Das ist die untere Seite.

                    Wie bekommt der User diese?

                    Die obere wird vom Script geschrieben.

                    Wie, wohin, wie bekommt der User sie?

                    Die Hauptseite wird direkt vom Skript auf den Schirm mittels print << "[END]" gegeben.

                    Wo gibst Du den HTTP-Header hierfür aus, wie lautet er?

                    Jede Datei mit nem eigenen Haeder.

                    Noch einmal: _Dateien_ brauchen keinen HTTP-Header. Die _Ausgabe_ des CGI-Scripts schon.

                    Und falls das das Mißverständnis ist: Der Bereich "<head>...</head>" ist der HTML-Header. Der HTTP-Header ist die gesamte Ausgabe bis zur ersten Leerzeile, gewöhnlich mindestens mit einem Content-type.

                    Cheatah

                    1. Hi,

                      nein nein, Du sollst bei _open_ und _close_ den Fehlercode abfangen, nicht bei print! :-)

                      Ich habs überall da angewendet wo Fehler haetten auftreten koennen, natuerlich auch bei den opens und closes.. :-)

                      zu viel ist aber auch nicht gut. Nur da, wo es Sinn macht, aber eben auch in allen diesen Fällen.

                      Wo gibst Du denn den HTTP-Header aus?

                      Ich hab eine Fertige html-datei die nicht geaendert wird, Das ist die untere Seite.

                      Wie bekommt der User diese?

                      Die obere wird vom Script geschrieben.

                      Wie, wohin, wie bekommt der User sie?

                      Die Hauptseite wird direkt vom Skript auf den Schirm mittels print << "[END]" gegeben.

                      Wo gibst Du den HTTP-Header hierfür aus, wie lautet er?

                      Jede Datei mit nem eigenen Haeder.

                      Noch einmal: _Dateien_ brauchen keinen HTTP-Header. Die _Ausgabe_ des CGI-Scripts schon.

                      Und falls das das Mißverständnis ist: Der Bereich "<head>...</head>" ist der HTML-Header. Der HTTP-Header ist die gesamte Ausgabe bis zur ersten Leerzeile, gewöhnlich mindestens mit einem Content-type.

                      Cheatah

                    2. Moins!

                      Ich habs überall da angewendet wo Fehler haetten auftreten koennen, natuerlich auch bei den opens und closes.. :-)

                      zu viel ist aber auch nicht gut. Nur da, wo es Sinn macht, aber eben auch in allen diesen Fällen.

                      Ok, die ueberfluessigen hab ich weggenommen..

                      Wo gibst Du denn den HTTP-Header aus?

                      den _HTTP_ Haeder (jetzt weiss ich was du meinst ;)) geb ich im Hauptdokument mit dem cgi aus:

                      Hauptseite

                      print "Content-type: text/html\n\n";

                      print << "[END]" or die "Kann Datei nicht oeffnen 4 : $!";
                      <html>
                      <head>
                      [...]

                      Ich hab eine Fertige html-datei die nicht geaendert wird, Das ist die untere Seite.

                      Wie bekommt der User diese?

                      Durch die Frameseite (Hauptteil)

                      Die obere wird vom Script geschrieben.
                      Wie, wohin, wie bekommt der User sie?

                      Wird ins cgi-bin geschrieben und wird von der Hauptseite ausgegeben.

                      Die Hauptseite wird direkt vom Skript auf den Schirm mittels print << "[END]" gegeben.

                      Wo gibst Du den HTTP-Header hierfür aus, wie lautet er?

                      s.o.

                      Noch einmal: _Dateien_ brauchen keinen HTTP-Header. Die _Ausgabe_ des CGI-Scripts schon.

                      Und falls das das Mißverständnis ist: Der Bereich "<head>...</head>" ist der HTML-Header. Der HTTP-Header ist die gesamte Ausgabe bis zur ersten Leerzeile, gewöhnlich mindestens mit einem Content-type.

                      Das war tatsaechlich ein missverstaendniss. :-()

                      denn bis dann,
                                                   Kurti

                      1. Hi,

                        zu viel ist aber auch nicht gut. Nur da, wo es Sinn macht, aber eben auch in allen diesen Fällen.
                        Ok, die ueberfluessigen hab ich weggenommen..

                        offenbar noch nicht:

                        print << "[END]" or die "Kann Datei nicht oeffnen 4 : $!";

                        Hier ist es falsch.

                        Die obere wird vom Script geschrieben.
                        Wie, wohin, wie bekommt der User sie?
                        Wird ins cgi-bin geschrieben und wird von der Hauptseite ausgegeben.

                        Bingo, wir haben einen Gewinner.

                        Wenn der Server auch nur halbwegs vernünftig konfiguriert ist, wird er Dir niemals eine *.html-Datei ausgeben, die im cgi-bin liegt. Gleiches gilt für alle anderen nicht-Scripts wie *.gif, *.js, *.txt - password.txt beispielsweise.

                        Cheatah

                        1. Moins !

                          Bingo, wir haben einen Gewinner.

                          *g*

                          Wenn der Server auch nur halbwegs vernünftig konfiguriert ist, wird er Dir niemals eine *.html-Datei ausgeben, die im cgi-bin liegt. Gleiches gilt für alle anderen nicht-Scripts wie *.gif, *.js, *.txt - password.txt beispielsweise.

                          Aus Sicherheitsgründen ?

                          Gilt das auch fuer darin angelegte Unterverzeichnisse ?

                          denn bis dann,
                                                       Kurti

                          1. Hi,

                            Wenn der Server auch nur halbwegs vernünftig konfiguriert ist, wird er Dir niemals eine *.html-Datei ausgeben, die im cgi-bin liegt.

                            Aus Sicherheitsgründen ?

                            Gilt das auch fuer darin angelegte Unterverzeichnisse ?

                            ja und ja.

                            Cheatah