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)); } }
private void GivenCacheKeyFromContext(DownstreamRequest downstreamRequest) { string generatedCacheKey = _cacheKeyGenerator.GenerateRequestCacheKey(downstreamRequest); string cachekey = MD5Helper.GenerateMd5("GET-https://some.url/blah?abcd=123"); generatedCacheKey.ShouldBe(cachekey); }
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); }
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}"); }
public DownstreamRequest Create() { var httpRequestMessage = Map().Result; DownstreamRequest downstreamRequest = new DownstreamRequest(httpRequestMessage); return(downstreamRequest); }
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); }
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))); }
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); }
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/"); }
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"); }
public Response <string> Get(string key, DownstreamRequest request) { var placeholderResponse = _placeholders.Get(key, request); if (!placeholderResponse.IsError) { return(placeholderResponse); } return(GetFromConfig(CleanKey(key))); }
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); }
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); }
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); } } } }
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); } }
private static void AppendUserInfoToRequest(DownstreamRequest request, IIdentityProvider identityProvider) { request.Headers.Add(Constants.UserIdHeaderKey, identityProvider.GetUserId().ToString()); request.Headers.Add(Constants.UsernameHeaderKey, identityProvider.getUsername()); }
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()); }
private void GivenTheDownstreamRequestHasQueryString(string queryString) { _request = new HttpRequestMessage(HttpMethod.Post, $"http://my.url/abc{queryString}"); _downstreamRequest = new DownstreamRequest(_request); }
private void GivenTheRequestIs(HttpRequestMessage request) { _request = new DownstreamRequest(request); }
private void AddRequestIdHeader(RequestId requestId, DownstreamRequest httpRequestMessage) { httpRequestMessage.Headers.Add(requestId.RequestIdKey, requestId.RequestIdValue); }
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()); }
private void WhenICreate() { _result = _downstreamRequestCreator.Create(_request); }
public CacheKeyGeneratorTests() { _cacheKeyGenerator = new CacheKeyGenerator(); _cacheKeyGenerator = new CacheKeyGenerator(); _downstreamRequest = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "https://some.url/blah?abcd=123")); }
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()); }
public static void UpsertDownstreamRequest(this IDictionary <object, object> input, DownstreamRequest downstreamRequest) { input.Upsert("DownstreamRequest", downstreamRequest); }
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); }
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()); }
public AddHeadersToRequestClaimToThingTests() { _parser = new Mock <IClaimsParser>(); _addHeadersToRequest = new AddHeadersToRequest(_parser.Object); _downstreamRequest = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://test.com")); }