You can find all the code from my HTTP webinar in my special HTTP folder.
[Project source code] [YouTube Replay]
This is the script I use to demonstrate HTTP Range requests through Telnet. Just copy and paste each block of code (including the trailing blank line) into a command window and it will run telnet and make the HTTP request. You can view the test file here. Read HTTP Status Codes (including 418), Methods, Headers, and Access Control (CORS).
telnet delphi.org 80 HEAD /http/httptestfile.txt HTTP/1.1 Host: delphi.org Connection: close
telnet delphi.org 80 GET /http/httptestfile.txt HTTP/1.1 Host: delphi.org Connection: close
telnet delphi.org 80 GET /http/httptestfile.txt HTTP/1.1 Host: delphi.org Range: bytes=0-77 Connection: close
telnet delphi.org 80 GET /http/httptestfile.txt HTTP/1.1 Host: delphi.org Range: bytes=115-154 Connection: close
telnet delphi.org 80 GET /http/httptestfile.txt HTTP/1.1 Host: delphi.org Range: bytes=78-113 Connection: close
telnet delphi.org 80 GET /http/httptestfile.txt HTTP/1.1 Host: delphi.org Range: bytes=115-154,127-127 Connection: close
This last one stopped working because of a change on the web server.
Here are the images. They all are available as both JPG and BMP and are 640×472 in resolution.
original.jpg |
||
blue.jpg |
green.jpg |
red.jpg |
purple.jpg |
teal.jpg |
yellow.jpg |
Here is the code I used to stream all 7 images into one image. HTTPClient is a TNetHTTPClient and HTTPReq is a TNetHTTPRequest on the form. The reason it uses Bitmap images is that they are an uncompressed stream of pixel data, so are easier to recombine into one image.
const baseurl: string = 'http://delphi.org/http/'; files: array[0..5] of string = ('red.bmp','green.bmp','blue.bmp', 'yellow.bmp','purple.bmp','teal.bmp'); procedure TForm34.Button1Click(Sender: TObject); var resp: IHTTPResponse; chunk: Integer; mem: TMemoryStream; I: Integer; begin resp := HTTPReq.Head(baseurl + 'original.bmp'); chunk := resp.ContentLength div 12; ProgressBar1.Max := resp.ContentLength; resp := HTTPReq.Get(baseurl + 'original.bmp'); mem := TMemoryStream.Create; try mem.LoadFromStream(resp.ContentStream); for I := 5 to 11 do begin ProgressBar1.Tag := chunk*i; if I < 11 then httpreq.CustomHeaders['Range'] := 'bytes=' + IntToStr(chunk*i) +'-' + IntToStr(chunk*i+chunk-1) else httpreq.CustomHeaders['Range'] := 'bytes=' + IntToStr(chunk*i) +'-'; HTTPReq.MethodString := 'GET'; button1.Text := files[i mod 6]; HTTPReq.URL := baseurl + files[i mod 6]; resp := HTTPReq.Execute(); mem.Position := chunk*i; TMemoryStream(resp.ContentStream).SaveToStream(mem); end; Image1.Bitmap.LoadFromStream(mem); finally mem.DisposeOf; end; end;