示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
 /// <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;
        }
示例#8
0
 internal static void PopulateHeadersAndBody(MimePartData <byte[]> part, byte[] bufferToReadFrom, Encoding encoding)
 {
     ReadHeaders(ref bufferToReadFrom, part, encoding);
     part.Body = bufferToReadFrom;
 }
示例#9
0
        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);
        }