[rygel/rygel-0-16] server: Really fix Content-Length header



commit dd3c2d4015d5a8374fd684f33f5a5acfc18b4733
Author: Jens Georg <jensg openismus com>
Date:   Tue Nov 13 15:06:17 2012 +0100

    server: Really fix Content-Length header
    
    6f5a29 used the wrong length for thumbnails and subtitles as well as setting
    the wrong soup mode for resources whose size is not known, effectively
    breaking proxying of non-local resources.

 src/librygel-server/rygel-http-get-handler.vala    |    5 ++++
 src/librygel-server/rygel-http-get.vala            |    2 +-
 .../rygel-http-identity-handler.vala               |   26 +++++++++++++++++--
 tests/rygel-http-get-test.vala                     |    2 +
 4 files changed, 31 insertions(+), 4 deletions(-)
---
diff --git a/src/librygel-server/rygel-http-get-handler.vala b/src/librygel-server/rygel-http-get-handler.vala
index 243fa7c..5563d2e 100644
--- a/src/librygel-server/rygel-http-get-handler.vala
+++ b/src/librygel-server/rygel-http-get-handler.vala
@@ -78,6 +78,10 @@ internal abstract class Rygel.HTTPGetHandler: GLib.Object {
         request.msg.response_headers.append ("Connection", "close");
     }
 
+    public virtual bool knows_size (HTTPGet request) {
+        return false;
+    }
+
     // Create an HTTPResponse object that will render the body.
     public abstract HTTPResponse render_body (HTTPGet request)
                                               throws HTTPRequestError;
@@ -85,4 +89,5 @@ internal abstract class Rygel.HTTPGetHandler: GLib.Object {
     protected abstract DIDLLiteResource add_resource (DIDLLiteItem didl_item,
                                                       HTTPGet      request)
                                                       throws Error;
+
 }
diff --git a/src/librygel-server/rygel-http-get.vala b/src/librygel-server/rygel-http-get.vala
index 8b4b2b1..d02d902 100644
--- a/src/librygel-server/rygel-http-get.vala
+++ b/src/librygel-server/rygel-http-get.vala
@@ -164,7 +164,7 @@ internal class Rygel.HTTPGet : HTTPRequest {
             this.msg.set_status (Soup.KnownStatusCode.OK);
         }
 
-        if (this.handler is HTTPIdentityHandler) {
+        if (this.handler.knows_size (this)) {
             this.msg.response_headers.set_encoding (Soup.Encoding.CONTENT_LENGTH);
         } else {
             this.msg.response_headers.set_encoding (Soup.Encoding.EOF);
diff --git a/src/librygel-server/rygel-http-identity-handler.vala b/src/librygel-server/rygel-http-identity-handler.vala
index 3b4c10f..bcc9d4e 100644
--- a/src/librygel-server/rygel-http-identity-handler.vala
+++ b/src/librygel-server/rygel-http-identity-handler.vala
@@ -47,9 +47,10 @@ internal class Rygel.HTTPIdentityHandler : Rygel.HTTPGetHandler {
         if (request.seek != null) {
             request.seek.add_response_headers ();
         } else {
-            if (request.item.size > 0) {
-                request.msg.response_headers.set_content_length
-                                        (request.item.size);
+            var size = this.get_size (request);
+
+            if (size > 0) {
+                request.msg.response_headers.set_content_length (size);
             }
         }
 
@@ -66,6 +67,13 @@ internal class Rygel.HTTPIdentityHandler : Rygel.HTTPGetHandler {
         }
     }
 
+    public override bool knows_size (HTTPGet request) {
+        var size = this.get_size (request);
+
+        return (request.seek != null && request.seek is HTTPByteSeek) ||
+                    size > 0;
+    }
+
     protected override DIDLLiteResource add_resource (DIDLLiteItem didl_item,
                                                       HTTPGet      request)
                                                       throws Error {
@@ -100,4 +108,16 @@ internal class Rygel.HTTPIdentityHandler : Rygel.HTTPGetHandler {
 
         return new HTTPResponse (request, this, src);
     }
+
+    private int64 get_size (HTTPGet request) {
+        if (request.subtitle != null) {
+            return request.subtitle.size;
+        }
+
+        if (request.thumbnail != null) {
+            return request.thumbnail.size;
+        }
+
+        return request.item.size;
+    }
 }
diff --git a/tests/rygel-http-get-test.vala b/tests/rygel-http-get-test.vala
index cd96d89..d223828 100644
--- a/tests/rygel-http-get-test.vala
+++ b/tests/rygel-http-get-test.vala
@@ -360,6 +360,8 @@ internal abstract class Rygel.HTTPGetHandler {
     }
 
     public void add_response_headers (HTTPGet get_request) {}
+
+    public bool knows_size (HTTPGet request) { return false; }
 }
 
 internal class Rygel.HTTPTranscodeHandler : Rygel.HTTPGetHandler {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]