Download file via http

Regan Heath regan at netmail.co.nz
Tue Dec 13 10:10:24 PST 2011


On Tue, 13 Dec 2011 17:58:57 -0000, Kai Meyer <kai at unixlords.com> wrote:

> On 12/13/2011 10:39 AM, Vladimir Panteleev wrote:
>> On Tuesday, 13 December 2011 at 17:29:20 UTC, Kai Meyer wrote:
>>> I get bytes_needed from the Content-Length header. The I get the
>>> correct number of bytes from the Content-Length, bytes_needed gets the
>>> right value, but the resulting file isn't right. The file has the
>>> right number of bytes, but I appear to have an extra '0a' at the very
>>> beginning of the file, but if I do 'ss.getchar()', to get rid of it, I
>>> get an exception that there's not enough data in the stream.
>>
>> In an HTTP request, the headers are separated from the body by an empty
>> line. Headers use CR/LF line endings, so the body is always preceded by
>> a 0D 0A 0D 0A sequence. It looks like your code is not snipping the last
>> 0A.
>>
>> Where did the getchar method come from? There is no mention of it in
>> Phobos. Perhaps you could try the read(out ubyte) method?
>
> http://www.d-programming-language.org/phobos/std_stream.html
>
> Oh, I meant getc(), not getchar(), sorry. It looks like read(out ubyte)  
> worked on windows.
>
> I'm using ss.readLine() to pull headers from the stream. When the string  
> returned from ss.readLine() is empty, then I move on to the stream. I'm  
> going to be using this application on Windows, Linux, and Mac, which is  
> why I chose D. This feels like I've just entered the newline/carriage  
> return nightmare. Should I not be using readLine()? Or is there some  
> generic code that will always work and stick me at the beginning of the  
> file?

I would have expected what you're doing to work.

IIRC when you make a GET request you send HTTP/1.0 or HTTP/1.1 or similar  
in the GET request line, right? (my memory of the syntax is a bit fuzzy).

Warning, wacky idea with little/no backing knowledge..  IIRC using  
HTTP/1.1 introduced additional data into the response, lengths or  
checksums, or something - I never did get to the bottom of it.  But, if  
you change to using HTTP/1.0 they go away.  I wonder if the 0A is related  
to that.  As a simple test you could try HTTP/1.0 in your request and look  
at the response content-length, it might just be 1 byte shorter as a  
result.

Regan

-- 
Using Opera's revolutionary email client: http://www.opera.com/mail/


More information about the Digitalmars-d-learn mailing list