ritschmanhard: CGI-Modul und xml Ausgabe im FF/NS - Ich find nix...

Hallo!

Nachdem ich gelesen hatte, dass es ein Perl CGI modul gibt, welches eine höhere Standardisierung erlaubt, wollte ich dieses verwenden.

Ich mache also folgendes (PERL):

##alt: funktionierte auch FF/NS:
##print "Content-type: text/xml\n\n";
##alt ende

##neu: funktioniert nur im IE:
my myCGI = new CGI;
myCGI->header = ( -type =>'text/xml',
                  -expires => '30s');
print $myCGI->header();
##neu ende

print "<?xml version="1.0" encoding="ISO-8859-1"?>\n";
print "<?xml stylesheet type="text/xsl" href="/stylesheets/my.xsl"?>\n";
print "<document>test</document>\n";
exit(0);

Als Ausgabe in Netscape und Firefox erhalte ich einen durchgestrichenen String "test" (Anmerkung: Nein, das steht nicht in my.xsl).

Der Quelltext (lt FF) lautet:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="/ugmIF/stylesheets/getMenu.xsl"?>
<document>test</document>

Die Javascript Konsole (FF) bleibt leer.

Eine testweise Ausgabe des Headers auf dem Server ergibt (*=Leerzeile):

Expires: Tue, 07 Aug 2007 13:19:12 GMT
Date: Tue, 07 Aug 2007 13:18:42 GMT
Content-Type: text/xml; charset=ISO-8859-1
*
*

Wo ist mein Fehler? - Ich nehme jeden Tip wirklich gerne dankend an.

Danke und bis bald,
Richard

  1. Hallo!

    Noch eine kleine Ergänzung:
    schreibe ich nach alter Manier folgendes:

    print"Expires: Tue, 07 Aug 2007 13:19:12 GMT\n";
    print"Date: Tue, 07 Aug 2007 13:18:42 GMT";
    print"Content-Type: text/xml; charset=ISO-8859-1\n\n";

    Dann gehts auch in FF/NS wieder?! (Kopfkratz)

    Grüsse,
    Richard

    1. HiHo!

      Also zunächst eine Ergänzung:
      der vollständige xml text lautet:
      <document><s>text</s></document>

      In xhtml ist <s></s> als durchgestrichen angegeben...
      ich will aber nicht, dass der Browser die gelieferten Daten als xhtml interpretiert (siehe Content-Type="text/xml"...)
      Wie krieg ich den NS/FF dazu, dass er nicht von einem XHTML Dokument ausgeht?

      Grüsse,
      Richard

  2. Hallo!

    my myCGI = new CGI;
    myCGI->header = ( -type =>'text/xml',
                      -expires => '30s');
    print $myCGI->header();

    Mit der header-Funktion speicherst du keinen Header im cgi-Objekt, sondern diese Methode generiert einfach nur einen http-header und gibt diesen zurück. Soll heißen, du musst schon die Rückgabe des ersten header()-Aufrufes ausgeben.

    außerdem fehlen da ein paar $-zeichen, aber das ist wohl nur n Tippfehler, nehme ich an.

    Grüße, Skrilax

    --
    Democracy is a device which ensures that we shall be governed no better than we deserve.
    (G. B. Shaw)
    1. Hallo!

      my myCGI = new CGI;
      myCGI->header = ( -type =>'text/xml',
                        -expires => '30s');
      print $myCGI->header();

      Ach, sehe ich erst jetzt. header() ist überhaupt nur eine Methode, keine Variable. d.h. das Gleichheitszeichen muss außerdem raus. So also:
      print $myCGI->header(-type => 'text/xml', usw. );

      Grüße, Skrilax

      --
      Democracy is a device which ensures that we shall be governed no better than we deserve.
      (G. B. Shaw)
      1. Hallo Skrilax!

        Tausend Dank von einem betriebsblinden,
        Richard

        1. Wenn Perl das so gefressen hat, hast Du weder warnings noch strict an und vermutlich noch jede Menge anderer Bugs im Code.

          Die ersten zwei Zeilen jedes Perl-Script sollten

          #!/usr/bin/perl -w
          use strict;

          sein, CGIs und andere Programme, die über das Internet erreichbar sind oder setuid/setgid laufen, sollten außerdem den Taint Mode einschalten (siehe auch perldoc perlsec):

          #!/usr/bin/perl -T -w
          use strict;

          So lange die Kombination aus -w und strict Warnungen und/oder Fehler erzeugt, ist der Code nicht einwandfrei und wird mit hoher Wahrscheinlichkeit nicht das machen, was sich der Autor dachte.

          Alexander

          1. Hi,

            Ausserdem wuerde ich zum entwickeln noch
            use CGI::Carp qw(fatalsToBrowser);
            in das Script schreiben. Was das macht ist bei Selfhtml beschrieben.

            mfG,
            steckl