/// <summary>
        /// Constructor for HttpClientRequestMessage.
        /// </summary>
        /// <param name="client">The client</param>
        /// <param name="args">The args</param>
        /// <param name="config">The config</param>
        public HttpClientRequestMessage(HttpClient client, DataServiceClientRequestMessageArgs args, DataServiceClientConfigurations config)
            : base(args.ActualMethod)
        {
            this.requestMessage = new HttpRequestMessage();

            // TODO, avoid create Memory Stream each time, consider object pooling
            this.messageStream = new MemoryStream();

            this.contentHeaderValueCache = new Dictionary <string, string>();

            foreach (var header in args.Headers)
            {
                this.SetHeader(header.Key, header.Value);
            }

            this.Url    = args.RequestUri;
            this.Method = args.Method;
            this.config = config;

            // link http and odata properties to share state between odata and http handlers

            /*
             * TODO: UNCOMMENT this after properties is supported
             * if (config.Properties != null)
             * {
             *  foreach (var item in config.Properties)
             *  {
             *      this.requestMessage.Properties[item.Key] = item.Value;
             *  }
             * }
             */

            this.client = client;
        }
        public void HeaderShouldBeCaseInsensitive()
        {
            HeaderCollection headers = new HeaderCollection();

            headers.SetHeader("Accept", MimeType);
            headers.SetHeader("Content-Type", MimeType);

            BuildingRequestEventArgs            requestEventArgs = new BuildingRequestEventArgs("GET", new Uri("http://localhost"), headers, null, HttpStack.Auto);
            DataServiceClientRequestMessageArgs args             = new DataServiceClientRequestMessageArgs(
                requestEventArgs.Method,
                requestEventArgs.RequestUri,
                false,
                false,
                requestEventArgs.Headers);

            HttpWebRequestMessage request      = new HttpWebRequestMessage(args);
            const int             maxPageSize  = 10;
            ODataPreferenceHeader preferHeader = new ODataPreferenceHeader(request);

            preferHeader.MaxPageSize = maxPageSize;

            Assert.Equal(maxPageSize, preferHeader.MaxPageSize);
            string expected = $"{MaxPageSizePreference}={maxPageSize}";

            Assert.Equal(expected, request.GetHeader("pReFer"));
            Assert.Equal(MimeType, request.GetHeader("accepT"));
        }
示例#3
0
 public TestHttpWebRequestMessage(DataServiceClientRequestMessageArgs args, IDictionary <string, string> headers, int statusCode, Func <Stream> getResponseStream)
     : base(args)
 {
     this.headers           = headers;
     this.statusCode        = statusCode;
     this.getResponseStream = getResponseStream;
 }
示例#4
0
        internal DataServiceClientRequestMessage ShimDataServiceRequest(DataServiceClientRequestMessageArgs args)
        {
            DataServiceClientRequestMessage message = null;

            message = (this._dataServiceHandler == null) ? new HttpWebRequestMessage(args) : this._dataServiceHandler(args);
            InitializeMessage(message);
            return(message);
        }
        public void TestHeaders(Dictionary <string, string> headers)
        {
            var client  = new HttpClient();
            var arg     = new DataServiceClientRequestMessageArgs("Get", new Uri("Http://localhost"), true, true, headers);
            var message = new HttpClientRequestMessage(client, arg, new DataServiceContext().Configurations);

            message.Headers.Should().BeEquivalentTo(headers);
        }
示例#6
0
        public void QueryWithFormat()
        {
            Dictionary <string, string> testCases = new Dictionary <string, string>()
            {
                { "People?$format=application/json", "application/json" },
                // ODL Bug: https://github.com/OData/odata.net/issues/313
                ////{"People?$format=application/json;odata.metadata=full", "application/json; odata.metadata=full"},
                { "People?$format=json", "application/json" },
            };

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri,
                UndeclaredPropertyBehaviorKinds = ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty
            };

            foreach (var testCase in testCases)
            {
                DataServiceClientRequestMessageArgs args = new DataServiceClientRequestMessageArgs(
                    "GET",
                    new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute),
                    false, false, new Dictionary <string, string>()
                {
                });

                var requestMessage = new HttpWebRequestMessage(args);
                using (var responseMessage = requestMessage.GetResponse() as HttpWebResponseMessage)
                {
                    Assert.Equal(200, responseMessage.StatusCode);

                    string contentType = responseMessage.Headers.FirstOrDefault(x => x.Key.Equals("Content-Type")).Value;
                    Assert.True(contentType.StartsWith(testCase.Value));

                    using (var messageReader = new ODataMessageReader(
                               responseMessage,
                               readerSettings,
                               this.TestClientContext.Format.LoadServiceModel()))
                    {
                        var reader = messageReader.CreateODataFeedReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.EntryEnd)
                            {
                                ODataEntry entry = reader.Item as ODataEntry;
                                Assert.NotNull(entry.Properties.Single(p => p.Name == "PersonId").Value);
                            }
                            else if (reader.State == ODataReaderState.FeedEnd)
                            {
                                Assert.NotNull(reader.Item as ODataFeed);
                            }
                        }

                        Assert.Equal(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
        public void TestBasic(string method, string requestUri)
        {
            var client  = new HttpClient();
            var arg     = new DataServiceClientRequestMessageArgs(method, new Uri(requestUri), true, true, new Dictionary <string, string>());
            var message = new HttpClientRequestMessage(client, arg, new DataServiceContext().Configurations);

            message.Method.Should().Be(method);
            message.Url.Should().Be(requestUri);
        }
        public ShimDataServiceClientRequestMessage(ShimController controller, DataServiceClientRequestMessageArgs args)
            : base(args.Method)
        {
            OriginalMessageArgs = args;

            ShimWebRequest = new ShimDataRequestMessage(args);

            _controller = controller;
        }
示例#9
0
        public void SetUserAgentShouldSucceed()
        {
            HttpRequestMessage                  request = new HttpRequestMessage(HttpMethod.Get, "http://www.svc");
            IDictionary <string, string>        Headers = new Dictionary <string, string>();
            DataServiceClientRequestMessageArgs args    = new DataServiceClientRequestMessageArgs(request.Method.ToString(), request.RequestUri, true, false, Headers);

            new HttpClientRequestMessage(args).SetHeader(XmlConstants.HttpUserAgent, "MyUserAgent");
            new HttpWebRequestMessage(args).SetHeader(XmlConstants.HttpUserAgent, "MyUserAgent");
        }
示例#10
0
        public void SetContentLengthShouldSucceed()
        {
            HttpRequestMessage                  request = new HttpRequestMessage(HttpMethod.Get, "http://www.svc");
            IDictionary <string, string>        Headers = new Dictionary <string, string>();
            DataServiceClientRequestMessageArgs args    = new DataServiceClientRequestMessageArgs(request.Method.ToString(), request.RequestUri, true, false, Headers);

            new HttpClientRequestMessage(args).SetHeader(XmlConstants.HttpContentLength, 1.ToString(CultureInfo.InvariantCulture.NumberFormat));
            new HttpWebRequestMessage(args).SetHeader(XmlConstants.HttpContentLength, 1.ToString(CultureInfo.InvariantCulture.NumberFormat));
        }
        public ShimDataServiceClientRequestMessage(ShimController controller, DataServiceClientRequestMessageArgs args)
            : base(args.Method)
        {
            OriginalMessageArgs = args;

            ShimWebRequest = new ShimDataRequestMessage(args);

            _controller = controller;
        }
示例#12
0
        public void SetAcceptCharsetShouldNotBeSetOnSilverlightAndSetOnOtherPlatforms()
        {
            HttpRequestMessage                  request = new HttpRequestMessage(HttpMethod.Get, "http://www.svc");
            IDictionary <string, string>        Headers = new Dictionary <string, string>();
            DataServiceClientRequestMessageArgs args    = new DataServiceClientRequestMessageArgs(request.Method.ToString(), request.RequestUri, true, false, Headers);

            new HttpClientRequestMessage(args).SetHeader(XmlConstants.HttpAcceptCharset, "utf8");
            new HttpWebRequestMessage(args).SetHeader(XmlConstants.HttpAcceptCharset, "utf8");
        }
        private static HttpWebRequest CreateRequest(string method, Uri requestUrl, DataServiceClientRequestMessageArgs args)
        {
            HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(requestUrl);

            // KeepAlive not available
            httpRequest.KeepAlive = true;
            httpRequest.Method    = method;
            return(httpRequest);
        }
        /// <summary>
        /// A Factory class to use in selecting the implementation to use depending on the
        /// </summary>
        /// <param name="args"></param>
        /// <param name="dataServiceContext"></param>
        /// <returns></returns>

        public DataServiceClientRequestMessage CreateRequestMessage(DataServiceClientRequestMessageArgs args, DataServiceContext dataServiceContext)
        {
            if (dataServiceContext.HttpRequestTransportMode == HttpRequestTransportMode.HttpWebRequest)
            {
                return(new HttpWebRequestMessage(args));
            }
            else
            {
                return(new HttpClientRequestMessage(args));
            }
        }
        public CustomizedRequestMessage(DataServiceClientRequestMessageArgs args, ConnectionProperties properties) : base(args)
        {
            HttpWebRequest.Proxy = properties.GetWebProxy();
            HttpWebRequest.Headers.Add(properties.GetCustomHeaders());

            var cert = properties.GetClientCertificate();

            if (cert != null)
            {
                HttpWebRequest.ClientCertificates.Add(cert);
            }
        }
        DataServiceClientRequestMessage ctx_OnMessageCreating(DataServiceClientRequestMessageArgs args)
        {
            if (_workaroundDateTimeQuery != null)
            {
                args = new DataServiceClientRequestMessageArgs("GET", new Uri(_workaroundDateTimeQuery), false, false, new Dictionary <string, string>());
                _workaroundDateTimeQuery = null;
            }
            HttpClientRequestMessage clientRequestMessage = new HttpClientRequestMessage(args);

            clientRequestMessage.Credentials = CredentialCache.DefaultCredentials;
            return(clientRequestMessage);
        }
示例#17
0
 public TestHttpWebRequestMessage(
     DataServiceClientRequestMessageArgs args,
     Action <HttpWebRequestMessage> sendRequest,
     Action <HttpWebResponseMessage> sendResponse,
     Func <Stream, Stream> wrapRequestStream,
     Func <Stream, Stream> wrapResponseStream) : base(args)
 {
     this.SendRequest        = sendRequest;
     this.SendResponse       = sendResponse;
     this.WrapRequestStream  = wrapRequestStream;
     this.WrapResponseStream = wrapResponseStream;
 }
示例#18
0
        DataServiceClientRequestMessage ctx_OnMessageCreating(DataServiceClientRequestMessageArgs args)
        {
            if (_workaroundDateTimeQuery != null)
            {
                args = new DataServiceClientRequestMessageArgs("GET", new Uri(_workaroundDateTimeQuery), false, false, new Dictionary <string, string>());
                _workaroundDateTimeQuery = null;
            }
            HttpWebRequestMessage webRequestMessage = new HttpWebRequestMessage(args);

            webRequestMessage.HttpWebRequest.UseDefaultCredentials = true;
            return(webRequestMessage);
        }
            protected virtual InMemoryMessage CreateRequestMessage(DataServiceClientRequestMessageArgs requestMessageArgs)
            {
                var requestMessage = new InMemoryMessage {
                    Url = requestMessageArgs.RequestUri, Method = requestMessageArgs.Method, Stream = new MemoryStream()
                };

                foreach (var header in requestMessageArgs.Headers)
                {
                    requestMessage.SetHeader(header.Key, header.Value);
                }

                return(requestMessage);
            }
示例#20
0
        /// <summary>
        /// A Factory class to use in selecting the implementation to use depending on the
        /// </summary>
        /// <param name="args"></param>
        /// <param name="dataServiceContext"></param>
        /// <returns></returns>

        public DataServiceClientRequestMessage CreateRequestMessage(DataServiceClientRequestMessageArgs args, DataServiceContext dataServiceContext)
        {
            if (dataServiceContext.HttpRequestTransportMode == HttpRequestTransportMode.HttpWebRequest)
            {
#pragma warning disable CS0618 // Type or member is obsolete
                return(new HttpWebRequestMessage(args));

#pragma warning restore CS0618 // Type or member is obsolete
            }
            else
            {
                return(new HttpClientRequestMessage(args));
            }
        }
示例#21
0
        /// <summary>
        /// Creates an instance of the IODataRequestMessage
        /// </summary>
        /// <param name="requestMessageArgs">Arguments for creating the request message.</param>
        /// <returns>an instance of the IODataRequestMessage </returns>
        internal DataServiceClientRequestMessage CreateMessage(DataServiceClientRequestMessageArgs requestMessageArgs)
        {
            var requestMessage = this.getRequestMessage();

            requestMessage.Url    = requestMessageArgs.RequestUri;
            requestMessage.Method = requestMessageArgs.Method;

            foreach (var header in requestMessageArgs.Headers)
            {
                requestMessage.SetHeader(header.Key, header.Value);
            }

            return(new TestDataServiceClientRequestMessage(requestMessage, getResponseMessage));
        }
示例#22
0
        internal DataServiceClientRequestMessage ShimDataServiceRequest(DataServiceClientRequestMessageArgs args)
        {
            DataServiceClientRequestMessage message = null;

            if (_dataServiceHandler != null)
            {
                message = _dataServiceHandler(args);
            }
            else
            {
                message = new HttpWebRequestMessage(args);
            }

            return(message);
        }
        /// <summary>
        /// Constructor for HttpClientRequestMessage.
        /// Initializes the <see cref="HttpClientRequestMessage"/> class.
        /// The args.ActualMethod is the actual method. In post tunneling situations method will be POST instead of the specified verb method.
        /// The args.method is the specified verb method
        /// </summary>
        /// </summary>
        public HttpClientRequestMessage(DataServiceClientRequestMessageArgs args)
            : base(args.ActualMethod)
        {
            _messageStream           = new MemoryStream();
            _handler                 = new HttpClientHandler();
            _client                  = new HttpClient(_handler, disposeHandler: true);
            _contentHeaderValueCache = new Dictionary <string, string>();
            _effectiveHttpMethod     = args.Method;
            _requestUrl              = args.RequestUri;
            _requestMessage          = new HttpRequestMessage(new HttpMethod(this.ActualMethod), _requestUrl);

            // Now set the headers.
            foreach (KeyValuePair <string, string> keyValue in args.Headers)
            {
                this.SetHeader(keyValue.Key, keyValue.Value);
            }
        }
示例#24
0
文件: HttpShim.cs 项目: rikoe/nuget
        internal DataServiceClientRequestMessage ShimDataServiceRequest(DataServiceClientRequestMessageArgs args)
        {
            DataServiceClientRequestMessage message = null;

            if (_dataServiceHandler != null)
            {
                message = _dataServiceHandler(args);
            }
            else
            {
                message = new HttpWebRequestMessage(args);
            }

            // apply proxy and credential settings on the core web request
            InitializeMessage(message);

            return message;
        }
示例#25
0
        internal DataServiceClientRequestMessage ShimDataServiceRequest(DataServiceClientRequestMessageArgs args)
        {
            DataServiceClientRequestMessage message = null;

            if (_dataServiceHandler != null)
            {
                message = _dataServiceHandler(args);
            }
            else
            {
                message = new HttpWebRequestMessage(args);
            }

            // apply proxy and credential settings on the core web request
            InitializeMessage(message);

            return(message);
        }
示例#26
0
        public void HttpMergeIsNoLongerSupported()
        {
            Func <DataServiceClientRequestMessageArgs, DataServiceClientRequestMessage> addHeader =
                (args) =>
            {
                if (args.Method == "PATCH")
                {
                    // use Merge
                    var newArgs = new DataServiceClientRequestMessageArgs("MERGE", args.RequestUri, true, args.UsePostTunneling, args.Headers);
                    // use V4 since Merge is removed only in V4
                    newArgs.Headers["DataServiceVersion"] = "4.0";

                    return(new HttpWebRequestMessage(newArgs));
                }
                return(new HttpWebRequestMessage(args));
            };

            var ctx = this.CreateContext(addHeader);

            Product product = null;
            var     query   = ctx.Context.Product.Take(1) as DataServiceQuery <Product>;
            var     ar      = query.BeginExecute(null, null).EnqueueWait(this);

            product = query.EndExecute(ar).Single();

            product.Description = "New Description " + Guid.NewGuid().ToString();
            ctx.UpdateObject(product);

            try
            {
                var ar2 = ctx.BeginSaveChanges(null, null).EnqueueWait(this);
                ctx.EndSaveChanges(ar2);
                Assert.Fail("Expected error not thrown");
            }
            catch (DataServiceRequestException e)
            {
#if !PORTABLELIB && !SILVERLIGHT
                StringResourceUtil.VerifyDataServicesClientString(e.Message, "DataServiceException_GeneralError");
#else
                Assert.IsNotNull(e);
#endif
            }
        }
        public HttpWebRequestMessage(DataServiceClientRequestMessageArgs args)
            : base(args.ActualMethod)
        {
            Util.CheckArgumentNull(args, "args");
            Debug.Assert(args.RequestUri.IsAbsoluteUri, "request uri is not absolute uri");
            Debug.Assert(
                args.RequestUri.Scheme.Equals("http", StringComparison.OrdinalIgnoreCase) ||
                args.RequestUri.Scheme.Equals("https", StringComparison.OrdinalIgnoreCase),
                "request uri is not for HTTP");
            this.effectiveHttpMethod = args.Method;
            this.requestUrl          = args.RequestUri;

            this.httpRequest = HttpWebRequestMessage.CreateRequest(this.ActualMethod, this.Url, args);

            // Now set the headers.
            foreach (var keyValue in args.Headers)
            {
                this.SetHeader(keyValue.Key, keyValue.Value);
            }
        }
        public DataServiceClientRequestMessage ShimDataService(DataServiceClientRequestMessageArgs args)
        {
            DataServiceClientRequestMessage message = null;

            InterceptDispatcher dispatcher = GetDispatcher(args.RequestUri);

            if (dispatcher != null && dispatcher.Initialized == true)
            {
                // Let the interceptor handle this
                message = new ShimDataServiceClientRequestMessage(this, args);
            }

            // If no interceptors want the message create a normal HttpWebRequestMessage
            if (message == null)
            {
                V3InteropTraceSources.ShimController.Verbose("request", "{0} {1}", args.Method, args.RequestUri.AbsoluteUri);
                message = new HttpWebRequestMessage(args);
            }

            return(message);
        }
示例#29
0
        /// <summary>
        /// Entry point for requests from OData.
        /// </summary>
        public DataServiceClientRequestMessage ShimDataService(DataServiceClientRequestMessageArgs args)
        {
            DataServiceClientRequestMessage message = null;

            InterceptDispatcher dispatcher = GetDispatcher(args.RequestUri);

            if (dispatcher != null && dispatcher.Initialized == true)
            {
                // Let the interceptor handle this
                message = new ShimDataServiceClientRequestMessage(this, args);
            }

            // If no interceptors want the message create a normal HttpWebRequestMessage
            if (message == null)
            {
                Log(String.Format(CultureInfo.InvariantCulture, "[V2 REQ] {0}", args.RequestUri.AbsoluteUri), ConsoleColor.Gray);
                message = new HttpWebRequestMessage(args);
            }

            return(message);
        }
示例#30
0
        public void ChangeMergeToPatch()
        {
            Func <DataServiceClientRequestMessageArgs, DataServiceClientRequestMessage> addHeader =
                (args) =>
            {
                if (args.Method == "MERGE")
                {
                    var newArgs = new DataServiceClientRequestMessageArgs("PATCH", args.RequestUri, true, args.UsePostTunneling, args.Headers);

                    // PATCH verb not supported in V1 or V2
                    newArgs.Headers.Remove("DataServiceVersion");
                    newArgs.Headers.Add("DataServiceVersion", "3.0");

                    return(new HttpWebRequestMessage(newArgs));
                }

                return(new HttpWebRequestMessage(args));
            };

            var ctx = this.CreateContext(addHeader);

            Product product = null;
            var     query   = ctx.Context.Product.Take(1) as DataServiceQuery <Product>;
            var     ar      = query.BeginExecute(null, null).EnqueueWait(this);

            product = query.EndExecute(ar).Single();

            this.lastRequestMessage = null;

            product.Description = "New Description " + Guid.NewGuid().ToString();
            ctx.UpdateObject(product);

            var ar2 = ctx.BeginSaveChanges(null, null).EnqueueWait(this);

            ctx.EndSaveChanges(ar2);

            Assert.IsNotNull(this.lastRequestMessage, "No request sent");
            Assert.AreEqual("PATCH", this.lastRequestMessage.Method);
        }
示例#31
0
        public ShimDataRequestMessage(DataServiceClientRequestMessageArgs args)
        {
            WebRequest = ShimWebHelpers.AddHeaders(HttpWebRequest.CreateHttp(args.RequestUri), args.Headers);

            WebRequest.Method = args.Method;
        }
示例#32
0
 public CustomizedRequestMessage(DataServiceClientRequestMessageArgs args, IWebProxy webProxy) : base(args)
 {
     HttpWebRequest.Proxy = webProxy;
 }
 public AnnotationRequestMessage(DataServiceClientRequestMessageArgs args, string response, Dictionary<string, string> headers)
     : base(args)
 {
     this.Response = response;
     this.CutomizedHeaders = headers;
 }
 public EntityParameterRequestMessage(DataServiceClientRequestMessageArgs args, byte[] buffer)
     : base(args)
 {
     this.stream = new MemoryStream(buffer);
     this.headers = new HeaderCollection();
 }
示例#35
0
        public DataServiceClientRequestMessage ShimDataService(DataServiceClientRequestMessageArgs args)
        {
            DataServiceClientRequestMessage message = null;

            InterceptDispatcher dispatcher = GetDispatcher(args.RequestUri);

            if (dispatcher != null && dispatcher.Initialized == true)
            {
                // Let the interceptor handle this
                message = new ShimDataServiceClientRequestMessage(this, args);
            }

            // If no interceptors want the message create a normal HttpWebRequestMessage
            if (message == null)
            {
                V3InteropTraceSources.ShimController.Verbose("request", "{0} {1}", args.Method, args.RequestUri.AbsoluteUri);
                message = new HttpWebRequestMessage(args);
            }

            return message;
        }
示例#36
0
        /// <summary>
        /// Entry point for requests from OData.
        /// </summary>
        public DataServiceClientRequestMessage ShimDataService(DataServiceClientRequestMessageArgs args)
        {
            DataServiceClientRequestMessage message = null;

            InterceptDispatcher dispatcher = GetDispatcher(args.RequestUri);

            if (dispatcher != null && dispatcher.Initialized == true)
            {
                // Let the interceptor handle this
                message = new ShimDataServiceClientRequestMessage(this, args);
            }

            // If no interceptors want the message create a normal HttpWebRequestMessage
            if (message == null)
            {
                Log(String.Format(CultureInfo.InvariantCulture, "[V2 REQ] {0}", args.RequestUri.AbsoluteUri), ConsoleColor.Gray);
                message = new HttpWebRequestMessage(args);
            }

            return message;
        }