public bool ParseFormAndFiles(IRequestStream request) { if(HasResult) return false; fields = new NameValueCollection(); files = new BasicHttpFileCollection(); var conentType = request.ContentType; if(conentType == null) return false; if(conentType.StartsWith(ContentTypeFormUrlEncoded)) WithBodyBytes(request, ParseFormUrlEncoded); else if(conentType.StartsWith(ContentTypeMultipartFormData)) ParseMultiPart(request); else return false; return true; }
void ParseMultiPart(IRequestStream request) { var multiPartStream = new MultiPartStream(GetBoundary(request.ContentType)); multiPartStream.PartReady += (sender, e) => { var disposition = e.Part["Content-Disposition"]; var name = NamePattern.Match(disposition).Groups["name"].Value; var hasFileName = FilenamePattern.Match(disposition); if(hasFileName.Success) files.Add(name, new BasicHttpPostedFile( hasFileName.Groups["filename"].Value, e.Part["Content-Type"], e.Part.Body)); else fields.Add(name, e.Part.GetBodyText(Encoding.UTF8)); }; multiPartStream.Read(request.InputStream, request.ContentLength); }
void WithBodyBytes(IRequestStream request, Action<byte[], int> action) { var bytes = new byte[request.ContentLength]; action(bytes, request.InputStream.ReadBlock(bytes, 0, bytes.Length)); }