diff options
author | Jens Georg <mail@jensge.org> | 2015-02-08 19:13:11 +0100 |
---|---|---|
committer | Jens Georg <mail@jensge.org> | 2015-02-08 19:13:11 +0100 |
commit | 10d236cb811b06724b75780bd5d085f5c1a94d22 (patch) | |
tree | ecac295072ac22c891a1df58eeb7a3544a239f85 | |
parent | b52e129a2d705abc8ce8444638d31529111a3633 (diff) | |
download | rygel-10d236cb811b06724b75780bd5d085f5c1a94d22.tar.gz |
server: Change content transfer mode handlingwip/cablelabs-integration
Align with newer DLNA versions
Based on Cableslabs's CVP-2 code
Signed-off-by: Jens Georg <mail@jensge.org>
-rw-r--r-- | src/librygel-server/rygel-http-get-handler.vala | 6 | ||||
-rw-r--r-- | src/librygel-server/rygel-http-get.vala | 24 | ||||
-rw-r--r-- | src/librygel-server/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 c61b346e..180058ee 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 34dc1997..dbde59cc 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 8563c285..0e3dcd98 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) |