📄 overbyte.ics.httpclient.pas
字号:
FPassword := pass;
end;
if (Proto <> '') and (Host <> '') then begin
{ We have a full relocation URL }
FTargetHost := Host;
FLocation := Proto + '://' + Host + Path;
FPath := FLocation;
end
else begin
if Proto = '' then
Proto := 'http';
if FPath = '' then
FLocation := Proto + '://' + FTargetHost + '/' + Host
else if Host = '' then
FLocation := Proto + '://' + FTargetHost + FPath
else
FTargetHost := Host;
end;
end;
end
{ We are not using a proxy }
else begin
if Data[1] = '/' then begin
{ Absolute location }
FPath := Data;
if Proto = '' then
Proto := 'http';
FLocation := Proto + '://' + FHostName + FPath;
end
else if (Copy(Data, 1, 7) <> 'http://')
{$IFDEF USE_SSL}
and (Copy(Data, 1, 8) <> 'https://')
{$ENDIF}
then begin
{ Relative location }
FPath := GetBaseUrl(FPath) + Data;
if Proto = '' then
Proto := 'http';
FLocation := Proto + '://' + FHostName + {'/' +} FPath;
end
else begin
ParseURL(Data, proto, user, pass, FHostName, port, FPath);
if port <> '' then
FPort := port
else begin
{$IFDEF USE_SSL}
if proto = 'https' then
FPort := '443'
else
{$ENDIF}
FPort := '80';
end;
FProtocol := Proto;
if (user <> '') and (pass <> '') then begin
{ save user and password given in location @@@}
FUsername := user;
FPassword := pass;
end;
if (Proto <> '') and (FHostName <> '') then begin
{ We have a full relocation URL }
FTargetHost := FHostName;
if FPath = '' then begin
FPath := '/';
FLocation := Proto + '://' + FHostName;
end
else
FLocation := Proto + '://' + FHostName + FPath;
end
else begin
if Proto = '' then
Proto := 'http';
if FPath = '' then begin
FLocation := Proto + '://' + FTargetHost + '/' + FHostName;
FHostName := FTargetHost;
FPath := FLocation; { 26/11/99 }
end
else if FHostName = '' then begin
FLocation := Proto + '://' + FTargetHost + FPath;
FHostName := FTargetHost;
end
else
FTargetHost := FHostName;
end;
end;
end;
end;
end
else if Field = 'content-length' then
FContentLength := StrToInt(Trim(Data))
else if Field = 'content-range' then begin {JMR!! Added this line!!!}
tmpInt := Pos('-', Data) + 1; {JMR!! Added this line!!!}
FContentRangeBegin := Copy(Data, 7, tmpInt-8); {JMR!! Added this line!!!}
FContentRangeEnd := Copy(Data, tmpInt, Pos('/', Data) - tmpInt); {JMR!! Added this line!!!}
end {JMR!! Added this line!!!}
else if Field = 'accept-ranges' then
FAcceptRanges := Data
else if Field = 'content-type' then
FContentType := LowerCase(Data)
else if Field = 'www-authenticate' then
FDoAuthor.add(Data)
else if Field = 'set-cookie' then begin
bAccept := TRUE;
TriggerCookie(Data, bAccept);
end
{ else if Field = 'date' then }
{ else if Field = 'mime-version' then }
{ else if Field = 'pragma' then }
{ else if Field = 'allow' then }
{ else if Field = 'server' then }
{ else if Field = 'content-encoding' then }
{ else if Field = 'expires' then }
{ else if Field = 'last-modified' then }
end
else { Ignore all other responses }
;
if Assigned(FOnHeaderData) then
FOnHeaderData(Self);
{ if FStatusCode >= 400 then Moved above 01/11/01 }
{ FCtrlSocket.Close; }
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure THttpClient.InternalClear;
begin
FRcvdHeader.Clear;
FRequestDoneError := 0;
FDocName := '';
FStatusCode := 0;
FRcvdCount := 0;
FSentCount := 0;
FHeaderLineCount := 0;
FBodyLineCount := 0;
FContentLength := -1;
FContentType := ''; { 25/09/1999 }
FAllowedToSend := FALSE;
FLocation := FURL;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure THttpClient.DoRequestAsync(Rq : THttpRequest);
var
Proto, User, Pass, Host, Port, Path: String;
begin
if (Rq <> httpCLOSE) and (FState <> httpReady) then
raise EHttpException.Create('HTTP component is busy', httperrBusy);
if ((Rq = httpPOST) or (Rq = httpPUT)) and (not Assigned(FSendStream)) then
raise EHttpException.Create('HTTP component has nothing to post or put',
httpErrNoData);
if Rq = httpCLOSE then begin
FStatusCode := 200;
FReasonPhrase := 'OK';
StateChange(httpClosing);
if FCtrlSocket.State = wsClosed then
SetReady
else
FCtrlSocket.CloseDelayed;
Exit;
end;
{ Clear all internal state variables }
FRequestType := Rq;
InternalClear;
{ Parse url and proxy to FHostName, FPath and FPort }
if FProxy <> '' then begin
ParseURL(FURL, Proto, User, Pass, Host, Port, Path);
FTargetHost := Host;
FTargetPort := Port;
if FTargetPort = '' then begin
if Proto = 'https' then
FTargetPort := '443'
else
FTargetPort := '80';
end;
FPath := FURL;
FDocName := Path;
if User <> '' then
FUserName := User;
if Pass <> '' then
FPassword := Pass;
{ We need to remove usercode/Password from the URL given to the proxy }
{ but preserve the port }
if Port <> '' then
Port := ':' + Port;
if Proto = '' then
FPath := 'http://'+ Host + Port + Path
else
FPath := Proto + '://' + Host + Port + Path;
FProtocol := Proto;
ParseURL(FProxy, Proto, User, Pass, Host, Port, Path);
if Port = '' then
Port := ProxyPort;
end
else begin
ParseURL(FURL, Proto, User, Pass, Host, Port, FPath);
FTargetHost := Host;
FDocName := FPath;
FProtocol := Proto;
if User <> '' then
FUserName := User;
if Pass <> '' then
FPassword := Pass;
if Port = '' then begin
{$IFDEF USE_SSL}
if Proto = 'https' then
Port := '443'
else
{$ENDIF}
Port := '80';
end;
end;
if Proto = '' then
Proto := 'http';
if FPath = '' then
FPath := '/';
AdjustDocName;
FHostName := Host;
FPort := Port;
//WSocketTriggerDebugEvent(Self, 'Host ="' + FHostName + '" Port = "' + FPort + '"');
if FCtrlSocket.State = wsConnected then begin
if (FHostName = FCurrentHost) and
(FPort = FCurrentPort) and
(FProtocol = FCurrentProtocol) then begin
{ We are already connected to the right host ! }
SocketSessionConnected(Self, 0);
Exit;
end;
{ Connected to another website. Abort the connection }
FCtrlSocket.Abort;
end;
FProxyConnected := FALSE;
{ Ask to connect. When connected, we go at SocketSeesionConnected. }
StateChange(httpNotConnected);
Login;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure THttpClient.AdjustDocName;
var
I : Integer;
begin
I := Pos('?', FDocName);
if I > 0 then
FDocName := Copy(FDocName, 1, I - 1);
if (FDocName = '') or (FDocName[Length(FDocName)] = '/') then
FDocName := 'document.htm'
else begin
if FDocName[Length(FDocName)] = '/' then
SetLength(FDocName, Length(FDocName) - 1);
FDocName := Copy(FDocName, Posn('/', FDocName, -1) + 1, 255);
I := Pos('?', FDocName);
if I > 0 then
FDocName := Copy(FDocName, 1, I - 1);
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure THttpClient.DoRequestSync(Rq : THttpRequest);
begin
DoRequestAsync(Rq);
{$IFDEF VER80}
{ Delphi 1 has no support for multi-threading }
while FState <> httpReady do
Application.ProcessMessages;
{$ELSE}
if FMultiThreaded then begin
while FState <> httpReady do begin
FCtrlSocket.ProcessMessages;
Sleep(0);
end;
end
else begin
while FState <> httpReady do begin
{$IFNDEF NOFORMS}
Application.ProcessMessages;
if Application.Terminated then begin
Abort;
break;
end;
{$ELSE}
FCtrlSocket.ProcessMessages;
{$ENDIF}
Sleep(0);
end;
end;
{$ENDIF}
if FStatusCode >= 400 then
raise EHttpException.Create(FReasonPhrase, FStatusCode);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure THttpClient.LocationSessionClosed(Sender: TObject; ErrCode: Word);
var
Proto, User, Pass, Host, Port, Path: String;
RealLocation : String;
I : Integer;
begin
{ Remove any bookmark from the URL }
I := Pos('#', FLocation);
if I > 0 then
RealLo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -