unit uIPHttpHeaders; interface {$I RemObjects.inc} uses SysUtils, Classes; type TDynamicByteArray = array of Byte; TIPHttpRequestHeaders = class private fHeaders: TStrings; fMethod: string; fPath: string; fVersion: string; function GetContentType: string; function GetContentLength: Int64; public constructor Create; destructor Destroy; override; property Headers: TStrings read fHeaders; procedure AddHeaderLine(const aLine: string); property Method: string read fMethod write fMethod; property Path: string read fPath write fPath; property Version: string read fVersion write fVersion; property ContentLength: Int64 read GetContentLength; property ContentType: string read GetContentType; procedure Clear; end; TIPHttpResponseHeaders = class private fHeaders: TStrings; fCode: Integer; fVersion, fReason: string; public constructor Create; destructor Destroy; override; property Headers: TStrings read fHeaders; property Version: string read fVersion write fVersion; property Code: Integer read fCode write fCode; property Reason: string read fReason write fReason; procedure Assign(aOrg: TIPHttpResponseHeaders); procedure Clear; function ToString: string; end; implementation { TIPHttpRequestHeaders } procedure TIPHttpRequestHeaders.AddHeaderLine(const aLine: string); var lPos: Integer; lName, lVal: string; begin lPos := Pos(':', aline); if lPos = 0 then exit; lName := Trim(copy(aLine, 1, lPos -1)); lVal := Trim(copy(aLine, lPos+1, MaxInt)); fHeaders.ADd(lName+'='+lVal); end; procedure TIPHttpRequestHeaders.Clear; begin fHeaders.Clear; fMethod := ''; fPath := ''; fVersion := ''; end; constructor TIPHttpRequestHeaders.Create; begin fHeaders := TStringList.Create; end; destructor TIPHttpRequestHeaders.Destroy; begin fHeaders.Free; inherited Destroy; end; function TIPHttpRequestHeaders.GetContentLength: Int64; var s: string; begin s := fHeaders.Values['Content-Length']; Result := StrToInt64Def(s, 0); end; function TIPHttpRequestHeaders.GetContentType: string; begin result := fHeaders.Values['Content-Type']; end; { TIPHttpResponseHeaders } procedure TIPHttpResponseHeaders.Assign(aOrg: TIPHttpResponseHeaders); begin fHeaders.Assign(aOrg.Headers); fCode := aOrg.Code; fVersion := aOrg.Version; fReason := aOrg.Reason; end; procedure TIPHttpResponseHeaders.Clear; begin fCode := 200; fVersion := 'HTTP/1.1'; fReason := 'OK'; fHeaders.Clear; end; constructor TIPHttpResponseHeaders.Create; begin inherited Create; fHeaders := TStringList.Create; fVersion := 'HTTP/1.1'; Clear; end; destructor TIPHttpResponseHeaders.Destroy; begin fHeaders.Free; inherited Destroy; end; function TIPHttpResponseHeaders.ToString: string; var lHeaders, lName, lVal: string; lPos, i: Integer; begin lHeaders := fVersion +' '+ IntToStr(fCode)+' '+fReason + #13#10; for i := 0 to fHeaders.Count -1 do begin lVal := fHeaders[i]; lPos := Pos('=', lVal); if lPos > 0 then begin lName := Trim(Copy(lVal, 1, lPos -1)); lVal := Trim(Copy(lVal, lPos + 1, MaxInt)); lHeaders := lHeaders + lName+': '+lVal + #13#10; end; end; lHeaders := lHeaders + #13#10; Result := lHeaders; end; end.