Length of a File on the Internet
-
Originally published in NL 136
Length of a File on the Internet |
Notes from Brent |
Modifications |
Demo
Notes from Brent
Brent says to consider the following if you are using this code to implement a file updater.
I want to point out that using the last modified date of a file would be a better indicator of a file's freshness than its size. The size may not change between updates, especially if an update involves correcting typos in text (the "teh" for "the" variety) or changing BMP files.
But comparing the date returned by the server to the local date and time doesn't always ensure problem-free updating because there is no guarantee that the local date and time are accurate. And there's no guarantee that the server is accurate, for that matter. It would be most appropriate to compare server time to server time between updates, thus requiring the storing of the most recently retrieved file date. But if it is the first update check, the only option is to use the local time for comparison.
Modifications
Here are the modifications to my demo to query the file date, instead of its length:
---[ FIND ]---
5 As ULong, _ 'HTTP_QUERY_CONTENT_LENGTH
---[ REPLACE WITH ]---
11 As ULong, _ 'HTTP_QUERY_LAST_MODIFIED
---[ FIND ]---
Print Buffer$; " Bytes"
---[ REPLACE WITH ]---
Print Buffer$
Demo
Text here.
'Retrieving HTTP Content-length Demo
'By Brent D. Thorn, 8/2005
remoteFile$ = "http://babek.info/libertybasicfiles/images/lbfor2.gif"
BUFFER.SIZE = 32 'size of buffer to hold length string
Open "wininet" For DLL As #inet
'It would be a good idea to test for an Internet
'connection before proceding. This demo assumes
'you have one already.
' Register a new user agent. Use proxy settings
' set up in Internet Options Control Panel.
CallDLL #inet, "InternetOpenA", _
"My User Agent" As Ptr, _
0 As Long, _ 'INTERNET_OPEN_TYPE_PRECONFIG
_NULL As Long, _
_NULL As Long, _
0 As ULong, _
hInet As ULong
If hInet = 0 Then [ErrExit]
' Open a request to a remote file. This does not
' download the file, but simply requests its
' headers, one of which should be "Content-length."
Struct pdw, Context As ULong
CallDLL #inet, "InternetOpenUrlA", _
hInet As ULong, _
remoteFile$ As Ptr, _
_NULL As Long, _
0 As Long, _
0 As ULong, _
pdw As Struct, _
hRequest As ULong
If hRequest = 0 Then [ErrExit]
' Query Content-length from the headers and copy
' the number of bytes to a string buffer. One could
' call this function with an empty buffer and it
' will fill pdw.BufferLength.struct with the required
' buffer size.
Struct pdw, BufferLength As ULong
pdw.BufferLength.struct = BUFFER.SIZE
Buffer$ = Space$(BUFFER.SIZE)+Chr$(0)
Struct pdw2, Index As ULong
pdw2.Index.struct = 0
CallDLL #inet, "HttpQueryInfoA", _
hRequest As ULong, _
5 As ULong, _ 'HTTP_QUERY_CONTENT_LENGTH
Buffer$ As Ptr, _
pdw As Struct, _
pdw2 As Struct, _
ret As Long
If ret = 0 Then [ErrExit]
Buffer$ = Left$(Buffer$, pdw.BufferLength.struct)
Print Buffer$; " Bytes"
[ErrExit]
' If you get an error, find GetLastError on MSDN. There
' you will find a link to a list of error codes.
CallDLL #kernel32, "GetLastError", ret As ULong
If ret Then Print "Error ";ret
' Free the handles we created and exit.
If hRequest Then _
CallDLL #inet, "InternetCloseHandle", _
hRequest As ULong, ret As Long
If hInet Then _
CallDLL #inet, "InternetCloseHandle", _
hInet As ULong, ret As Long
Close #inet
End
Length of a File on the Internet |
Notes from Brent |
Modifications |
Demo