Hallo,
In unserer ISAPI Application haben wir den enctype geaendert um die Moeglichkeit des Datei Upload einzubauen.
Fuer das neue Handling des TWRequest habe ich einen Parser gebaut der sich den Request anschaut und der beim auftreten eine File Dowloads ein eigene Routine dafuer startet.
Nun habe ich in unseren Logfiles festgestellt dass es immer wieder zu "Out of Memory" Problemen kommt. Ich habe diesen Fehler noch nie selbst erlebt, da er unvorhersehbar mehrmals am Tag auftreten kann (oder auch nicht :-( ).
Wir verwenden IIS 6.0, Delphi 7.0, MS 2003 Server und haben ca. 1500 Zugriffe/Tag.
Vielleicht sieht einer von euch ja die wahrscheinlich offene Schwachstelle...
Aber ich befuerchte ich muss mich tiefer in die Speicherverwaltung von IIS einarbeiten und den Fehler zu lokalisieren :-(
Ich bin fuer jede Hilfe Dankbar.
LG Niels
In unserer ISAPI Application haben wir den enctype geaendert um die Moeglichkeit des Datei Upload einzubauen.
Fuer das neue Handling des TWRequest habe ich einen Parser gebaut der sich den Request anschaut und der beim auftreten eine File Dowloads ein eigene Routine dafuer startet.
Nun habe ich in unseren Logfiles festgestellt dass es immer wieder zu "Out of Memory" Problemen kommt. Ich habe diesen Fehler noch nie selbst erlebt, da er unvorhersehbar mehrmals am Tag auftreten kann (oder auch nicht :-( ).
Wir verwenden IIS 6.0, Delphi 7.0, MS 2003 Server und haben ca. 1500 Zugriffe/Tag.
Vielleicht sieht einer von euch ja die wahrscheinlich offene Schwachstelle...
Aber ich befuerchte ich muss mich tiefer in die Speicherverwaltung von IIS einarbeiten und den Fehler zu lokalisieren :-(
Code:
function Test.GetWebrequestContent(Request : TWebRequest) : TStrings; const BufferSize = 8192; var TotalBytes, ExtraBytes, ExtraBytesRead, BytesRead : Integer; pBuffer, pExtBuffer, pFreeBuff : PChar; ContentStrm : TMemoryStream; //Request.Content will be written to it! l, p: Word; Boundary, ContentType: String; begin TRY //Boundary l := length(Request.ContentType); p := Pos('boundary=', Request.ContentType) + 9; Boundary := copy(Request.ContentType, p, l); //ContentType ContentType := copy(Request.ContentType, 1, p - 12); // Total Size of content (even oversized > 48 KByte) TotalBytes := Request.ContentLength; //Is Form Data available? if TotalBytes > 0 then begin GetMem(pBuffer, TotalBytes + 2); pBuffer^ := Char(0); pFreeBuff := pBuffer; //6.6.6 ContentStrm := TMemoryStream.Create; TRY BytesRead := TISAPIRequest(Request).ECB.cbAvailable; pBuffer := TISAPIRequest(Request).ECB.lpbData; ContentStrm.Write(pBuffer^, BytesRead); ExtraBytes := TotalBytes - BytesRead; if ExtraBytes > 0 then begin GetMem(pExtBuffer, ExtraBytes + 2); pExtBuffer^ := Chr(0); repeat ExtraBytesRead := Request.ReadClient(pExtBuffer^, BufferSize); ContentStrm.Write(pExtBuffer^, ExtraBytesRead); Inc(BytesRead, ExtraBytesRead); until ((BytesRead = Request.ContentLength) OR (ExtraBytesRead <= 0)); end; //Now lets parse the content for the form fields entries and transform then into TString (except the attached files) (private external function) Result := ParseWebRequest(ContentStrm, Boundary); FINALLY ContentStrm.Free; if pFreeBuff <> NIL then FreeMem(pFreeBuff, TotalBytes + 2); If pExtBuffer <> NIL then //6.6.6 FreeMem(pExtBuffer, ExtraBytes + 2); END; end else result := Request.ContentFields; EXCEPT on E : Exception do begin writeErrorline('FH10', 'Error in ParseWebRequestContent. ContentFields: ' + Request.Contentfields.GetText + ' Reason: ' + E.Message + '|' + IntToStr(E.HelpContext)); end; END; end;
LG Niels