Christoph Stocker: HTTP-Methode POST (Größe?)

hi!

hat jemand eine ahnung, wie groß so ein
http POST werden darf (z.B. Angabe in KB
oder in Zeichen).

danke
mfg, chris

  1. Hi,

    hat jemand eine ahnung, wie groß so ein
    http POST werden darf (z.B. Angabe in KB
    oder in Zeichen).

    so groß, wie der Arbeitsspeicher beim Server verkraftet.

    Cheatah

    1. Hallo Christoph,

      so groß, wie der Arbeitsspeicher beim Server verkraftet.

      im Prinzip hat Cheatah da Recht. Allerdings muss auch der Arbeitsspeicher am Client mitspielen, da das Posting vorberechnet und in http-konformen Zeichensatz umgewandelt wird.

      In der Praxis ist der Post-Bereich serverseitig auf 8M begrenzt und für Fileuploads sogar auf 2M.

      Bei kommerziellen Anbietern habe ich siogar schon erlebt, dass die den Enveironment-Berich auf 1M begrenzt hatte und den File-Upload i.d.R. ganz ausschalten.

      Gruß

      Tom

      1. Hi Tom,

        Allerdings muss auch der Arbeitsspeicher am Client
        mitspielen, da das Posting vorberechnet und in http-
        konformen Zeichensatz umgewandelt wird.

        wieso sollte das in einem einzigen Arbeitsschritt
        erfolgen müssen?
        Das ist doch eine Frage der Browser-Implementierung.

        In der Praxis ist der Post-Bereich serverseitig auf
        8M begrenzt und für Fileuploads sogar auf 2M.

        Woher hast Du diese Zahlen (die mit Sicherheit auf
        jedem konkreten Server anders lauten werden)?

        Bei kommerziellen Anbietern habe ich siogar schon
        erlebt, dass die den Enveironment-Berich auf 1M
        begrenzt hatte und den File-Upload i.d.R. ganz
        ausschalten.

        Was hat POST (das auf dem Server via STDIN übergeben
        wird) mit der Größe des Environment zu tun?

        Viele Grüße
        <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

        1. Holladiwaldfee

          In der Praxis ist der Post-Bereich serverseitig auf
          8M begrenzt und für Fileuploads sogar auf 2M.

          Woher hast Du diese Zahlen (die mit Sicherheit auf
          jedem konkreten Server anders lauten werden)?

          Das sind die default-Werte von PHP 4:
          Bei Datei-Uploads je Datei max. 2 Mb, das gesamte POST aber nicht größer als 8 Mb. Kann man aber in der php.ini anpassen ;-)

          Ciao,

          Harry

          1. Hi Harry,

            In der Praxis ist der Post-Bereich serverseitig auf
            8M begrenzt und für Fileuploads sogar auf 2M.
            Woher hast Du diese Zahlen (die mit Sicherheit auf
            jedem konkreten Server anders lauten werden)?
            Das sind die default-Werte von PHP 4:

            danke für die Aufklärung.

            Da das Topic allerdings (HTTP) hieß und nicht (PHP) ...

            Viele Grüße
            <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

            1. Hi Michael,

              Da das Topic allerdings (HTTP) hieß und nicht (PHP) ...

              macht nix, kein Problem für mich. Du kannst natürlich Dein POST auch an jede xbeliebige HTML-Datei auf dem Server richten. Das wird ihr (beim Apachen) sogar zugestellt. Und damit die Datei es empfangen kann, wird es ihr ins Environment gepackt.

              Tut mir leid, ich kenne keinen anderen Begriff dafür. Den kenne ich schon seit DOS. Da war das Environment anfänglich im PSP (Program Segment Prefix) und hatte demnach nur 256Byte (100h) abzüglich des eigenen Pfades etc blieben dann 126 Byte netto übrig. Das wurde ganz schnell zu eng und es wurde ausgelagert.

              Bei anständigen Betriebssystemen wurde schon immer nur ein Zeiger im PSP  auf den (externen) Environmentblock übergeben (das gibts sogar bei Unix).

              Hat aber dann tatsächlich nix mehr mit HTML zu tun - da gebe ich Dir Recht. Aber manchmal muss man eben nach den Ursachen forschen, wenn nach den Wirkungen gefragt wird.

              Liebe Grüße

              Tom

              1. Hallo!
                Die Grenze liegt IMHO eh bei der Übertragungsrate, bzw. dem Timeout! Oder ist das egal wenn ich mit einem 56k Modem einen 10MB großen POST-Header verschicke? Macht das der "normale" Apache mit, oder gibts kein Timeout?
                Grüße
                Andreas

                1. Hallo!
                  Die Grenze liegt IMHO eh bei der Übertragungsrate, bzw. dem Timeout! Oder ist das egal wenn ich mit einem 56k Modem einen 10MB großen POST-Header verschicke? Macht das der "normale" Apache mit, oder gibts kein Timeout?
                  Grüße
                  Andreas

                  Hallo Andreas,

                  das müsste man direkt mal ausprobieren. Es gibt da ja den Timeout des Scriptes (PHP, Perl) an das man den Request bzw. Upload schickt UND den Timeout des Apachen.

                  Bisher habe ich immer angenommen, dass die sich auf die "kommunikationslose Zeit" beziehen, also wenn über den angesprochenen bzw. zur Antwort benutzen Port keine Daten fließen, dann fängt der Timeout an zu laufen. Solange Daten fließen, wird der Timeout immer wieder auf Maximum zurückgesetzt. Bei Gelegenheit probier ich das mal aus. Wie könnte man die Versuchsbedingungen denn einigermaßen realistisch gestalten?

                  Formular aufbauen. Textarea reinsetzen. über die Zwischenablage eine Datei hineinkopiern oder mit JavaScript über Buttons eine bestimmte Anzahl Zeichen erzeugen. Das Ganze abschischicken über ein Modem mit 14.400 Baud und schauen, was passiert.

                  Ist das ungefähr richtig so?

                  Grüße

                  Tom

                  1. Hi!

                    Ich habe die ergfahrung mal mit phpmyadmin gemacht, und zwar kann man da ja Dumps über eine textarea in die DB einfügen, das geht auch gut, aber einmal wollte ich einen 4MB großen Dump so einfügen, Dump stand in txt-Datei, Inhalt habe ich in die Zwischenablage kopiert, dann in die Textarea und Abschicken, nach kurzer Zeit passeirt einfach nichst mehr. Hab das nicht wieter verfolgt, wäre mal interessant woran das jetzt genau gelegen hat, denn es wird ja im prinzip kein Scipt ausgeführt, erst wenn die Daten da sind, aber schon nach kurzer Zeit ist der Datenstrom zum Server abgerissen.
                    Kannst ja mal probieren ;-)

                    Grüße
                    Andreas

                  2. Hi,

                    Bisher habe ich immer angenommen, dass die sich auf
                    die "kommunikationslose Zeit" beziehen, also wenn
                    über den angesprochenen bzw. zur Antwort benutzen
                    Port keine Daten fließen, dann fängt der Timeout an
                    zu laufen.

                    http://httpd.apache.org/docs/mod/core.html#timeout

                    Und wenn es anders wäre, wie würde dann ein Download (!)
                    großer Archivdateien funktionieren?

                    Viele Grüße
                    <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

                    1. Hi!

                      http://httpd.apache.org/docs/mod/core.html#timeout

                      Und wenn es anders wäre, wie würde dann ein Download (!)
                      großer Archivdateien funktionieren?

                      Hm, aber wieseo funktioniert das nicht mit 3 MB in einer Textarea? Nach nichmal ner halben Minute hört der Datenstrom einfach auf!
                      Grüße
                      Andreas

                      1. Hi auch,

                        Hm, aber wieseo funktioniert das nicht mit 3 MB in
                        einer Textarea?

                        Das ist ja nun wieder etwas Anderes.

                        Einen Upload kann ein HTTP-Client blockweise einlesen
                        und durch die Leitung jagen.

                        Eine Textarea wird der Browser wahrscheinlich auf ein-
                        mal im Hauptspeicher halten müssen, um den Inhalt umzu-
                        brechen und was auch noch alles.
                        Bei Netscape 4 sind Textareas auf 32 KB (!) begrenzt,
                        wenn ich das richtig in Erinnerung habe.

                        Viele Grüße
                        <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

                        1. Hallo Michael!

                          Eine Textarea wird der Browser wahrscheinlich auf ein-
                          mal im Hauptspeicher halten müssen, um den Inhalt umzu-
                          brechen und was auch noch alles.
                          Bei Netscape 4 sind Textareas auf 32 KB (!) begrenzt,
                          wenn ich das richtig in Erinnerung habe.

                          Aha, dann liegts wohl am Client ;-)

                          Das hieße aber doch, wenn ich den POST-Header "selbst schreibe", also z.B. mit einer Socketverbindung in PHP, müßte ich auch diese Größe an PHPmyAdmin schicken können, oder? Leider ist das htaccess geschützt, daher nicht möglich, aber ich könnte sowas ja mal selbst probieren. Weißt Du, wie man den Wert einer Textarea-Variable "bearbeiten" muß? Ich hatte was vergleichbares gemacht, aber nur kurze Strings übergeben(je 1 Wort), wenn ich aber jetzt wie bei einem MySQL Dump so ziemlich alles an Zeichen da drin habe, geht das wohl kaum gut. Was muß ich da beachten, bzw. kennst Du vielleicht eine PHP-Funktion, die sowas wie für HTML automatisch macht?

                          Viele Grüße
                          Andreas

                          1. Hi Andreas,

                            Weißt Du, wie man den Wert einer Textarea-Variable
                            "bearbeiten" muß?

                            HTTP kennt keine "Textareas" - nur Parameter und deren
                            Werte.

                            Wie das in HTML aussah und was es dort bedeutete,
                            ist für die Übertragung irrelevant.

                            wenn ich aber jetzt wie bei einem MySQL Dump so
                            ziemlich alles an Zeichen da drin habe, geht das
                            wohl kaum gut.

                            Bei POST ist das egal - sonst könntest Du damit ja
                            keinen Datei-Upload machen.
                            In GET müßtest Du Sonderzeichen URL-encoden.

                            Viele Grüße
                            <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

                            1. Hallo!

                              HTTP kennt keine "Textareas" - nur Parameter und deren
                              Werte.

                              Ja klar, ich meinte halt den POST Request Simulieren.

                              Bei POST ist das egal - sonst könntest Du damit ja
                              keinen Datei-Upload machen.
                              In GET müßtest Du Sonderzeichen URL-encoden.

                              Ja, aber ein POST Request sieht ja z.B. so aus:

                              fputs ($fp, "
                                       POST /script.php HTTP/1.0\r\n
                                       Host: www.server.de\r\n
                                       Content-type: application/x-www-form-urlencoded\r\n
                                       Content-length: 13\r\n\r\          Variable=Wert\r\n\r\n
                                      ");

                              Wenn ich jetzt im Wert einfach munter "="... verwende, wie kann dann der Server wissen, was ob das eine neue Variable ist, oder zum Wert der vorherigen Variable gehört?

                              Viele Grüße
                              Andreas

                              1. Moin!

                                fputs ($fp, "
                                         POST /script.php HTTP/1.0\r\n
                                         Host: www.server.de\r\n
                                         Content-type: application/x-www-form-urlencoded\r\n
                                         Content-length: 13\r\n\r\          Variable=Wert\r\n\r\n
                                        ");

                                Wenn ich jetzt im Wert einfach munter "="... verwende, wie kann dann der Server wissen, was ob das eine neue Variable ist, oder zum Wert der vorherigen Variable gehört?

                                Wenn Du dem Server sagst, dass Deine Daten application/x-www-form-urlencoded sind, dann wird er Dir das unbesehen glauben. In dieser Codierung trennt ein = immer den Parameternamen vom Parameterwert. Willst Du ein literales = uebergeben, musst Du das genau so codieren, wie Du behauptet hast, es zu tun, naemlich application/x-www-form-urlencoded. Und da wird ein = immer mit %3D codiert.

                                So long

                                --
                                Invest in America - Buy a Congressman!
                                    -- a slogan from http://www.evolvefish.com/

                                1. Hallo!

                                  Wenn Du dem Server sagst, dass Deine Daten application/x-www-form-urlencoded sind, dann wird er Dir das unbesehen glauben. In dieser Codierung trennt ein = immer den Parameternamen vom Parameterwert. Willst Du ein literales = uebergeben, musst Du das genau so codieren, wie Du behauptet hast, es zu tun, naemlich application/x-www-form-urlencoded. Und da wird ein = immer mit %3D codiert.

                                  Sorry, ich bin leider kein Programmierer und bin immer froh wenn überhaupt sowas klappt, das heißt noch lange nicht das ich alles verstehe, was ich da mache, leider!

                                  Also wenn ich das jetzt richtig verstehe muß ich lediglich jeden Wert url-codieren(wie für GET?, oder?), also in PHP z.B. mit $variable=urlencode($variable, oder?

                                  Oder ist das kein gute Möglichkeit? Was sollte man sonst für einen Header nehmen, um z.B. einen größeren MySQL Dump zu übertragen?

                                  Und nochwas, wenn ich application/x-www-form-urlencoded verwende, wie kann ich dann die verschiedenen Variablen voneinander Trennen? durch \n? oder ;?

                                  Viele Grüße
                                  Andreas

                                  1. Hallo,

                                    Also wenn ich das jetzt richtig verstehe muß ich lediglich jeden Wert
                                    url-codieren(wie für GET?, oder?)

                                    Wenn du den Content-Type 'application/x-www-form-urlencoded' nimmst, ja.

                                    »», also in PHP z.B. mit $variable=urlencode($variable, oder?

                                    Oder ist das kein gute Möglichkeit? Was sollte man sonst für einen Header
                                    nehmen, um z.B. einen größeren MySQL Dump zu übertragen?

                                    Du koenntest den Content-Type 'multipart/form-data' benutzen. Die entsprechende
                                    Definition gibt es hier:

                                    ftp://ftp.isi.edu/in-notes/rfc2388.txt

                                    Und nochwas, wenn ich application/x-www-form-urlencoded verwende, wie kann ich
                                    dann die verschiedenen Variablen voneinander Trennen? durch \n? oder ;?

                                    Durch ';' oder '&'. Wie bei GET.

                                    Gruesse,
                                     CK

                                    1. Hallo!
                                      Danke Dir/Euch! Wieder was dazu gelernt!
                                      Werde das bestimmt in Kürze einsetzen können - Danke nochmal!
                                      Viele Grüße
                                      Andreas

                  3. Hallo,

                    Die Grenze liegt IMHO eh bei der Übertragungsrate, bzw. dem Timeout! Oder ist das egal wenn ich mit einem 56k Modem einen 10MB großen POST-Header verschicke? Macht das der "normale" Apache mit, oder gibts kein Timeout?
                    das müsste man direkt mal ausprobieren. Es gibt da ja den Timeout des Scriptes (PHP, Perl) an das man den Request bzw. Upload schickt UND den Timeout des Apachen.

                    Meiner Erfahrung nach funktioniert das mit dem Server und größeren 'POSTs'. Ich habe für einen Applikationstest einmal ca 8MByte 'gePOSTed' und wieder zurück übertragen,  und das von einem Nokia 9210 aus (9600 bps). Das dauert zwar eine kleine Ewigkeit, aber Abbrüche hat es keine gegeben. (Dabei bin ich eigentlich davon ausgegangen, daß das serverseitig keinen Strreß macht, sondern maximal Clientseitig, da ich den Client programmiert habe *g*)

                    Grüße
                      Klaus

              2. Hallo Tom,

                Da das Topic allerdings (HTTP) hieß und nicht (PHP) ...

                macht nix, kein Problem für mich. Du kannst natürlich Dein POST auch an jede
                xbeliebige HTML-Datei auf dem Server richten. Das wird ihr (beim Apachen)
                sogar zugestellt. Und damit die Datei es empfangen kann, wird es ihr ins
                Environment gepackt.

                Nein :) POST ist nicht GET.
                Bei POST wird ein Stream nach Stdin geleitet. Bei GET werden die Daten 'ins
                Environment gepackt', wie du so schoen sagst.

                Gruesse,
                 CK

  2. Moin!

    hat jemand eine ahnung, wie groß so ein
    http POST werden darf (z.B. Angabe in KB
    oder in Zeichen).

    Was noch nicht erwaehnt wurde, sind die Konfigurationsmoeglichkeiten des Apachen: http://httpd.apache.org/docs/mod/core.html#limitrequestbody.

    So long

    --
    Invest in America - Buy a Congressman!
        -- a slogan from http://www.evolvefish.com/