Sven Wagener: Angeben von EXE als CGI im OmniHttpd Server

Hallöli!

Wie geb ich beim OmniHTTPd 2.04 an, dass der Server EXE als CGI ausführen soll?

  1. Moin!

    Wie geb ich beim OmniHTTPd 2.04 an, dass der Server EXE als CGI ausführen soll?

    Hmm, ich kenne OmniHTTPd nicht, aber das CGI-Konzept ist eigentlich recht eindeutig.

    IMHO kommt es nie auf die Erweiterung an, sondern darauf, dass es im richtigen Verzeichnis, also /cgi-bin/ steht.

    Falls dort stehende Programme nicht ausgefuehrt werden, wird wohl cgi-bin an sich ignoriert.

    Ausserhalb des cgi-bin werden Scripte sowieso nicht ausgefuehrt.

    Michael

    1. Ich kämpfe die ganze Zeit mit meinem Server. Der zeigt nämlich nicht den Wert, den die exe zuückgeben soll!

      Der gibt mir zwar ein HTML-Dokument zurück, aber nicht dass, was ich hab generieren lassen. Beispiel:

      Das Formular:
      <html>
      <head>
      <title>Gast eintragen</title>
      </head>

      <body>
      <b>Svens Rechner</b> - 1. CGI Versuch<br><br><i>Die dolle Engine!</i>
      <form action="/cgi-bin/gb.exe" method=GET>
      <input type="text" name=name value=""><br>
      <input type="text" name=nachname value=""><br>
      <input type="text" name=email value=""><br>
      <input type="text" name=homepage value=""><br>
      <input type="text" name=kommentar value=""><br>
      <input type="submit" value"Abschicken" name="send">
      </form>
      </body>
      </html>

      exe: (gb.exe im cgi-bin verzeichnis)

      #include <stdio.h>
      #include <stdlib.h>

      void main()
      {
      printf ("<html><head></head><body>%s\n</body></html>", getenv("QUERY_STRING"));
      }

      Ergebnis:

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
      <HTML><HEAD>
      <META content="text/html; charset=windows-1252" http-equiv=Content-Type></HEAD>
      <BODY></BODY></HTML>

      WARUM???

      1. Hi Sven,

        du hast den Header vergessen -
        hier der korrigierte Code
        ------------cut-------------
        #include <stdio.h>
        #include <stdlib.h>

        void main()
        {
                          printf ("Content-Type: text/html\n\n");
        printf ("<html><head></head><body>%s\n</body></html>", getenv("QUERY_STRING"));
        }
        ------------cut-------------

        Versuchs wirklich mal mit perl, da ist die CGI-mäßige Doku sehr viel besser.

        Viel Glück
        gero

        1. VIELEN DANK GERO!

          Ich Stell dich ein!

          ;-)

          CU Sven!

      2. Hallo Sven,

        ich hatte es weiter unten schon mal erwähnt (in der einen Antwort zu Deinem C-Problem), es fehlt in Deinem Prog zumindest die Zeile

        print("Content-Type: text/html\n\n");

        bevor weitere html-Ausgaben folgen. Möglich, daß es ohne den Header beim OmniHTTPd trotzdem funktioniert, die meisten anderen Server dagegen werden ihren Dienst verweigern. Ansonsten noch eine Kleinigkeit:

        void main()

        muß normalerweise "int main(void)" oder in der Kurzschreibweise einfach "main()" heißen, da der Return-Typ von main() immer int ist (ein Programm gibt normalerweise am Ende immer einen integer Return-Code zurück. 0 bedeutet dabei, daß alles ok gelaufen ist, andere Zahlenwerte stehen für einen Fehlercode).

        {

        »»  printf ("<html><head></head><body>%s\n</body></html>", getenv("QUERY_STRING"));

        }

        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
        <HTML><HEAD>
        <META content="text/html; charset=windows-1252" http-equiv=Content-Type></HEAD>
        <BODY></BODY></HTML>

        WARUM???

        Die Ausgabe läßt sich wie folgt interpretieren: Zunächst mal hat omniHTTPd offenbar das Programm ausgeführt, obwohl es keinen HTTP-Header ausgegeben hat (s.o.). Die Zeilen mit <!DOCTYPE ...> und <META ...> sind offenbar vom Server selbst hinzugefügt worden. Der HTML-Text <body></body></html> deutet darauf hin, daß getenv("QUERY_STRING") einen leeren String bzw. einen Nullpointer zurückgegeben hat. Aus irgendeinem Grund ist also QUERY_STRING bei Dir nicht definiert.
        probier doch z.B. mal folgendes (ungetestet):

        #include<stdio.h>
        #include<stdlib.h>
        #include<string.h>   // ich hoffe, das reicht an includes... <g>

        main() {
          char *s = getenv("QUERY_STRING");
          
          printf("Content-Type: text/html\n\n<html><body><pre>\n");

        if (s==NULL) printf("QUERY_STRING war nicht definiert\n");
          else if (strlen(s)==0) printf("QUERY_STRING ist ein leerer String\n");
          else printf("QUERY_STRING=%s\n", s);

        printf("</pre></body></html>\n");
          return 0;
        }

        Viele Grüße

        Andreas Bierhals