public async Task SendAsync(string serviceName, string topicName, GateRequest gateRequest, CancellationToken cancellationToken) { var fallbackEndpoint = new Uri(_sidecarOptions.FallbackUri); var httpRequestMessage = gateRequest.ToHttpRequestMessage(fallbackEndpoint); httpRequestMessage.Headers.Remove(HttpHeaderNames.XGateServiceName); httpRequestMessage.Headers.Add(HttpHeaderNames.XGateServiceName, serviceName); httpRequestMessage.Headers.Remove(HttpHeaderNames.XGateTopicName); httpRequestMessage.Headers.Add(HttpHeaderNames.XGateTopicName, topicName); var httpResponseMessage = await _httpClient.SendAsync(httpRequestMessage, cancellationToken); httpResponseMessage.EnsureSuccessStatusCode(); }
public async Task GateRequest_To_HttpRequestMessage_Test() { var serviceUri = new Uri("http://service-host/"); var gateRequest = new GateRequest { ServicePath = "service-path", Query = "?a=b", Method = "POST", Headers = new List <KeyValuePair <string, string> > { new KeyValuePair <string, string>("Host", "client-host"), new KeyValuePair <string, string>("Accept", "application/json"), new KeyValuePair <string, string>("Content-Type", "application/json"), new KeyValuePair <string, string>("X-Test", "test1"), new KeyValuePair <string, string>("X-Test", "test2"), new KeyValuePair <string, string>("X-Test", "test3") }, Content = Encoding.UTF8.GetBytes("Test") }; var httpRequestMessage = gateRequest.ToHttpRequestMessage(serviceUri); Assert.AreEqual(new Uri(serviceUri, gateRequest.ServicePath + gateRequest.Query), httpRequestMessage.RequestUri); Assert.AreEqual(gateRequest.Method, httpRequestMessage.Method.ToString()); Assert.IsTrue(gateRequest.Content.SequenceEqual(await httpRequestMessage.Content.ReadAsByteArrayAsync())); Assert.IsTrue(gateRequest.Headers.Where(h => h.Key != "Host").All(h => httpRequestMessage.Headers.Any(rmh => rmh.Key == h.Key && rmh.Value.Contains(h.Value)) || httpRequestMessage.Content.Headers.Any(rmh => rmh.Key == h.Key && rmh.Value.Contains(h.Value))), "Must contains all gateRequest headers"); Assert.IsTrue(!gateRequest.Headers.Any(h => httpRequestMessage.Headers.Any(rmh => rmh.Key == h.Key && rmh.Value.Contains(h.Value)) && httpRequestMessage.Content.Headers.Any(rmh => rmh.Key == h.Key && rmh.Value.Contains(h.Value))), "Should not contains duplicate headers" ); Assert.IsTrue(httpRequestMessage.Headers.Any() && httpRequestMessage.Content.Headers.Any(), "Request and request content must contain headers"); Assert.AreEqual($"{serviceUri.Host}:{serviceUri.Port}", httpRequestMessage.Headers.Host); var httpRequestCount = httpRequestMessage.Headers.Count() + httpRequestMessage.Content.Headers.Count(); var gateRequestCount = gateRequest.Headers.Select(h => h.Key).Distinct().Count(); Assert.AreEqual(gateRequestCount, httpRequestCount, "Add headers with same key in one header"); }