Classic ASP
Classic ASP
HTTP Download in Parallel with Simultaneous Range Requests
See more HTTP Examples
Demonstrates how to download a large file with parallel simultaneous requests, where each request downloads a segment (range) of the remote file.Chilkat Classic ASP Downloads
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<%
success = 0
' This requires the Chilkat API to have been previously unlocked.
' See Global Unlock Sample for sample code.
set http = Server.CreateObject("Chilkat.Http")
' First get the size of the file to be downloaded.
url = "https://www.chilkatsoft.com/hamlet.xml"
set resp = Server.CreateObject("Chilkat.HttpResponse")
success = http.HttpNoBody("HEAD",url,resp)
If (success = 0) Then
Response.Write "<pre>" & Server.HTMLEncode( http.LastErrorText) & "</pre>"
Response.End
End If
remoteFileSize = resp.ContentLength
Response.Write "<pre>" & Server.HTMLEncode( "Downloading " & remoteFileSize & " bytes...") & "</pre>"
' Let's download in 4 chunks.
' (the last chunk will be whatever remains after the 1st 3 equal sized chunks)
chunkSize = remoteFileSize / 4
' The Range header is used to download a range from a resource
' Range: bytes=<range-start>-<range-end>
' or
' Range: bytes=<range-start>-
' We're writing code this way for clarity..
set http1 = Server.CreateObject("Chilkat.Http")
set http2 = Server.CreateObject("Chilkat.Http")
set http3 = Server.CreateObject("Chilkat.Http")
set http4 = Server.CreateObject("Chilkat.Http")
set sbRange = Server.CreateObject("Chilkat.StringBuilder")
success = sbRange.SetString("bytes=<range-start>-<range-end>")
numReplaced = sbRange.ReplaceI("<range-start>",0)
numReplaced = sbRange.ReplaceI("<range-end>",chunkSize - 1)
Response.Write "<pre>" & Server.HTMLEncode( sbRange.GetAsString()) & "</pre>"
http1.SetRequestHeader "Range",sbRange.GetAsString()
success = sbRange.SetString("bytes=<range-start>-<range-end>")
numReplaced = sbRange.ReplaceI("<range-start>",chunkSize)
numReplaced = sbRange.ReplaceI("<range-end>",2 * chunkSize - 1)
Response.Write "<pre>" & Server.HTMLEncode( sbRange.GetAsString()) & "</pre>"
http2.SetRequestHeader "Range",sbRange.GetAsString()
success = sbRange.SetString("bytes=<range-start>-<range-end>")
numReplaced = sbRange.ReplaceI("<range-start>",2 * chunkSize)
numReplaced = sbRange.ReplaceI("<range-end>",3 * chunkSize - 1)
Response.Write "<pre>" & Server.HTMLEncode( sbRange.GetAsString()) & "</pre>"
http3.SetRequestHeader "Range",sbRange.GetAsString()
success = sbRange.SetString("bytes=<range-start>-")
numReplaced = sbRange.ReplaceI("<range-start>",3 * chunkSize)
Response.Write "<pre>" & Server.HTMLEncode( sbRange.GetAsString()) & "</pre>"
http4.SetRequestHeader "Range",sbRange.GetAsString()
' Start each range download
' task1 is a Chilkat.Task
Set task1 = http1.DownloadAsync(url,"qa_output/chunk1.dat")
success = task1.Run()
' task2 is a Chilkat.Task
Set task2 = http2.DownloadAsync(url,"qa_output/chunk2.dat")
success = task2.Run()
' task3 is a Chilkat.Task
Set task3 = http3.DownloadAsync(url,"qa_output/chunk3.dat")
success = task3.Run()
' task4 is a Chilkat.Task
Set task4 = http4.DownloadAsync(url,"qa_output/chunk4.dat")
success = task4.Run()
' Wait for the downloads to complete.
numLive = 4
Do While numLive > 0
numLive = 0
If (task1.Live = 1) Then
numLive = numLive + 1
End If
If (task2.Live = 1) Then
numLive = numLive + 1
End If
If (task3.Live = 1) Then
numLive = numLive + 1
End If
If (task4.Live = 1) Then
numLive = numLive + 1
End If
If (numLive > 0) Then
' SleepMs is a convenience method to cause the caller to sleep for N millisec.
' It does not cause the given task to sleep..
task1.SleepMs 10
End If
Loop
' All should be downloaded now..
' Examine the result of each Download.
numErrors = 0
If (task1.GetResultBool() = 0) Then
Response.Write "<pre>" & Server.HTMLEncode( task1.ResultErrorText) & "</pre>"
numErrors = numErrors + 1
End If
If (task2.GetResultBool() = 0) Then
Response.Write "<pre>" & Server.HTMLEncode( task2.ResultErrorText) & "</pre>"
numErrors = numErrors + 1
End If
If (task3.GetResultBool() = 0) Then
Response.Write "<pre>" & Server.HTMLEncode( task3.ResultErrorText) & "</pre>"
numErrors = numErrors + 1
End If
If (task4.GetResultBool() = 0) Then
Response.Write "<pre>" & Server.HTMLEncode( task4.ResultErrorText) & "</pre>"
numErrors = numErrors + 1
End If
If (numErrors > 0) Then
Response.End
End If
' All downloads were successful.
' Compose the file from the parts.
set fac = Server.CreateObject("Chilkat.FileAccess")
success = fac.ReassembleFile("qa_output","chunk","dat","qa_output/hamlet.xml")
If (success = 0) Then
Response.Write "<pre>" & Server.HTMLEncode( fac.LastErrorText) & "</pre>"
Else
Response.Write "<pre>" & Server.HTMLEncode( "Success.") & "</pre>"
End If
' Let's download in the regular way, and then compare files..
success = http.Download(url,"qa_output/hamletRegular.xml")
' Compare files.
bSame = fac.FileContentsEqual("qa_output/hamlet.xml","qa_output/hamletRegular.xml")
Response.Write "<pre>" & Server.HTMLEncode( "bSame = " & bSame) & "</pre>"
%>
</body>
</html>