Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Partial Content und content-encoding: gzip

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Partial Content und content-encoding: gzip

    Hi,
    ich habe Probleme, per PHP-Script eine HTTP-Partial-Content-Antwort richtig zu senden. Wenn ich folgende Anfragen per curl auf der shell mache, scheint alles richtig zu sein:

    Code:
    christoph@guido:~$ curl --dump-header - http://192.168.3.165/test/download/
    HTTP/1.1 200 OK
    Date: Wed, 16 Jun 2010 15:50:02 GMT
    Server: Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4.6 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
    X-Powered-By: PHP/5.2.6-2ubuntu4.6
    Set-Cookie: PHPSESSID=fe803a108abd291ac72cc7d0be3bb709; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-cache, must-revalidate
    Pragma: protected
    Set-Cookie: PHPSESSID=31225b03420b6534669bf38b9b09fb44; path=/
    Content-Disposition: attachment; filename=test.php
    Accept-Ranges: bytes
    Content-Length: 270
    ETag: 16af3235fac954f8d63ed446e478ee1e
    Content-Type: application/x-php; charset=utf-8
    
    <?php
    
    class PageController extends GlobalController
            {
            public function run()
                    {
                    $file = __FILE__;
                    $handle = fopen($file, 'r');
    
                    $this->view->setHandler('plain');
                    $this->view->setContent($handle);
                    $this->view->setProperty('downloadable', 'test.php');
                    }
            }
    Code:
    christoph@guido:~$ curl -H Range:bytes=7-51 --dump-header - http://192.168.3.165/test/download/
    HTTP/1.1 206 Partial Content
    Date: Wed, 16 Jun 2010 15:50:07 GMT
    Server: Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4.6 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
    X-Powered-By: PHP/5.2.6-2ubuntu4.6
    Set-Cookie: PHPSESSID=1fe4894313fca5971adbad693f826049; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-cache, must-revalidate
    Pragma: protected
    Set-Cookie: PHPSESSID=29ea71fb8dfd4a26b66c28d84bde5a60; path=/
    Content-Disposition: attachment; filename=test.php
    Accept-Ranges: bytes
    Content-Length: 45
    ETag: 16af3235fac954f8d63ed446e478ee1e
    Content-Range: bytes 7-51/270
    Content-Type: application/x-php; charset=utf-8
    
    class PageController extends GlobalController

    Versuche ich jedoch den Firefox und seine Resume-Funktion beim Download zu verwenden, kann ich zwar den Download pausieren, jedoch gibts beim Resume eine Fehlermeldung, dass der Firefox die Datei nicht lesen kann.
    Ist irgendetwas an den Headern, die ich zurücksende, falsch oder fehlt etwas?

    Danke und Grüße,
    Christoph
    http://mcsodbrenner.blogspot.com/
    Serpent PHP Template Engine: http://code.google.com/p/serpent-php-template-engine/


  • #2
    Wie sieht denn die Anfrage aus, die dein Firefox an den Server sendet?
    Ist die mit dem per cURL gemachten Request identisch (in den wesentlichen Punkten)?

    Kommentar


    • #3
      Hab den Fehler gefunden. War etwas hinterhältig. In cURL konnte ich das allerdings nicht sehen, weil die Header völlig ok waren. *doh*

      Hatte die Daten gezippt ausgeliefert. Das Zippen fand statt, bevor die angeforderte Range aus den Daten ausgeschnitten wurde. Ich hab also ein Teil der gezippten Daten ausgeliefert. Anscheinend geht das so aber nicht. Mann muss erst die Daten aus der Ursprungsdatei ausschneiden und dann erst zippen. Also jeden Request einzeln zippen. Dummerweise steht nirgends, wie die Browser das handlen

      Danke und Gruß,
      Christoph
      http://mcsodbrenner.blogspot.com/
      Serpent PHP Template Engine: http://code.google.com/p/serpent-php-template-engine/

      Kommentar


      • #4
        OK, die letzte Lösung funktioniert doch nicht. Ich würde jetzt so gern wissen, wie die richtige Lösung rein theoretisch aussehen müsste, um Partial Content in Verbindung mit Content-Encoding zu senden (ohne Content-Encoding gehts jetzt einwandfrei). Hab jetzt drei Lösungsansätze, die irgendwie alle falsch zu sein scheinen:

        1. Die erste Antwort ganz normal mit Content-Encoding: gzip senden. Beim Partial-Content das Content-Encoding weglassen, weil man ja nur einen Teil des alten GZIP-Contents sendet.
        Ergebnis: Funktioniert nicht. Die resultierende Datei ist nur so groß wie die gezippte Originaldatei. Der erste Teil des Inhalts ist dabei heil und der zweite noch kodiert.

        2. Die erste Antwort ganz normal mit Content-Encoding: gzip senden. Beim Partial-Content auch Content-Encoding senden.
        Ergebnis: Firefox verabschiedet sich mit einem Download-Fehler.

        3. Jedes Ergebnis einzeln gzip kodieren. Da der Browser aber anscheinend nach der Byte-Range des gezippten Inhalts fragt, kann das natürlich nicht sein.

        Hilfe,
        Christoph
        http://mcsodbrenner.blogspot.com/
        Serpent PHP Template Engine: http://code.google.com/p/serpent-php-template-engine/

        Kommentar


        • #5
          Gibts kein RFC dazu?
          "Mein Name ist Lohse, ich kaufe hier ein."

          Kommentar


          • #6
            Doch klar, die RFC 2616. Allerdings werden dort Content-Encoding und Content-Range nicht im Zusammenhang beschrieben, sondern unabhängig voneinander. Leider.

            Finde auch keine Code-Beispiele, die beides gleichzeitig implementieren. Geht das vielleicht gar nicht? Aber auch das müsste ja irgendwo stehen...
            http://mcsodbrenner.blogspot.com/
            Serpent PHP Template Engine: http://code.google.com/p/serpent-php-template-engine/

            Kommentar


            • #7
              So ich geb auf: Hab zwischenzeitlich das hier gefunden, was aussagt, dass die RFC in diesem Bereich ziemlich schlusig ist: Re: Content-Encoding, Content-Range

              Außerdem scheint der Firefox die Kombination nicht zu unterstützen, im Chrome gings auf Anhieb.

              Da sich der Apache selbst um die Content-Ranges von statischen Files kümmert und das der Löwenanteil bei Riesendownloads ist, hab ich das Feature jetzt einfach mal geknickt. Zu wenig Nutzen.

              Danke euch für die Anteilnahme
              Christoph
              http://mcsodbrenner.blogspot.com/
              Serpent PHP Template Engine: http://code.google.com/p/serpent-php-template-engine/

              Kommentar

              Lädt...
              X