RE: HTTP Partial Download Query

Dear Alex,

My requirement is pretty simple.

I have to write an AUTHENTICATION-AUTHERISATION module for DIGITAL CONTENT
(image,documents,mp3 etc)download request coming to a Web-Server.
This module will be in the form of a FILTER(IIS) or MODULE(Apache).
It will authenticate the request and for valid users will allow 
to download the DIGITAL CONTENT.
One of the requirement for this is that the Client can even be any device
(PDA,cell phones etc) where the BROWSER is capable of accepting only few BYTES at a time.
Considering that the BROWSER and WEBSERVER both are capable of understanding 
HTTP1.1 and BROWSER can accept only 100KB at a time,I have following query

1)Is it the responsibility of the BROWSER to make multiple GET request
to download a large DIGITAL CONTENT(say 100KB in every request) with
specifying Range parameter every time.

OR
2)Is it the responsibility of the Web-Server/Server-Side program to 
split the DIGITAL CONTENT in chunk of say 100KB and send the whole
DIGITAL CONTENT in ONE RESPONSE with many MULTUPARTS seperated by seperator.
Each PART is of say 100KB . 

Please correct me if I am wrong in my understanding.
Answers with reference to SECTIONS in RFC 2616 will be of enormous help.

Thanks for your time.

With Regards,
Yog





-----Original Message-----
From: Alex Rousskov [mailto:rousskov@measurement-factory.com]
Sent: Monday, December 09, 2002 10:45 PM
To: Yogesh Bang
Cc: ietf-http-wg@w3.org
Subject: Re: HTTP Partial Download Query


On Mon, 9 Dec 2002, Yogesh Bang wrote:

> 1) With your replies it seems that its the responsibility of the
> BROWSER to make the MULTIPLE GET request to get a LARGE OBJECT(lets
> say MOBILE RING TONES)  by using the RANGE header of HTTP request
> and the server merely send those requested BYTES.

Allow me to outline client-side and server-side options to clarify the
picture:

	Client option 1: send a simple GET request for the entire
	object and rely on transport mechanism (e.g., TCP buffer
	sizes) to limit sizes of incoming response chunks. This
	is probably "The Right Way" to do it as previous replies on
	this thread indicated.

	Client option 2: send a sequence of Range GET requests,
	each for a single subrange of the response small enough to
	satisfy your buffering requirements. This option relies on the
	server (and all HTTP intermediaries on the path!) supporting
	Range requests and not sending a complete response regardless
	of the Range header. Thus, using this option does not really
	make any practical sense unless you control the server and
	all HTTP intermediaries on the path.

	Client option 3: send a single Range GET request with several
	subranges, each small enough to satisfy your buffering
	requirements. Rely on transport mechanism to limit sizes of
	incoming response chunks. Note that the client may or may not
	receive multipart/byteranges response, depending on whether
	the server can handle Range requests and whether the server
	will merge overlapping subranges and realize that they are
	equivalent to the whole object. Thus, using this option does
	not really make any practical sense unless you control the
	server and all HTTP intermediaries on the path.


	Server option 1: ignore Range header and send complete
	response.

	Server option 2: honor Range request and send just the
	requested range(s). Use multipart/byteranges if there
	is more than one range requested.

	Server option 3: honor Range request and merge requested
	ranges if possible. If the result is an entire object,
	send a normal response as if the Range header was ignored.

If you look at all the options above, you will realize that you cannot
rely on Range requests to limit transfer chunks _unless_ you control
the server and all intermediaries.

> In such case how one can track if the download is complete or not?

The client would know if it received the whole object because a
partial response contains the content length of the complete response.
The server cannot reliably aggregate individual request sizes for
reporting unless server authentication is used and request threads for
the same URL do not overlap. If server authentication is used, one can
aggregate sizes of individual ranged responses on a per-user per-URL
basis.

> How to track that the request is coming from same authenticated
> user?

Each request should have authentication information attached, of
course.

> 2)If you refer to section 19.2 of RFC 2616, it depicts a scenario of
> HTTP Partial download. In this scenario the requested object is send
> as MULTIPART/BYTERANGES type seperated by a seperator. It seems it
> is a SINGLE response send as MULTIPART with each part cut into small
> chunks (which can be accepted by browser.).

Yes, in general, you get a single response for a single request
(regardless of Range header presence or value). If you want multiple
responses, you have to send multiple requests (probably with different
Range headers).

> If this is the way HTTP PARTIAL DOWNLOAD works then to implement
> this functionality what care a Web-Programmer needs to take ? Does
> he need to write a seperate DOWNLOAD program which will cut the
> requested object into chunks ,put the seperators and send it to
> browser as single response?

That would be one option. It is difficult to give a specific design
advice without knowing a lot more about your environment. Please note
that most decent HTTP servers (e.g., Apache) support Range requests
for static objects. Please also note that an HTTP intermediary can
change a Range request into a simple GET.

Overall, just based on the information you gave us so far, it seems
that using Ranges is the wrong mechanism to limit response chunks in a
general Web environment. I would expect the transport mechanism (e.g.
TCP) in the browser to handle browser buffering limitations.

Thanks,

Alex.

-- 
                            | HTTP performance - Web Polygraph benchmark
www.measurement-factory.com | HTTP compliance+ - Co-Advisor test suite
                            | all of the above - PolyBox appliance

Received on Tuesday, 10 December 2002 04:48:33 UTC