[rygel] server: Change content transfer mode handling



commit 328f916c22f143007548c784b4d1e651bb488f15
Author: Jens Georg <mail jensge org>
Date:   Sun Feb 8 19:13:11 2015 +0100

    server: Change content transfer mode handling
    
    Align with newer DLNA versions
    
    Based on Cableslabs's CVP-2 code
    
    Signed-off-by: Jens Georg <mail jensge org>

 src/librygel-server/rygel-http-get-handler.vala    |    6 -----
 src/librygel-server/rygel-http-get.vala            |   24 ++++++++++++++++---
 .../rygel-http-identity-handler.vala               |    7 -----
 3 files changed, 20 insertions(+), 17 deletions(-)
---
diff --git a/src/librygel-server/rygel-http-get-handler.vala b/src/librygel-server/rygel-http-get-handler.vala
index c61b346..180058e 100644
--- a/src/librygel-server/rygel-http-get-handler.vala
+++ b/src/librygel-server/rygel-http-get-handler.vala
@@ -76,8 +76,6 @@ internal abstract class Rygel.HTTPGetHandler: GLib.Object {
         if (request.hack != null) {
             request.hack.modify_headers (request);
         }
-
-        request.msg.response_headers.append ("Connection", "close");
     }
 
     /**
@@ -98,10 +96,6 @@ internal abstract class Rygel.HTTPGetHandler: GLib.Object {
      */
     public abstract int64 get_resource_size ();
 
-    public virtual bool knows_size (HTTPGet request) {
-        return this.get_resource_size () >= 0;
-    }
-
     // Create an HTTPResponse object that will render the body.
     public abstract HTTPResponse render_body (HTTPGet request)
                                               throws HTTPRequestError;
diff --git a/src/librygel-server/rygel-http-get.vala b/src/librygel-server/rygel-http-get.vala
index 34dc199..dbde59c 100644
--- a/src/librygel-server/rygel-http-get.vala
+++ b/src/librygel-server/rygel-http-get.vala
@@ -190,6 +190,7 @@ internal class Rygel.HTTPGet : HTTPRequest {
         // Add headers
         this.handler.add_response_headers (this);
 
+        // Determine the size value
         int64 response_size;
         {
             // Response size might have already been set by one of the response elements
@@ -219,10 +220,25 @@ internal class Rygel.HTTPGet : HTTPRequest {
             this.msg.set_status (Soup.Status.OK);
         }
 
-        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);
+        // Determine the transfer mode encoding
+        {
+            Soup.Encoding response_body_encoding;
+            // See DLNA 7.5.4.3.2.15 for requirements
+            if (response_size > 0) {
+                // TODO: Incorporate ChunkEncodingMode.dlna.org request into this block
+                response_body_encoding = Soup.Encoding.CONTENT_LENGTH;
+                debug ("Response encoding set to CONTENT-LENGTH");
+            } else { // Response size is <= 0
+                if (this.msg.get_http_version () == Soup HTTPVersion  1_0) {
+                    // Can't send the length and can't send chunked (in HTTP 1.0)...
+                    response_body_encoding = Soup.Encoding.EOF;
+                    debug ("Response encoding set to EOF");
+                } else {
+                    response_body_encoding = Soup.Encoding.CHUNKED;
+                    debug ("Response encoding set to CHUNKED");
+                }
+            }
+            this.msg.response_headers.set_encoding (response_body_encoding);
         }
 
         if (msg.get_http_version () == Soup HTTPVersion  1_0) {
diff --git a/src/librygel-server/rygel-http-identity-handler.vala 
b/src/librygel-server/rygel-http-identity-handler.vala
index 8563c28..0e3dcd9 100644
--- a/src/librygel-server/rygel-http-identity-handler.vala
+++ b/src/librygel-server/rygel-http-identity-handler.vala
@@ -70,13 +70,6 @@ internal class Rygel.HTTPIdentityHandler : Rygel.HTTPGetHandler {
         return -1;
     }
 
-    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
                                         (DIDLLiteObject didl_object,
                                          HTTPGet      request)


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