IdHTTP zu schnell?
Hi,
Ich programmieren mit Hilfe von TIdHTTPServer und TIdHTTP einen HTTP-Proxy... das ganze sieht bisher in etwa so aus:
Delphi-Quellcode:
Das ganze funktioniert auch für google.de gut.
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var URL: String; begin URL:='http://'+ARequestInfo.Host+ARequestInfo.Document+CreateParamList(ARequestInfo.Params); AResponseInfo.ContentText:=IdHTTP1.Get(URL); end; Nur unsere gute alte delphipraxis bricht dem ganzen leider das Genick. bei unterschiedlichen Dateien wirft er auf einmal folgende Exception: "Im Projekt Project1.exe ist eine Exception der Klasse EIdSocketError mit der Meldung 'Socket Error # 10022 Invalid argument.' aufgetreten." Das ganze tritt allerdings NICHT auf, wenn ich zwischen jeder Datei eine ShowMessage bestätige. Ich vermute daher das der aufruf der nächsten Datei einfach schneller kommt als IdHTTP die Datei vorher fertig hat, und dann einfach ne Exception wirft. Kann ich das irgendwie abfragen ob IdHTTP noch am basteln ist? oder direkt vermeiden? |
Re: IdHTTP zu schnell?
du bräuchtest dir nur eine Variable im Private dafür anlegen auf der du dir merkst ob der httpclient in Verwendung ist. Besser fände ich jedoch das du mehrere TIdhttp verwendest und je nach dem welches gerade frei ist genutzt wird (um auch die volle bandbreite nutzen zu können)
|
Re: IdHTTP zu schnell?
Zitat:
Delphi-Quellcode:
so funktioniert es tatsächlich^^
procedure TForm1.ServerCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var URL: String; begin URL:='http://'+ARequestInfo.Host+ARequestInfo.Document+CreateParamList(ARequestInfo.Params); try while Client.Tag=1 do Application.ProcessMessages; Client.Tag:=1; AResponseInfo.ContentText:=Client.Get(URL); Client.Tag:=0; except end; end; wie würdest du denn mehrere Clients intelligent organisieren? |
Re: IdHTTP zu schnell?
Haha :)
ich habe mich tatsächlich mal dran gesetzt und eine Klasse geschrieben welche mehrere IdHTTPs parallel downloaden lässt. und es geht auch deutlich schneller (bilde ich mir zumindest ein :drunken: ). hier mein Code :party:
Delphi-Quellcode:
Scheint eigentlich ganz gut zu funktionieren...irgendwelche verbesserungsvorschläge? :)
unit UDownloader;
interface uses IdHTTP, ExtCtrls, SysUtils, Windows; type THTTPArray = array of TIdHTTP; TDownloader = class(TObject) private FHTTPs: THTTPArray; //Clients LastCall: Int64; //Last Use of Get FTimer: TTimer; //Timer to Clear Idle Clients function Add: Integer; procedure Clear; procedure ClearIdle; function GetIdle: Integer; procedure OnTimer(Sender: TObject); public constructor Create; destructor Destroy; function Get(URL: String): String; end; implementation constructor TDownloader.Create; begin inherited; Clear; FTimer:=TTimer.Create(nil); FTimer.Interval:=5*60*1000; //5 minutes FTimer.OnTimer:=OnTimer; FTimer.Enabled:=True; end; destructor TDownloader.Destroy; var i:Integer; begin Clear; FTimer.Free; inherited; end; function TDownloader.Add: Integer; //Add new Client, Return ID begin Result:=Length(FHTTPs); //ID of new Client SetLength(FHTTPs,Result+1); FHTTPs[Result]:=TIdHTTP.Create; FHTTPs[Result].Tag:=0; //Not in use FHTTPs[Result].HandleRedirects:=True; end; procedure TDownloader.Clear; //Clear alls Clients and set Array to 0 var i:Integer; begin for i:=0 to Length(FHTTPs)-1 do FHTTPs[i].Free; SetLength(FHTTPs,0); end; procedure TDownloader.ClearIdle; //Clear all Clients which are Idle, beginning from the back var i:Integer; begin for i:=Length(FHTTPs)-1 downto 0 do if FHTTPs[i].Tag=0 then begin FHTTPs[i].Free; SetLength(FHTTPs,i); end; end; function TDownloader.GetIdle: Integer; //Get first idle Client var i: Integer; begin Result:=-1; for i:=0 to Length(FHTTPs)-1 do if FHTTPs[i].Tag=0 then begin Result:=i; Break; end; end; procedure TDownloader.OnTimer(Sender: TObject); //Timer Event to clear idle Clients begin if (GetTickCount-LastCall)>30*1000 then ClearIdle; end; function TDownloader.Get(URL: String): String; //Download var I: Integer; begin LastCall:=GetTickCount; I:=GetIdle; //Get Idle if i=-1 then I:=Add; //If no idles, create new FHTTPs[i].Tag:=1; //client is in use Result:=FHTTPs[i].Get(URL); //download FHTTPs[i].Tag:=0; //client is no more in use LastCall:=GetTickCount; end; end. Edit: es scheint aber irgendwie probleme zu geben wenn man auf nen link klickt bevor ganz geladen ist...kann das sein? Zudem kommt, wenn ich über den Proxy diesen Beitrag hier zB editieren will "Kein Eintrags-Modus ausgewählt"... Was heisst das? |
Re: IdHTTP zu schnell?
eine Möglichkeit wäre auch noch das du den httpclient dynamich erzeugst und nachdem die Datei heruntergeladen ist, dieser client wieder freigegeben wird (so entfällt die Organisation). Das mit "kein Eintragsmodus gewählt" kann auch an den Cookies liegen. Hast du die irgendwie mit Integriert oder vergessen?
|
Re: IdHTTP zu schnell?
Dann hätte man aber viele Clients die man nur für einen Request erstellen würde und danach dann zerstören - also relativ unperformant ... oder nicht ?
|
Re: IdHTTP zu schnell?
stimmt, in dem Sinne ist es schon unperformant was sich aber kaum bemerkbar machen sollte da nicht 100000 Anfragen gleichzeitig rein kommen
|
Re: IdHTTP zu schnell?
Zitat:
aber noch ein paar bugs raus und neues feature (dank an jfheins ;) ) werd ich dann wenns mal funzt im OS-Teil posten^^ Cookies...was muss ich denn dafür machen? ich leite ja im prinzip alles einfach nur weiter...wie würde das denn aussehen? hab da gar keine ahnung von^^ |
Re: IdHTTP zu schnell?
Mir ist ein wichtiges Problem aufgefallen, und zwar leitetst du POST-Daten per GET weiter - wenn das PHP-Script sauber pragrammiert ist, geht es nicht :mrgreen: (weil es die Daten dann nur über POST entgegennimmt)
|
Re: IdHTTP zu schnell?
Zitat:
Ich habe bei IdHTTP bisher nur Get benutzt^^ werd ich mir heut abend mal anschauen... |
Re: IdHTTP zu schnell?
Hi!
Das dürfte vielleicht auch der Grund für den "Fehler" mit dem Eintragsmpde sein. Es wird hier zwar per GET übergeben, aber vielleicht hängt es ja damit zusammen. Die Meldung kommt, wenn bei Aufruf der posting.php der Parameter mode nicht oder falsch gesetzt ist. Ciao Frederic |
Re: IdHTTP zu schnell?
also ich habe mir das mal genauer angeschaut...und habe zB gefunden dass man IdHTTP.Post nehmen soll...
Mein IdHTTP hat keine methode Post :shock: was nun? |
Re: IdHTTP zu schnell?
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!
Also meine kennts: s. Anhang Ciao Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 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