summaryrefslogtreecommitdiff
path: root/packages/fcl-web
diff options
context:
space:
mode:
authormichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-10-27 12:11:57 +0000
committermichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-10-27 12:11:57 +0000
commit8958251541268dc719c67fc0c02875161ded8ff9 (patch)
tree341eef3f8aec8d7abe0550d8d7db3e03c6ed6a2a /packages/fcl-web
parent24cbbaac267e0d4064b5335eb7be0858b19e9971 (diff)
downloadfpc-8958251541268dc719c67fc0c02875161ded8ff9.tar.gz
* Fixed sending/receiving of large data packets (size >word)
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@16232 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-web')
-rw-r--r--packages/fcl-web/src/base/custfcgi.pp58
1 files changed, 38 insertions, 20 deletions
diff --git a/packages/fcl-web/src/base/custfcgi.pp b/packages/fcl-web/src/base/custfcgi.pp
index 2f9ce950ec..65660994fd 100644
--- a/packages/fcl-web/src/base/custfcgi.pp
+++ b/packages/fcl-web/src/base/custfcgi.pp
@@ -306,12 +306,19 @@ end;
{ TCGIResponse }
procedure TFCGIResponse.Write_FCGIRecord(ARecord : PFCGI_Header);
-var BytesToWrite : word;
+
+var BytesToWrite : Integer;
BytesWritten : Integer;
+ P : PByte;
begin
BytesToWrite := BEtoN(ARecord^.contentLength) + ARecord^.paddingLength+sizeof(FCGI_Header);
- BytesWritten := sockets.fpsend(TFCGIRequest(Request).Handle, ARecord, BytesToWrite, NoSignalAttr);
- Assert(BytesWritten=BytesToWrite);
+ P:=PByte(Arecord);
+ Repeat
+ BytesWritten := sockets.fpsend(TFCGIRequest(Request).Handle, P, BytesToWrite, NoSignalAttr);
+ Inc(P,BytesWritten);
+ Dec(BytesToWrite,BytesWritten);
+// Assert(BytesWritten=BytesToWrite);
+ until (BytesToWrite=0) or (BytesWritten=0);
end;
procedure TFCGIResponse.DoSendHeaders(Headers : TStrings);
@@ -351,7 +358,12 @@ begin
end;
procedure TFCGIResponse.DoSendContent;
+
+Const
+ MaxBuf = $EFFF;
+
var
+ bs,l : Integer;
cl : word;
pl : byte;
str : String;
@@ -367,24 +379,30 @@ begin
end
else
str := Contents.Text;
- cl := length(str);
- if ((cl mod 8)=0) or (poNoPadding in ProtocolOptions) then
- pl:=0
- else
- pl := 8-(cl mod 8);
- ARespRecord:=Nil;
- Getmem(ARespRecord,8+cl+pl);
- ARespRecord^.header.version:=FCGI_VERSION_1;
- ARespRecord^.header.reqtype:=FCGI_STDOUT;
- ARespRecord^.header.paddingLength:=pl;
- ARespRecord^.header.contentLength:=NtoBE(cl);
- ARespRecord^.header.requestId:=NToBE(TFCGIRequest(Request).RequestID);
- move(str[1],ARespRecord^.ContentData,cl);
-
- Write_FCGIRecord(PFCGI_Header(ARespRecord));
- Freemem(ARespRecord);
+ L:=Length(Str);
+ BS:=0;
+ Repeat
+ If (L-BS)>MaxBuf then
+ cl := MaxBuf
+ else
+ cl:=L-BS ;
+ if ((cl mod 8)=0) or (poNoPadding in ProtocolOptions) then
+ pl:=0
+ else
+ pl := 8-(cl mod 8);
+ ARespRecord:=Nil;
+ Getmem(ARespRecord,8+cl+pl);
+ ARespRecord^.header.version:=FCGI_VERSION_1;
+ ARespRecord^.header.reqtype:=FCGI_STDOUT;
+ ARespRecord^.header.paddingLength:=pl;
+ ARespRecord^.header.contentLength:=NtoBE(cl);
+ ARespRecord^.header.requestId:=NToBE(TFCGIRequest(Request).RequestID);
+ move(Str[BS+1],ARespRecord^.ContentData,cl);
+ Write_FCGIRecord(PFCGI_Header(ARespRecord));
+ Freemem(ARespRecord);
+ Inc(BS,cl);
+ Until (BS=L);
FillChar(EndRequest,SizeOf(FCGI_EndRequestRecord),0);
-
EndRequest.header.version:=FCGI_VERSION_1;
EndRequest.header.reqtype:=FCGI_END_REQUEST;
EndRequest.header.contentLength:=NtoBE(8);