📄 httpprot.pas
字号:
http://de.news.yahoo.com:80/. The server was sending a document
even after we requested just the header. The fix make the
component ignore data and abort the connection. This is really an
error at server side !
Aug 08, 2004 V1.65 Moved utility function related to URL handling into IcsUrl
unit for easy reuse outside of the component.
Aug 20, 2004 V1.66 Use MsgWaitForMultipleObjects in DoRequestSync to avoid
consumming 100% CPU while waiting.
Sep 04, 2004 V1.67 Csonka Tibor <bee@rawbite.ro> worked a lot on my NTLM code,
fixing it and making it work properly.
I removed NTLM specific usercode and password properties to use
FUsername and FPassword which are extracted from the URL.
Define symbol UseNTLMAuthentication for Delphi 5 and up.
Sep 13, 2004 V1.68 Added option httpoNoNTLMAuth by Csonka Tibor
Fixed TriggerRequestDone for NTLM authentication
Moved NTLM code out of DoBeforeConnect which was intended for
socket setup and not for protocol handling.
Oct 02, 2004 V1.69 Remived second copy of IntToStrDef.
Oct 06, 2004 V1.70 Miha Remec fixed THttpCli.GetHeaderLineNext to add
status check for 301 and 302 values.
Oct 15, 2004 V1.71 Lotauro.Maurizio@dnet.it enhanced basic and NTLM
authentifications methods. Event OnNTLMAuthStep has been
removed.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
unit HttpProt;
interface
{$B-} { Enable partial boolean evaluation }
{$T-} { Untyped pointers }
{$X+} { Enable extended syntax }
{$I ICSDEFS.INC}
{$IFDEF DELPHI6_UP}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN SYMBOL_LIBRARY OFF}
{$WARN SYMBOL_DEPRECATED OFF}
{$ENDIF}
{$IFNDEF COMPILER2_UP} { Not for Delphi 1 }
{$H+} { Use long strings }
{$J+} { Allow typed constant to be modified }
{$ENDIF}
{$IFDEF BCB3_UP}
{$ObjExportAll On}
{$ENDIF}
{$IFDEF DELPHI5_UP}
{$DEFINE UseNTLMAuthentication}
{$ENDIF}
uses
Messages,
{$IFDEF USEWINDOWS}
Windows,
{$ELSE}
WinTypes, WinProcs,
{$ENDIF}
SysUtils, Classes,
{$IFNDEF NOFORMS}
Forms, Controls,
{$ENDIF}
{ You must define USE_SSL so that SSL code is included in the component. }
{ To be able to compile the component, you must have the SSL related files }
{ which are _NOT_ freeware. See http://www.overbyte.be for details. }
{$IFDEF USE_SSL}
IcsSSLEAY, IcsLIBEAY,
{$ENDIF}
{$IFDEF UseNTLMAuthentication}
IcsNtlmMsgs,
{$ENDIF}
IcsUrl, WinSock, WSocket;
const
HttpCliVersion = 171;
CopyRight : String = ' THttpCli (c) 1997-2004 F. Piette V1.71 ';
DefaultProxyPort = '80';
{$IFDEF DELPHI1}
{ Delphi 1 has a 255 characters string limitation }
HTTP_RCV_BUF_SIZE = 255;
HTTP_SND_BUF_SIZE = 8193;
{$ELSE}
HTTP_RCV_BUF_SIZE = 8193;
HTTP_SND_BUF_SIZE = 8193;
{$ENDIF}
WM_HTTP_REQUEST_DONE = WM_USER + 1;
WM_HTTP_SET_READY = WM_USER + 2;
WM_HTTP_LOGIN = WM_USER + 3;
httperrNoError = 0;
httperrBusy = 1;
httperrNoData = 2;
httperrAborted = 3;
httperrOverflow = 4;
httperrVersion = 5;
type
EHttpException = class(Exception)
ErrorCode : Word;
constructor Create(const Msg : String; ErrCode : Word);
end;
THttpEncoding = (encUUEncode, encBase64, encMime);
THttpRequest = (httpABORT, httpGET, httpPOST, httpPUT,
httpHEAD, httpCLOSE);
THttpState = (httpReady, httpNotConnected, httpConnected,
httpDnsLookup, httpDnsLookupDone,
httpWaitingHeader, httpWaitingBody, httpBodyReceived,
httpWaitingProxyConnect,
httpClosing, httpAborting);
THttpChunkState = (httpChunkGetSize, httpChunkGetExt, httpChunkGetData,
httpChunkSkipDataEnd, httpChunkDone);
THttpNTLMState = (ntlmNone, ntlmMsg1, ntlmMsg2, ntlmMsg3, ntlmDone);
TNTLMAuthType = (ntlmAuthProxy, ntlmAuthNormal);
THttpBasicState = (basicNone, basicMsg1, basicDone);
TBasicAuthType = (basicAuthProxy, basicAuthNormal);
TOnCommand = procedure (Sender : TObject;
var S: String) of object;
TDocDataEvent = procedure (Sender : TObject;
Buffer : Pointer;
Len : Integer) of object;
TCookieRcvdEvent = procedure (Sender : TObject;
const Data : String;
var Accept : Boolean) of object;
THttpRequestDone = procedure (Sender : TObject;
RqType : THttpRequest;
ErrCode : Word) of object;
TBeforeHeaderSendEvent = procedure (Sender : TObject;
const Method : String;
Headers : TStrings) of object;
THttpCliOption = (httpoNoBasicAuth, httpoNoNTLMAuth);
THttpCliOptions = set of THttpCliOption;
THttpCli = class(TComponent)
protected
FCtrlSocket : TWSocket;
FWindowHandle : HWND;
FMultiThreaded : Boolean;
FState : THttpState;
FLocalAddr : String;
FHostName : String;
FTargetHost : String;
FTargetPort : String;
FPort : String;
FProtocol : String;
FProxy : String;
FProxyPort : String;
FUsername : String;
FPassword : String;
FProxyUsername : String;
FProxyPassword : String;
FProxyConnected : Boolean;
FLocation : String;
FCurrentHost : String;
FCurrentPort : String;
FCurrentProtocol : String;
FConnected : Boolean;
FDnsResult : String;
FSendBuffer : array [0..HTTP_SND_BUF_SIZE - 1] of char;
FRequestType : THttpRequest;
FReceiveBuffer : array [0..HTTP_RCV_BUF_SIZE - 1] of char;
FReceiveLen : Integer;
FLastResponse : String;
FHeaderLineCount : Integer;
FBodyLineCount : Integer;
FAllowedToSend : Boolean;
FURL : String;
FPath : String;
FDocName : String;
FSender : String;
FReference : String;
FConnection : String; { for Keep-alive }
FProxyConnection : String; { for proxy keep-alive }
FAgent : String;
FAccept : String;
FAcceptLanguage : String;
FModifiedSince : TDateTime; { Warning ! Use GMT date/Time }
FNoCache : Boolean;
FStatusCode : Integer;
FReasonPhrase : String;
FResponseVer : String;
FRequestVer : String;
FContentLength : LongInt;
FContentType : String;
FTransferEncoding : String;
FChunkLength : Integer;
FChunkRcvd : Integer;
FChunkState : THttpChunkState;
FDoAuthor : TStringList;
FContentPost : String; { Also used for PUT }
FContentRangeBegin : String;
FContentRangeEnd : String;
FAcceptRanges : String;
FCookie : String;
FLocationFlag : Boolean;
FFollowRelocation : Boolean; {TED}
FHeaderEndFlag : Boolean;
FRcvdHeader : TStrings;
FRcvdStream : TStream; { If assigned, will recv the answer }
FRcvdCount : LongInt; { Number of rcvd bytes for the body }
FSentCount : LongInt;
FSendStream : TStream; { Contains the data to send }
FReqStream : TMemoryStream;
FRequestDoneError : Integer;
FNext : procedure of object;
FBodyData : PChar;
FBodyDataLen : Integer;
FOptions : THttpCliOptions;
{$IFDEF UseNTLMAuthentication}
FNTLMMsg2Info : TNTLM_Msg2_Info;
FProxyNTLMMsg2Info : TNTLM_Msg2_Info;
FAuthNTLMState : THttpNTLMState;
FProxyAuthNTLMState : THttpNTLMState;
FNTLMAuthType : TNTLMAuthType;
{$ENDIF}
FAuthBasicState : THttpBasicState;
FProxyAuthBasicState : THttpBasicState;
FBasicAuthType : TBasicAuthType;
FOnStateChange : TNotifyEvent;
FOnSessionConnected : TNotifyEvent;
FOnSessionClosed : TNotifyEvent;
FOnRequestHeaderBegin : TNotifyEvent;
FOnRequestHeaderEnd : TNotifyEvent;
FOnHeaderBegin : TNotifyEvent;
FOnHeaderEnd : TNotifyEvent;
FOnHeaderData : TNotifyEvent;
FOnDocBegin : TNotifyEvent;
FOnDocEnd : TNotifyEvent;
FOnDocData : TDocDataEvent;
FOnSendBegin : TNotifyEvent;
FOnSendEnd : TNotifyEvent;
FOnSendData : TDocDataEvent;
FOnTrace : TNotifyEvent;
FOnCommand : TOnCommand;
FOnCookie : TCookieRcvdEvent;
FOnDataPush : TDataAvailable;
FOnDataPush2 : TNotifyEvent;
FOnRequestDone : THttpRequestDone;
FOnLocationChange : TNotifyEvent;
(***
{$IFDEF UseNTLMAuthentication}
FOnNTLMAuthStep : TNotifyEvent;
{$ENDIF}
***)
{ Added by Eugene Mayevski }
FOnSocksConnected : TSessionConnected;
FOnSocksAuthState : TSocksAuthStateEvent;
FOnSocksError : TSocksErrorEvent;
FOnSocketError : TNotifyEvent;
FOnBeforeHeaderSend : TBeforeHeaderSendEvent; { Wilfried 9 sep 02}
FCloseReq : Boolean; { SAE 01/06/04 }
procedure CreateSocket; virtual;
procedure DoBeforeConnect; virtual;
procedure DoSocksConnected(Sender: TObject; ErrCode: Word);
procedure DoSocksAuthState(Sender : TObject; AuthState : TSocksAuthState);
procedure DoSocksError(Sender : TObject; ErrCode : Integer; Msg : String);
procedure SocketErrorTransfer(Sender : TObject);
procedure SetSocksServer(value : String);
procedure SetSocksLevel(value : String);
procedure SetSocksPort(value : String);
procedure SetSocksUsercode(value : String);
procedure SetSocksPassword(value : String);
procedure SetSocksAuthentication(value : TSocksAuthentication);
function GetSocksServer : String;
function GetSocksLevel : String;
function GetSocksPort : String;
function GetSocksUsercode : String;
function GetSocksPassword : String;
function GetSocksAuthentication : TSocksAuthentication;
{ Mayevski additions end }
procedure SendRequest(const method, Version: String);
procedure GetHeaderLineNext; virtual;
procedure GetBodyLineNext; virtual;
procedure SendCommand(const Cmd : String); virtual;
procedure Login; virtual;
procedure Logout; virtual;
procedure InternalClear; virtual;
procedure StartRelocation; virtual;
{$IFDEF UseNTLMAuthentication}
procedure StartAuthNTLM; virtual;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -