[rygel] server: Really fix Content-Length header



commit db698a051fcc7b077dea73248618594e3cc81371
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 a63768b..00a6a2a 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 a3e13d7..e9435f4 100644
--- a/src/librygel-server/rygel-http-identity-handler.vala
+++ b/src/librygel-server/rygel-http-identity-handler.vala
@@ -48,9 +48,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);
             }
         }
 
@@ -67,6 +68,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 {
@@ -98,4 +106,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 b8ebe54..3c93ceb 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]