program testpart; (* Test partial downloads - not all servers support this! *) {$INCLUDE curltest.inc} uses curlobj; var MyCurl: tCurl; SizeTotal, RangeOffset:LongInt; RangeStr:string; procedure FailTest(msg:string); // This is ugly, but it avoids some nested "IF" statements... begin MyCurl.Free; WriteLn(msg); HALT(1); end; begin { MAIN } MyCurl:=tCurl.Create(nil); with MyCurl do begin // Use your own URL if you like... if ( ParamCount > 0 ) then URL:=ParamStr(1) else URL:='http://curlpas.sourceforge.net/tests/rand.dat'; FollowLocation:=True; OutputFile:='testpart.tmp'; // Verbose:=True; NoBody:=True; // Get only response headers for now HeaderFile:={$IFDEF WIN32}'NUL'{$ELSE}'/dev/null'{$ENDIF}; // Hide the console output WriteLn('Connecting to "', URL, '"'); // Try to get a total size for the file... if ( not Perform ) then FailTest(ErrorString); SizeTotal:=ContentLengthDownload; // Of course, we need a file that is bigger than one byte! if ( SizeTotal < 2 ) then FailTest('Invalid byte range.'); WriteLn('Stated content length is: ', SizeTotal); // Set the range to get the first half of the file... RangeOffset:=SizeTotal div 2; str(RangeOffset, RangeStr); Range:='0-'+RangeStr; // Range is zero-based // Ask the server if it supports byte ranges... WriteLn('Requesting partial content ...'); if ( not Perform ) then FailTest(ErrorString); WriteLn('HTTP response code is: ', HttpCode); if not ( HttpCode in [200, 206] ) then FailTest('Wrong answer, expected 206 or 200'); WriteLn('(OK)'); // Now we are ready for some real content... NoBody:=False; HttpGet:=True; // Get the first part... WriteLn('Retreiving first half...'); if ( not Perform ) then FailTest(ErrorString); inc(RangeOffset); // Bump to the next byte // Check the result... WriteLn('Requested ', RangeOffset , ' bytes, got ' , GetFileSize(OutputFile), ' bytes.'); if ( RangeOffset <> GetFileSize(OutputFile) ) then FailTest('Size mismatch.'); WriteLn('(OK)'); // Get the second part... WriteLn('Retreiving second half...'); ResumeFrom:=RangeOffset; // Tells LibCurl to append to the local file if ( not Perform ) then FailTest(ErrorString); // Show me what I got... WriteLn('Stated content length was: ', SizeTotal); WriteLn('Actual disk file size is: ', GetFileSize(OutputFile)); if ( SizeTotal <> GetFileSize(OutputFile) ) then FailTest('Something went wrong!'); WriteLn('(Passed)'); end; MyCurl.Free; // Clean-up end.