develooper Front page | perl.vmsperl | Postings from January 2002

RE: LWP/HTTP Content-Length Calculation Error

Thread Previous | Thread Next
From:
Kokosa, Chris
Date:
January 15, 2002 00:02
Subject:
RE: LWP/HTTP Content-Length Calculation Error
Message ID:
8CE5617ED444D411BDF800508BDF0BEE09733C26@usahm015.exmi01.exch.eds.com
Setting the file attributes to stream did the trick!

BEFORE (wrong content-length calculated):
   Record format:      Fixed length 512 byte records

AFTER (correct content-length): 
   Record format:      Stream_LF, maximum 512 bytes, longest 512 bytes  
                   
Installing version 5.63 of libwww didn't seem to make a difference, but I
did have some errors when performing the 'make test'.

Thanks for the help.                     

> -----Original Message-----
> From: Craig A. Berry [mailto:craigberry@mac.com]
> Sent: Tuesday, January 15, 2002 12:51 AM
> To: Kokosa, Chris
> Cc: 'vmsperl@perl.org'
> Subject: Re: LWP/HTTP Content-Length Calculation Error
> 
> 
> At 10:54 PM -0500 1/14/02, Kokosa, Chris wrote:
> > When I run the script on Win32 it
> >runs fine.  When I run the app on VMS the web server replies 
> with a "500
> >length of data sent did not match calculated Content-Length 
> header..."
> >
> >Is the content-length calculation wrong or is it a 
> difference between OSs?
> 
> This could be a variant of the "what is the VMS file size *really*"
> question that apparently caused Linus himself to make a derogatory
> remark about VMS.  This has been discussed many times on comp.os.vms
> and might even be in the OpenVMS FAQ, but I'll try to summarize from
> a Perl perspective.
> 
> A quick look suggests that the request() method uses the st_size
> field of the stat buffer to set up content length.  Perl's stat() is
> based closely on what the C library gives us, and the docs to this
> routine say, "If the file is a record file, the st_size field
> includes carriage-control information. Consequently, the st_size
> value will not correspond to the number of characters that can be
> read from the file. "
> 
> In other words, the size of the file depends on what kind of file it
> is.  Do DIRECTORY/FULL on the file in question and look at the record
> format field; if it doesn't begin with "Stream"  then you've probably
> got a record file in which formatting information occupies space on
> disk but does not count in what goes on the wire when you read and
> transmit the data in the file.
> 
> Try (assuming your file is named foo.dat):
> 
> $ set file foo.dat/attributes=rfm:stmlf
> 
> and see if the upload works.
> 
> We should probably fix up LWP, specifically (I think)
> lib/LWP/Protocol/file.pm, so that record files get their data counted
> properly.  In the meantime, does LWP give you any way to explicitly
> specify the content-length yourself?  If so, you could slurp the
> whole file into a variable and just do a length() on it if it's a
> small file, and if it's not small do a length() on each record and
> keep a total.
> 
> BTW, you might well have the same problem in C (or DCL for that
> matter) as in Perl.
> 
> 
> -- 
> ____________________________________________
> Craig A. Berry                  
> mailto:craigberry@mac.com
> 
> "Literary critics usually know what they're
> talking about. Even if they're wrong."
> 	-- Perl creator Larry Wall
> 

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About