コード例 #1
0
        private JObject GetBodyParameter(DownstreamRequest request, HttpRequest httpRequest)
        {
            var requestContentType = httpRequest.GetTypedHeaders().ContentType;

            if (requestContentType?.MediaType != "application/json")
            {
                return(new JObject());
            }

            request.Scheme = "http";
            var requestMessage = request.ToHttpRequestMessage();

            request.Scheme = "orleans";
            if (requestMessage.Content == null)
            {
                return(new JObject());
            }

            // parse encoding
            // default to UTF8
            var encoding = httpRequest.GetTypedHeaders().ContentType.Encoding ?? Encoding.UTF8;
            var stream   = requestMessage.Content.ReadAsStreamAsync().Result;

            using (var reader = new JsonTextReader(new StreamReader(stream, encoding)))
            {
                reader.CloseInput = false;
                return(JObject.Load(reader));
            }
        }
コード例 #2
0
        private void GivenCacheKeyFromContext(DownstreamRequest downstreamRequest)
        {
            string generatedCacheKey = _cacheKeyGenerator.GenerateRequestCacheKey(downstreamRequest);
            string cachekey          = MD5Helper.GenerateMd5("GET-https://some.url/blah?abcd=123");

            generatedCacheKey.ShouldBe(cachekey);
        }
コード例 #3
0
 public AddQueriesToRequestTests()
 {
     _request             = new HttpRequestMessage(HttpMethod.Post, "http://my.url/abc?q=123");
     _parser              = new Mock <IClaimsParser>();
     _addQueriesToRequest = new AddQueriesToRequest(_parser.Object);
     _downstreamRequest   = new DownstreamRequest(_request);
 }
コード例 #4
0
        public void should_return_key_does_not_exist_for_http_request_message()
        {
            var request = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://west.com"));
            var result  = _placeholders.Get("{Test}", request);

            result.IsError.ShouldBeTrue();
            result.Errors[0].Message.ShouldBe("Unable to find placeholder called {Test}");
        }
コード例 #5
0
        public DownstreamRequest Create()
        {
            var httpRequestMessage = Map().Result;

            DownstreamRequest downstreamRequest = new DownstreamRequest(httpRequestMessage);

            return(downstreamRequest);
        }
コード例 #6
0
 public AddHeadersToRequestClaimToThingTests()
 {
     _parser              = new Mock <IClaimsParser>();
     _placeholders        = new Mock <IPlaceholders>();
     _factory             = new Mock <IOcelotLoggerFactory>();
     _addHeadersToRequest = new AddHeadersToRequest(_parser.Object, _placeholders.Object, _factory.Object);
     _downstreamRequest   = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://test.com"));
 }
        private (string path, string query) CreateServiceFabricUri(DownstreamRequest downstreamRequest, DownstreamRoute downstreamRoute, List <PlaceholderNameAndValue> templatePlaceholderNameAndValues, Response <DownstreamPath> dsPath)
        {
            var query        = downstreamRequest.Query;
            var serviceName  = _replacer.Replace(downstreamRoute.ServiceName, templatePlaceholderNameAndValues);
            var pathTemplate = $"/{serviceName.Data.Value}{dsPath.Data.Value}";

            return(pathTemplate, query);
        }
コード例 #8
0
ファイル: Placeholders.cs プロジェクト: zpc870921/Ocelot
        public Response <string> Get(string key, DownstreamRequest request)
        {
            if (_requestPlaceholders.ContainsKey(key))
            {
                return(new OkResponse <string>(_requestPlaceholders[key].Invoke(request)));
            }

            return(new ErrorResponse <string>(new CouldNotFindPlaceholderError(key)));
        }
コード例 #9
0
        private void GivenTheDownstreamRequestHasQueryString(string key, string value)
        {
            var newUri = Microsoft.AspNetCore.WebUtilities.QueryHelpers
                         .AddQueryString(_downstreamRequest.ToHttpRequestMessage().RequestUri.OriginalString, key, value);

            _request.RequestUri = new Uri(newUri);
            //todo - might not need to instanciate
            _downstreamRequest = new DownstreamRequest(_request);
        }
コード例 #10
0
        public void should_return_downstream_base_url_when_port_is_80_or_443()
        {
            var httpRequest = new HttpRequestMessage();

            httpRequest.RequestUri = new Uri("http://www.bbc.co.uk:123");
            var request = new DownstreamRequest(httpRequest);
            var result  = _placeholders.Get("{DownstreamBaseUrl}", request);

            result.Data.ShouldBe("http://www.bbc.co.uk:123/");
        }
コード例 #11
0
        public void should_have_question_mark_with_question_mark_prefixed()
        {
            var httpRequestMessage = new HttpRequestMessage();

            httpRequestMessage.RequestUri = new Uri("https://example.com/a?b=c");
            var downstreamRequest = new DownstreamRequest(httpRequestMessage);
            var result            = downstreamRequest.ToHttpRequestMessage();

            result.RequestUri.Query.ShouldBe("?b=c");
        }
コード例 #12
0
        public Response <string> Get(string key, DownstreamRequest request)
        {
            var placeholderResponse = _placeholders.Get(key, request);

            if (!placeholderResponse.IsError)
            {
                return(placeholderResponse);
            }

            return(GetFromConfig(CleanKey(key)));
        }
コード例 #13
0
        public string GenerateRequestCacheKey(DownstreamRequest downstreamRequest)
        {
            string        hashedContent           = null;
            StringBuilder downStreamUrlKeyBuilder = new StringBuilder($"{downstreamRequest.Method}-{downstreamRequest.OriginalString}");

            if (downstreamRequest.Content != null)
            {
                string requestContentString = Task.Run(async() => await downstreamRequest.Content.ReadAsStringAsync()).Result;
                downStreamUrlKeyBuilder.Append(requestContentString);
            }

            hashedContent = MD5Helper.GenerateMd5(downStreamUrlKeyBuilder.ToString());
            return(hashedContent);
        }
コード例 #14
0
        protected override Task InitializeAsync(DownstreamRequest request)
        {
            var jTokens = Json.SelectTokens(request.Scenario.Connection.ResponseJsonPath, errorWhenNoMatch: true);

            foreach (var jToken in jTokens)
            {
                var product = new ProductRecommendation
                {
                    ProductId = jToken.ToString(),
                    Scenario  = request.Scenario.Name,
                };
                Products.Add(product);
            }
            return(Task.CompletedTask);
        }
コード例 #15
0
        public async Task <DownstreamResponse> SendRequestAsync(DownstreamRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            try
            {
                var response = await _httpClient.SendAsync(request);

                return(await DownstreamResponse.FromHttpResponseAsync(response, request));
            }
            catch (Exception ex)
            {
                return(DownstreamResponse.FromException(ex));
            }
        }
        private static void RemoveQueryStringParametersThatHaveBeenUsedInTemplate(DownstreamRequest downstreamRequest, List <PlaceholderNameAndValue> templatePlaceholderNameAndValues)
        {
            foreach (var nAndV in templatePlaceholderNameAndValues)
            {
                var name = nAndV.Name.Replace("{", "").Replace("}", "");

                if (downstreamRequest.Query.Contains(name) &&
                    downstreamRequest.Query.Contains(nAndV.Value))
                {
                    var questionMarkOrAmpersand = downstreamRequest.Query.IndexOf(name, StringComparison.Ordinal);
                    downstreamRequest.Query = downstreamRequest.Query.Remove(questionMarkOrAmpersand - 1, 1);

                    var rgx = new Regex($@"\b{name}={nAndV.Value}\b");
                    downstreamRequest.Query = rgx.Replace(downstreamRequest.Query, "");

                    if (!string.IsNullOrEmpty(downstreamRequest.Query))
                    {
                        downstreamRequest.Query = '?' + downstreamRequest.Query.Substring(1);
                    }
                }
            }
        }
コード例 #17
0
        private Stream ReadBodyStream(DownstreamRequest request)
        {
            request.Scheme = "http";
            var requestMessage = request.ToHttpRequestMessage();

            request.Scheme = "orleans";
            if (requestMessage.Content == null)
            {
                return(null);
            }

            var stream = requestMessage.Content.ReadAsStreamAsync().Result;

            if (stream.Length == 0)
            {
                return(null);
            }
            else
            {
                return(stream);
            }
        }
コード例 #18
0
 private static void AppendUserInfoToRequest(DownstreamRequest request, IIdentityProvider identityProvider)
 {
     request.Headers.Add(Constants.UserIdHeaderKey, identityProvider.GetUserId().ToString());
     request.Headers.Add(Constants.UsernameHeaderKey, identityProvider.getUsername());
 }
コード例 #19
0
        public Response SetQueriesOnDownstreamRequest(List <ClaimToThing> claimsToThings, IEnumerable <Claim> claims, DownstreamRequest downstreamRequest)
        {
            var queryDictionary = ConvertQueryStringToDictionary(downstreamRequest.Query);

            foreach (var config in claimsToThings)
            {
                var value = _claimsParser.GetValue(claims, config.NewKey, config.Delimiter, config.Index);

                if (value.IsError)
                {
                    return(new ErrorResponse(value.Errors));
                }

                var exists = queryDictionary.FirstOrDefault(x => x.Key == config.ExistingKey);

                if (!string.IsNullOrEmpty(exists.Key))
                {
                    queryDictionary[exists.Key] = value.Data;
                }
                else
                {
                    queryDictionary.Add(config.ExistingKey, value.Data);
                }
            }

            downstreamRequest.Query = ConvertDictionaryToQueryString(queryDictionary);

            return(new OkResponse());
        }
コード例 #20
0
 private void GivenTheDownstreamRequestHasQueryString(string queryString)
 {
     _request           = new HttpRequestMessage(HttpMethod.Post, $"http://my.url/abc{queryString}");
     _downstreamRequest = new DownstreamRequest(_request);
 }
コード例 #21
0
 private void GivenTheRequestIs(HttpRequestMessage request)
 {
     _request = new DownstreamRequest(request);
 }
コード例 #22
0
 private void AddRequestIdHeader(RequestId requestId, DownstreamRequest httpRequestMessage)
 {
     httpRequestMessage.Headers.Add(requestId.RequestIdKey, requestId.RequestIdValue);
 }
コード例 #23
0
        public Response Replace(DownstreamResponse response, List <HeaderFindAndReplace> fAndRs, DownstreamRequest request)
        {
            foreach (var f in fAndRs)
            {
                var dict = response.Headers.ToDictionary(x => x.Key);

                //if the response headers contain a matching find and replace
                if (dict.TryGetValue(f.Key, out var values))
                {
                    //check to see if it is a placeholder in the find...
                    var placeholderValue = _placeholders.Get(f.Find, request);

                    if (!placeholderValue.IsError)
                    {
                        //if it is we need to get the value of the placeholder
                        var replaced = values.Values.ToList()[f.Index].Replace(placeholderValue.Data, f.Replace.LastCharAsForwardSlash());

                        response.Headers.Remove(response.Headers.First(item => item.Key == f.Key));
                        response.Headers.Add(new Header(f.Key, new List <string> {
                            replaced
                        }));
                    }
                    else
                    {
                        var replaced = values.Values.ToList()[f.Index].Replace(f.Find, f.Replace);

                        response.Headers.Remove(response.Headers.First(item => item.Key == f.Key));
                        response.Headers.Add(new Header(f.Key, new List <string> {
                            replaced
                        }));
                    }
                }
            }

            return(new OkResponse());
        }
コード例 #24
0
 private void WhenICreate()
 {
     _result = _downstreamRequestCreator.Create(_request);
 }
コード例 #25
0
 public CacheKeyGeneratorTests()
 {
     _cacheKeyGenerator = new CacheKeyGenerator();
     _cacheKeyGenerator = new CacheKeyGenerator();
     _downstreamRequest = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "https://some.url/blah?abcd=123"));
 }
コード例 #26
0
        public Response Replace(HttpResponseMessage response, List <HeaderFindAndReplace> fAndRs, DownstreamRequest request)
        {
            foreach (var f in fAndRs)
            {
                //if the response headers contain a matching find and replace
                if (response.Headers.TryGetValues(f.Key, out var values))
                {
                    //check to see if it is a placeholder in the find...
                    var placeholderValue = _placeholders.Get(f.Find, request);

                    if (!placeholderValue.IsError)
                    {
                        //if it is we need to get the value of the placeholder
                        //var find = replacePlaceholder(httpRequestMessage);
                        var replaced = values.ToList()[f.Index].Replace(placeholderValue.Data, f.Replace.LastCharAsForwardSlash());
                        response.Headers.Remove(f.Key);
                        response.Headers.Add(f.Key, replaced);
                    }
                    else
                    {
                        var replaced = values.ToList()[f.Index].Replace(f.Find, f.Replace);
                        response.Headers.Remove(f.Key);
                        response.Headers.Add(f.Key, replaced);
                    }
                }
            }

            return(new OkResponse());
        }
コード例 #27
0
 public static void UpsertDownstreamRequest(this IDictionary <object, object> input, DownstreamRequest downstreamRequest)
 {
     input.Upsert("DownstreamRequest", downstreamRequest);
 }
コード例 #28
0
        public static IDictionary <string, string> BuildRequestHeaders(this HttpContext context, DownstreamRoute downstreamRoute, DownstreamRequest downstreamRequest)
        {
            var headers = new Dictionary <string, string>();

            foreach (var key in context.Request.Headers.Keys)
            {
                if (HeadersFilter.IsMatch(key))
                {
                    headers.Add(key, context.Request.Headers[key].FirstOrDefault());
                }
            }

            foreach (var claimToHeader in downstreamRoute.ClaimsToHeaders)
            {
                if (downstreamRequest.Headers.TryGetValues(claimToHeader.ExistingKey, out var values))
                {
                    headers.Add(claimToHeader.ExistingKey, values.FirstOrDefault());
                }
            }

            if (!headers.ContainsKey(_requestIdHeaderName))
            {
                headers[_requestIdHeaderName] = Guid.NewGuid().ToString("N");
            }

            return(headers);
        }
コード例 #29
0
        public Response SetHeadersOnDownstreamRequest(List <ClaimToThing> claimsToThings, IEnumerable <System.Security.Claims.Claim> claims, DownstreamRequest downstreamRequest)
        {
            foreach (var config in claimsToThings)
            {
                var value = _claimsParser.GetValue(claims, config.NewKey, config.Delimiter, config.Index);

                if (value.IsError)
                {
                    return(new ErrorResponse(value.Errors));
                }

                var exists = downstreamRequest.Headers.FirstOrDefault(x => x.Key == config.ExistingKey);

                if (!string.IsNullOrEmpty(exists.Key))
                {
                    downstreamRequest.Headers.Remove(exists.Key);
                }

                downstreamRequest.Headers.Add(config.ExistingKey, value.Data);
            }

            return(new OkResponse());
        }
コード例 #30
0
 public AddHeadersToRequestClaimToThingTests()
 {
     _parser = new Mock <IClaimsParser>();
     _addHeadersToRequest = new AddHeadersToRequest(_parser.Object);
     _downstreamRequest   = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://test.com"));
 }