Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Anfangsposition setzen bei Http-Download (https://www.delphipraxis.net/126992-anfangsposition-setzen-bei-http-download.html)

bennepalz 6. Jan 2009 09:11


Anfangsposition setzen bei Http-Download
 
Hallo zusammen,

ich möchte gerne die Bewertungen eines Albums von Amazon.de auslesen. Das funktioniert schon alles ohne Probleme.
Um das ganze zu beschleunigen, würde ich gerne erst ab einer bestimmten Position/in einem bestimmten Bereich (100000-150000) den Download durchführen, da ich ungefähr weiß,
wo die Information steht.

1. Möglichkeit: "InternetSetFilePointer" Die funktioniert leider bei mir nicht, und soll auch recht langsam sein
2. Möglichkeit: Den Bereich "Range" über den Header übertragen. Im Internet habe ich einige Beispiel darüber gefunden.
Leider funktioniert es nicht. Ich weiß nicht, ob es einfach an Amazon liegt oder an mir.
Andere Seiten (google) habe ich auch schon ohne Erfolg ausprobiert. Der "Range" Header wird immer ignoriert.
Die meisten Beispiele die ich fand, waren aber genauso programmiert.
Im Header wird auch keine HTTP_QUERY_CONTENT_LENGTH übertragen. Vielleicht funktioniert es deshalb nicht?

Im folgenden ist der Code, mit dem ich gescheitert bin. Vielen Dank schon mal.
Beste Grüße

Delphi-Quellcode:
var
  hOpen, hConnect, hResource: HINTERNET;

  //Hier der Link auf die Amazon Seite: "Guns n Roses - Chinese Democracy"
  Host:String='www.amazon.de';
  Resource:String='/s/ref=nb_ss_w?__mk_de_DE=%C5M%C5Z%D5%D1&url=search-alias%3Daps&field-keywords=chinese&x=0&y=0';


function DownloadAtPos(const AURL, AFileName: string; APos: Integer): Integer;
var
  FileStream: TFileStream;
  s: string;
  DataProceed: array[0..8191] of Byte;
  numread: DWORD;
begin
  hOpen := InternetOpen('WinInet sample', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  hConnect := InternetConnect(hOpen, PChar(host), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  hResource := HttpOpenRequest(hConnect, 'GET', PChar(resource), nil, nil, nil, 0, 0);

  s := Format('Range: bytes=%d-%d', [100000,150000]); //Setze den zu lesenden Bereich
  HttpAddRequestHeaders(hResource, PChar(s), Length(s), HTTP_ADDREQ_FLAG_ADD_IF_NEW); //schreibe Header

  HttpSendRequest(hResource, nil, 0, nil, 0);

  //Download der Datei
  FileStream := TFileStream.Create(AFileName, fmCreate);
  try
    FileStream.Size:=0;
    FileStream.Position := 0;
    repeat
      ZeroMemory(@DataProceed, SizeOf(DataProceed));
      InternetReadFile(hResource, @DataProceed, SizeOf(DataProceed), numread);
      if (numread <= 0) then Break;
      FileStream.Write(DataProceed, numread);
      Result := Result + Integer(numread);
    until (not FIsDownloading);
  finally

    FileStream.Free();
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hOpen);
  end;
end;

function GetResourceSize(const AURL: string): Integer;
var
  s: string;
  buflen, tmp: DWORD;
begin
  hOpen := InternetOpen('WinInet resuming sample', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  hConnect := InternetConnect(hOpen, PChar(host), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  hResource := HttpOpenRequest(hConnect, 'HEAD', PChar(resource), nil, nil, nil, 0, 0);
  HttpSendRequest(hResource, nil, 0, nil, 0);

  buflen := SizeOf(Result);
  tmp := 0;
  Result := 0;
  HttpQueryInfo(hResource, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, @Result, buflen, tmp);

  InternetCloseHandle(hConnect);
  InternetCloseHandle(hOpen);
end;

mkinzler 6. Jan 2009 09:13

Re: Anfangsposition setzen bei Htp-Download
 
Unterstützt der Server das denn?

bennepalz 6. Jan 2009 09:16

Re: Anfangsposition setzen bei Http-Download
 
Da ich noch nie mit so etwas programmiert habe, habe ich keine Ahnung wie man das rausbekommt.
Die einzige Infos die ich habe, sind folgende (mit denen ich aber nicht sehr viel anfangen kann)
(Quelle: http://tools.nophia.de/)

Übersicht

Generelle Informationen zur Anfrage:
1. Protokoll: HTTP 1.1
2. Server: www.amazon.de
3. IP: 87.238.83.166
4. Port: 80
5. Pfad: /s/ref=nb_ss_w
6. Query: __mk_de_DE=%C5M%C5Z%D5%D1&url=search-alias%3Daps&field-keywords=c hinese&x=0&y=0


Folgende Anfrage wurde an den Server gesendet:
1. GET /s/ref=nb_ss_w?__mk_de_DE=%C5M%C5Z%D5%D1&url=search-alias%3Daps&f ield-keywords=chinese&x=0&y=0 HTTP/1.1
2. Host: www.amazon.de
3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 (.NET CLR 3.5.30729)
4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
6. Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
7. Referer: http://tools.nophia.de


Der Server hat folgendermaßen geantwortet:
1. HTTP/1.1 200 OK
2. Date: Tue, 06 Jan 2009 08:58:02 GMT
3. Server: Server
4. x-amz-id-1: 1P54CJNXJZPGDBZGFX8P
5. x-amz-id-2: a5oO/jB4MEmEtoS+PZxSqTuTZeKEFDS8rCNr/Pn4ZNs=
6. Vary: Accept-Encoding,User-Agent
7. Content-Type: text/html; charset=ISO-8859-15
8. Set-cookie: session-id=280-1001382-0862849; path=/; domain=.amazon.de; expires=Mon Jan 12 23:00:00 2009 GMT
9. Transfer-Encoding: chunked

mkinzler 6. Jan 2009 09:32

Re: Anfangsposition setzen bei Http-Download
 
Er müsste m.W. Accept-Ranges: ... als Fähigkeit melden

bennepalz 6. Jan 2009 09:41

Re: Anfangsposition setzen bei Http-Download
 
Und was könnte man tun, wenn er "Range" nicht akzeptiert?
Kann man dann mit sonst einem Trick in der Mitte der Datei mit dem Download beginnen?

mkinzler 6. Jan 2009 09:42

Re: Anfangsposition setzen bei Http-Download
 
Ich verfürchte nein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz