internal MimePartData <IHttpRequest> BuildRequestFromPart(MimePartData <byte[]> mimePart, Encoding encoding) { var requestData = CreateRequest(mimePart.Body, encoding); var odataUri = new ODataUri(new UnrecognizedSegment(requestData.Uri.OriginalString)); var odataRequest = this.RequestManager.BuildRequest(odataUri, requestData.Verb, requestData.Headers); string contentType; if (requestData.TryGetHeaderValueIgnoreHeaderCase(HttpHeaders.ContentType, out contentType)) { var formatStrategy = this.FormatSelector.GetStrategy(contentType, odataUri); var deserializer = formatStrategy.GetDeserializer(); var rootElement = deserializer.DeserializeFromBinary(requestData.Body, ODataPayloadContext.BuildPayloadContextFromRequest(odataRequest)); odataRequest.Body = new ODataPayloadBody(requestData.Body, rootElement); } else if (requestData.Body != null) { odataRequest.Body = new ODataPayloadBody(requestData.Body, new PrimitiveValue(null, requestData.Body)); } var rebuiltPart = new MimePartData <IHttpRequest>(); rebuiltPart.Headers.AddRange(mimePart.Headers); rebuiltPart.Body = odataRequest; return(rebuiltPart); }
internal MimePartData <HttpResponseData> BuildResponseFromPart(MimePartData <byte[]> mimePart, IMimePart currentRequestPart, Encoding encoding) { var odataRequest = currentRequestPart as ODataRequest; HttpResponseData responsePart = CreateResponse(mimePart.Body, encoding); if (odataRequest != null) { responsePart = this.RequestManager.BuildResponse(odataRequest, responsePart); } var rebuiltPart = new MimePartData <HttpResponseData>(); rebuiltPart.Headers.AddRange(mimePart.Headers); rebuiltPart.Body = responsePart; return(rebuiltPart); }
/// <summary> /// Adds a part to the batch payload /// </summary> /// <param name="part">The part to add</param> public void Add(MimePartData <TOperation> part) { this.mimeData.Add(part); }
internal MimePartData<HttpResponseData> BuildResponseFromPart(MimePartData<byte[]> mimePart, IMimePart currentRequestPart, Encoding encoding) { var odataRequest = currentRequestPart as ODataRequest; HttpResponseData responsePart = CreateResponse(mimePart.Body, encoding); if (odataRequest != null) { responsePart = this.RequestManager.BuildResponse(odataRequest, responsePart); } var rebuiltPart = new MimePartData<HttpResponseData>(); rebuiltPart.Headers.AddRange(mimePart.Headers); rebuiltPart.Body = responsePart; return rebuiltPart; }
internal MimePartData<IHttpRequest> BuildRequestFromPart(MimePartData<byte[]> mimePart, Encoding encoding) { var requestData = CreateRequest(mimePart.Body, encoding); var odataUri = new ODataUri(new UnrecognizedSegment(requestData.Uri.OriginalString)); var odataRequest = this.RequestManager.BuildRequest(odataUri, requestData.Verb, requestData.Headers); string contentType; if (requestData.TryGetHeaderValueIgnoreHeaderCase(HttpHeaders.ContentType, out contentType)) { var formatStrategy = this.FormatSelector.GetStrategy(contentType, odataUri); var deserializer = formatStrategy.GetDeserializer(); var rootElement = deserializer.DeserializeFromBinary(requestData.Body, ODataPayloadContext.BuildPayloadContextFromRequest(odataRequest)); odataRequest.Body = new ODataPayloadBody(requestData.Body, rootElement); } else if (requestData.Body != null) { odataRequest.Body = new ODataPayloadBody(requestData.Body, new PrimitiveValue(null, requestData.Body)); } var rebuiltPart = new MimePartData<IHttpRequest>(); rebuiltPart.Headers.AddRange(mimePart.Headers); rebuiltPart.Body = odataRequest; return rebuiltPart; }
internal static void PopulateHeadersAndBody(MimePartData<byte[]> part, byte[] bufferToReadFrom, Encoding encoding) { ReadHeaders(ref bufferToReadFrom, part, encoding); part.Body = bufferToReadFrom; }
internal static bool TrySplitMimePart(MimePartData<byte[]> part, Encoding encoding, out MultipartMimeData<MimePartData<byte[]>> multipart) { string boundary; if (!part.TryGetMimeBoundary(out boundary)) { multipart = null; return false; } multipart = new MultipartMimeData<MimePartData<byte[]>>(); multipart.Headers.AddRange(part.Headers); var body = part.Body; ExceptionUtilities.CheckObjectNotNull(body, "Body cannot be null"); byte[] boundaryBytes = encoding.GetBytes(boundary); byte[] newlineBytes = encoding.GetBytes("\r\n"); byte[] controlBytes = encoding.GetBytes("--"); while (EndsWithPattern(body, newlineBytes)) { body = body.Take(body.Length - newlineBytes.Length).ToArray(); } byte[] firstBoundaryBytes = controlBytes.Concat(boundaryBytes).Concat(newlineBytes).ToArray(); byte[] innerBoundaryBytes = newlineBytes.Concat(controlBytes).Concat(boundaryBytes).Concat(newlineBytes).ToArray(); byte[] finalBoundaryBytesWithoutFirstNewLine = controlBytes.Concat(boundaryBytes).Concat(controlBytes).ToArray(); byte[] finalBoundaryBytes = newlineBytes.Concat(finalBoundaryBytesWithoutFirstNewLine).ToArray(); int firstBoundaryStart = IndexOfPattern(body, firstBoundaryBytes, 0); if (firstBoundaryStart == -1) { // Possibly an empty changeset - empty multipart can be represented as just the end boundary int finalBoundaryStart = IndexOfPattern(body, finalBoundaryBytesWithoutFirstNewLine, 0); ExceptionUtilities.Assert(finalBoundaryStart == 0, "Malformed"); ExceptionUtilities.Assert(EndsWithPattern(body, finalBoundaryBytesWithoutFirstNewLine), "Malformed"); return true; } ExceptionUtilities.Assert(firstBoundaryStart == 0, "Malformed"); ExceptionUtilities.Assert(EndsWithPattern(body, finalBoundaryBytes), "Malformed"); int currentBoundaryEnd = firstBoundaryStart + firstBoundaryBytes.Length; while (currentBoundaryEnd < body.Length) { int nextBoundaryStart = IndexOfPattern(body, innerBoundaryBytes, currentBoundaryEnd); int nextBoundaryEnd = nextBoundaryStart + innerBoundaryBytes.Length; if (nextBoundaryStart < 0) { nextBoundaryStart = IndexOfPattern(body, finalBoundaryBytes, currentBoundaryEnd); nextBoundaryEnd = nextBoundaryStart + finalBoundaryBytes.Length; ExceptionUtilities.Assert(nextBoundaryStart != 0, "Malformed"); ExceptionUtilities.Assert(nextBoundaryStart + finalBoundaryBytes.Length == body.Length, "Malformed"); } var fragment = body.Skip(currentBoundaryEnd).Take(nextBoundaryStart - currentBoundaryEnd).ToArray(); var subPart = new MimePartData<byte[]>(); if (fragment.Length > 0) { PopulateHeadersAndBody(subPart, fragment, encoding); multipart.Add(subPart); } currentBoundaryEnd = nextBoundaryEnd; } return true; }
internal static void PopulateHeadersAndBody(MimePartData <byte[]> part, byte[] bufferToReadFrom, Encoding encoding) { ReadHeaders(ref bufferToReadFrom, part, encoding); part.Body = bufferToReadFrom; }
internal static bool TrySplitMimePart(MimePartData <byte[]> part, Encoding encoding, out MultipartMimeData <MimePartData <byte[]> > multipart) { string boundary; if (!part.TryGetMimeBoundary(out boundary)) { multipart = null; return(false); } multipart = new MultipartMimeData <MimePartData <byte[]> >(); multipart.Headers.AddRange(part.Headers); var body = part.Body; ExceptionUtilities.CheckObjectNotNull(body, "Body cannot be null"); byte[] boundaryBytes = encoding.GetBytes(boundary); byte[] newlineBytes = encoding.GetBytes("\r\n"); byte[] controlBytes = encoding.GetBytes("--"); while (EndsWithPattern(body, newlineBytes)) { body = body.Take(body.Length - newlineBytes.Length).ToArray(); } byte[] firstBoundaryBytes = controlBytes.Concat(boundaryBytes).Concat(newlineBytes).ToArray(); byte[] innerBoundaryBytes = newlineBytes.Concat(controlBytes).Concat(boundaryBytes).Concat(newlineBytes).ToArray(); byte[] finalBoundaryBytesWithoutFirstNewLine = controlBytes.Concat(boundaryBytes).Concat(controlBytes).ToArray(); byte[] finalBoundaryBytes = newlineBytes.Concat(finalBoundaryBytesWithoutFirstNewLine).ToArray(); int firstBoundaryStart = IndexOfPattern(body, firstBoundaryBytes, 0); if (firstBoundaryStart == -1) { // Possibly an empty changeset - empty multipart can be represented as just the end boundary int finalBoundaryStart = IndexOfPattern(body, finalBoundaryBytesWithoutFirstNewLine, 0); ExceptionUtilities.Assert(finalBoundaryStart == 0, "Malformed"); ExceptionUtilities.Assert(EndsWithPattern(body, finalBoundaryBytesWithoutFirstNewLine), "Malformed"); return(true); } ExceptionUtilities.Assert(firstBoundaryStart == 0, "Malformed"); ExceptionUtilities.Assert(EndsWithPattern(body, finalBoundaryBytes), "Malformed"); int currentBoundaryEnd = firstBoundaryStart + firstBoundaryBytes.Length; while (currentBoundaryEnd < body.Length) { int nextBoundaryStart = IndexOfPattern(body, innerBoundaryBytes, currentBoundaryEnd); int nextBoundaryEnd = nextBoundaryStart + innerBoundaryBytes.Length; if (nextBoundaryStart < 0) { nextBoundaryStart = IndexOfPattern(body, finalBoundaryBytes, currentBoundaryEnd); nextBoundaryEnd = nextBoundaryStart + finalBoundaryBytes.Length; ExceptionUtilities.Assert(nextBoundaryStart != 0, "Malformed"); ExceptionUtilities.Assert(nextBoundaryStart + finalBoundaryBytes.Length == body.Length, "Malformed"); } var fragment = body.Skip(currentBoundaryEnd).Take(nextBoundaryStart - currentBoundaryEnd).ToArray(); var subPart = new MimePartData <byte[]>(); if (fragment.Length > 0) { PopulateHeadersAndBody(subPart, fragment, encoding); multipart.Add(subPart); } currentBoundaryEnd = nextBoundaryEnd; } return(true); }