Browse Source

* Fixed sending/receiving of large data packets (size >word)

git-svn-id: trunk@16232 -
michael 15 years ago
parent
commit
791cb74f22
1 changed files with 38 additions and 20 deletions
  1. 38 20
      packages/fcl-web/src/base/custfcgi.pp

+ 38 - 20
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);