Index: OverbyteIcsHttpSrv.pas =================================================================== --- OverbyteIcsHttpSrv.pas (revision 887) +++ OverbyteIcsHttpSrv.pas (working copy) @@ -807,6 +807,9 @@ const Status : String; const ContType : String; const Header : String); virtual; + procedure AnswerStreamPart(var Flags : THttpGetFlag; + const ContType : String; + LastModified : TDateTime = 0); virtual; { Added by TR 2012-01-30 } procedure AnswerString(var Flags : THttpGetFlag; const Status : String; const ContType : String; @@ -2862,6 +2865,129 @@ {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} +{ANDREAS Byte-range-separator (use the same as IIS) } +const + ByteRangeSeparator = '[lka9uw3et5vxybtp87ghq23dpu7djv84nhls9p]'; + + +{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} +{ANDREAS Helperfunction to create the HTTP-Header } +function CreateHttpHeader( + Version : String; + ProtoNumber : Integer; + AnswerContentType : String; + RangeList : THttpRangeList; + DocSize : THttpRangeInt; + CompleteDocSize : THttpRangeInt): String; +begin + if ProtoNumber = 200 then + Result := Version + ' 200 OK' + #13#10 + + 'Content-Type: ' + AnswerContentType + #13#10 + + 'Content-Length: ' + _IntToStr(DocSize) + #13#10 + + 'Accept-Ranges: bytes' + #13#10 + {else if ProtoNumber = 416 then + Result := Version + ' 416 Request range not satisfiable' + #13#10} + else if ProtoNumber = 206 then begin + if RangeList.Count = 1 then begin + Result := Version + ' 206 Partial Content' + #13#10 + + 'Content-Type: ' + AnswerContentType + #13#10 + + 'Content-Length: ' + _IntToStr(DocSize) + #13#10 + + 'Content-Range: bytes ' + + RangeList.Items[0].GetContentRangeString(CompleteDocSize) + + #13#10; + end + else begin + Result := Version + ' 206 Partial Content' + #13#10 + + 'Content-Type: multipart/byteranges; boundary=' + + ByteRangeSeparator + #13#10 + + 'Content-Length: ' + _IntToStr(DocSize) + #13#10; + end; + end + else + raise Exception.Create('Unexpected ProtoNumber in CreateHttpHeader'); +end; + + +{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} +procedure THttpConnection.AnswerStreamPart( + var Flags : THttpGetFlag; + const ContType : String; { if emtpy, default to text/html } + LastModified : TDateTime = 0); +var + NewDocStream : TStream; + ProtoNumber : Integer; + CompleteDocSize : THttpRangeInt; + SyntaxError : Boolean; + ContEncoderHdr : String; + ContStatusHdr : String; +begin + Flags := hgWillSendMySelf; + ProtoNumber := 200; + ContEncoderHdr := ''; + if ContType <> '' then + FAnswerContentType := ContType + else + FAnswerContentType := 'text/html'; + FLastModified := LastModified; + + CompleteDocSize := FDocStream.Size; + {ANDREAS Create the virtual 'byte-range-doc-stream', if we are ask for ranges} + if RequestRangeValues.Valid then begin + { NewDocStream will now be the owner of FDocStream -> don't free FDocStream } + NewDocStream := RequestRangeValues.CreateRangeStream(FDocStream, + FAnswerContentType, CompleteDocSize, SyntaxError); + if Assigned(NewDocStream) then begin + FDocStream := NewDocStream; + FDocStream.Position := 0; + ProtoNumber := 206; + end + else begin + if SyntaxError then + { Ignore the content range header and send entire document in case } + { of syntactically invalid byte-range-set } + FDocStream.Position := 0 + else begin + { Answer 416 Request range not satisfiable } + FDocStream.Free; + FDocStream := nil; + if not FKeepAlive then + PrepareGraceFullShutDown; + Answer416; + Exit; + end; + end; + end; + + FDataSent := 0; { will be incremented after each send part of data } + FDocSize := FDocStream.Size; + OnDataSent := ConnectionDataSent; + + { V7.21 are we allowed to compress content } + if CheckContentEncoding(FAnswerContentType) then begin + ContEncoderHdr := DoContentEncoding; { V7.21 do it, returning new header } + FDocSize := FDocStream.Size; { stream is now smaller, we hope } + end; + + { Create Header } + {ANDREAS Create Header for the several protocols} + ContStatusHdr := CreateHttpHeader(FVersion, ProtoNumber, FAnswerContentType, + RequestRangeValues, FDocSize, CompleteDocSize); + PutStringInSendBuffer(ContStatusHdr); + FAnswerStatus := ProtoNumber; { V7.19 } + + if FLastModified <> 0 then + PutStringInSendBuffer ('Last-Modified: ' + RFC1123_Date(FLastModified) + ' GMT' + #13#10); + if ContEncoderHdr <> '' then + PutStringInSendBuffer (ContEncoderHdr); { V7.21 } + if FServer.PersistentHeader <> '' then + PutStringInSendBuffer (FServer.PersistentHeader); { V7.29 } + PutStringInSendBuffer(GetKeepAliveHdrLines); + PutStringInSendBuffer(#13#10); + SendStream; +end; + + +{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} function THttpConnection.HtmlPageProducerToString( const HtmlFile : String; UserData : TObject; @@ -3809,50 +3935,6 @@ {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} -{ANDREAS Byte-range-separator (use the same as IIS) } -const - ByteRangeSeparator = '[lka9uw3et5vxybtp87ghq23dpu7djv84nhls9p]'; - - -{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} -{ANDREAS Helperfunction to create the HTTP-Header } -function CreateHttpHeader( - Version : String; - ProtoNumber : Integer; - AnswerContentType : String; - RangeList : THttpRangeList; - DocSize : THttpRangeInt; - CompleteDocSize : THttpRangeInt): String; -begin - if ProtoNumber = 200 then - Result := Version + ' 200 OK' + #13#10 + - 'Content-Type: ' + AnswerContentType + #13#10 + - 'Content-Length: ' + _IntToStr(DocSize) + #13#10 + - 'Accept-Ranges: bytes' + #13#10 - {else if ProtoNumber = 416 then - Result := Version + ' 416 Request range not satisfiable' + #13#10} - else if ProtoNumber = 206 then begin - if RangeList.Count = 1 then begin - Result := Version + ' 206 Partial Content' + #13#10 + - 'Content-Type: ' + AnswerContentType + #13#10 + - 'Content-Length: ' + _IntToStr(DocSize) + #13#10 + - 'Content-Range: bytes ' + - RangeList.Items[0].GetContentRangeString(CompleteDocSize) + - #13#10; - end - else begin - Result := Version + ' 206 Partial Content' + #13#10 + - 'Content-Type: multipart/byteranges; boundary=' + - ByteRangeSeparator + #13#10 + - 'Content-Length: ' + _IntToStr(DocSize) + #13#10; - end; - end - else - raise Exception.Create('Unexpected ProtoNumber in CreateHttpHeader'); -end; - - -{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} { SendDocument will send FDocument file to remote client, build header and } { sending data (if required) } procedure THttpConnection.SendDocument(SendType : THttpSendType);
-- To unsubscribe or change your settings for TWSocket mailing list please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be