unit pageloader; {$mode delphi} interface uses Classes, SysUtils, browsermodules, browserconfig; type { TPageLoader } TPageLoader = class public Contents: string; LastPageURL: string; ContentsList: TStringList; DebugInfo: TStringList; constructor Create; destructor Destroy; override; procedure LoadFromURL(AURL: string); procedure LoadBinaryResource(AURL: string; var ADest: TMemoryStream); function URLToAbsoluteURL(AInput: string): string; end; TOnPageLoadProgress = procedure (APercent: Integer) of object; { TPageLoaderThread } TPageLoaderThread = class(TThread) private FOnPageLoadProgress: TOnPageLoadProgress; public PageLoader: TPageLoader; Progress: Integer; URL: string; destructor Destroy; override; procedure Execute; override; procedure CallPageLoadProgress; property OnPageLoadProgress: TOnPageLoadProgress read FOnPageLoadProgress write FOnPageLoadProgress; end; implementation uses httpsend; { TPageLoaderThread } destructor TPageLoaderThread.Destroy; begin inherited Destroy; end; procedure TPageLoaderThread.Execute; var lModule: TBrowserModule; lNewContents: string; i: Integer; begin PageLoader.LoadFromURL(URL); // Run all modules which might want to change the HTML for i := 0 to GetBrowserModuleCount() - 1 do begin lModule := GetBrowserModule(i); if not lModule.Activated then Continue; if lModule.HandleOnPageLoad(PageLoader.Contents, lNewContents) then begin PageLoader.Contents := lNewContents; writeln(PageLoader.Contents); end; end; end; procedure TPageLoaderThread.CallPageLoadProgress; begin end; { TPageLoader } constructor TPageLoader.Create; begin ContentsList := TStringList.Create; DebugInfo := TStringList.Create; end; destructor TPageLoader.Destroy; begin ContentsList.Free; DebugInfo.Free; inherited Destroy; end; procedure TPageLoader.LoadFromURL(AURL: string); var Client: THttpSend; J: Integer; begin // If there is no protocol, add http J := Pos(':', AURL); if (J = 0) then LastPageURL := 'http://' + AURL else LastPageURL := AURL; Client := THttpSend.Create; try Client.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'); Client.Headers.Add('Accept-Language: en-gb,en;q=0.5'); // Client.Headers.Add('Accept-Encoding: gzip,deflate'); Client.Headers.Add('Accept-Charset: utf-8;q=0.7,*;q=0.7'); // ISO-8859-1, Client.UserAgent := FPBrowserConfig.UserAgent; Client.HttpMethod('GET', LastPageURL); // Client.Headers; Client.Document.Position := 0; ContentsList.Clear(); ContentsList.LoadFromStream(Client.Document); DebugInfo.Clear(); DebugInfo.Add(Format('Loading page: %s', [LastPageURL])); DebugInfo.Add(''); DebugInfo.Add('HTTP Headers:'); DebugInfo.Add(''); DebugInfo.AddStrings(Client.Headers); DebugInfo.Add(''); Contents := ContentsList.Text; finally Client.Free; end; end; procedure TPageLoader.LoadBinaryResource(AURL: string; var ADest: TMemoryStream); var Client: THttpSend; i: Integer; begin Client := THttpSend.Create; try Client.Headers.Add('Accept: image/png, image/jpeg, image/gif'); Client.Headers.Add('Accept-Language: en-gb,en;q=0.5'); // Client.Headers.Add('Accept-Encoding: gzip,deflate'); Client.Headers.Add('Accept-Charset: utf-8;q=0.7,*;q=0.7'); // ISO-8859-1, // Client.UserAgent := AUserAgent; Client.HttpMethod('GET', AURL); Client.Document.Position := 0; ADest := TMemoryStream.Create; ADest.CopyFrom(Client.Document, Client.Document.Size); DebugInfo.Add(Format('Loading image: %s Size: %d', [AURL, ADest.Size])); finally Client.Free; end; end; function TPageLoader.URLToAbsoluteURL(AInput: string): string; var J: Integer; begin // Add the base URL if the URL is relative J := Pos(':', UpperCase(AInput)); if J = 0 then begin if (Length(LastPageURL) > 0) and (LastPageURL[Length(LastPageURL)] = '/') then Result := LastPageURL + Copy(AInput, 2, Length(AInput)-1) else Result := LastPageURL + AInput; end else Result := AInput; end; end.