private static async Task SerializerExampleAsync() { var storeDirectory = Path.Combine(Directory.GetCurrentDirectory(), "ProtocolBuffer"); Directory.CreateDirectory(storeDirectory); var networkHandler = new NetworkHandler(); var messageStore = new HttpMessageStore(new FileSystemStore(storeDirectory), new HttpMessageMapper(), new ProtocolBufferSerializer()); var logger = new HttpMessageLogger(messageStore); var loggingHandler = new LoggingHandler(logger) { InnerHandler = networkHandler }; using (var httpClient = new HttpClient(loggingHandler)) { var responseFromClient = await httpClient.GetAsync("http://httpbin.org/ip"); using (responseFromClient) { Console.WriteLine("Response from client:"); Console.WriteLine(await responseFromClient.Content.ReadAsStringAsync()); } ExchangeId exchangeId = responseFromClient.RequestMessage.GetExchangeId(); var responseOrExceptionFromStore = await messageStore.GetResponseOrExceptionAsync(exchangeId, CancellationToken.None); using (responseOrExceptionFromStore.Response) { Console.WriteLine("Response from store:"); Console.WriteLine(await responseOrExceptionFromStore.Response.Content.ReadAsStringAsync()); } } }
public TestState() { // dependencies Store = new Mock <IStore>(); Mapper = new Mock <IHttpMessageMapper>(); Serializer = new Mock <IProtocolBufferSerializer>(); // data CancellationToken = new CancellationToken(); ExchangeId = new ExchangeId(new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero), new Guid("4ae0fbbaaeba4db1bd98d106ece1a6e0")); RequestMessage = new HttpRequestMessage { Content = new StreamContent(Stream.Null) { Headers = { { "Content-Type", "text/plain" }, { "Content-Length", "7" } } } }; Request = new HttpRequest { Method = "POST", Url = "http://example/path", Version = "1.1", Headers = new[] { new HttpHeader { Name = "User-Agent", Value = "HttpMessageStore" }, new HttpHeader { Name = "Content-Type", Value = "text/plain" }, new HttpHeader { Name = "Content-Length", Value = "1" } }, HasContent = true, Content = GetStream("original-request") }; ResponseMessage = new HttpResponseMessage { Content = new StreamContent(Stream.Null) { Headers = { { "Content-Type", "text/plain" }, { "Content-Length", "8" } } } }; Response = new HttpResponse { Version = "1.1", StatusCode = 200, ReasonPhrease = "OK", Headers = new[] { new HttpHeader { Name = "Server", Value = "HttpMessageStore" }, new HttpHeader { Name = "Content-Type", Value = "text/plain" }, new HttpHeader { Name = "Content-Length", Value = "2" } }, HasContent = true, Content = GetStream("original-response") }; Exception = new Exception("some exception"); ResponseOrException = new HttpResponseOrException { Response = Response, ExceptionString = null }; // setup Store .Setup(x => x.GetAsync(It.Is <string>(k => k.EndsWith("request")), It.IsAny <CancellationToken>())) .Returns(() => Task.FromResult(GetStream("store-request"))); Store .Setup(x => x.GetAsync(It.Is <string>(k => k.EndsWith("request-content")), It.IsAny <CancellationToken>())) .Returns(() => Task.FromResult(GetStream("store-request-content"))); Store .Setup(x => x.GetAsync(It.Is <string>(k => k.EndsWith("response")), It.IsAny <CancellationToken>())) .Returns(() => Task.FromResult(GetStream("store-response"))); Store .Setup(x => x.GetAsync(It.Is <string>(k => k.EndsWith("response-content")), It.IsAny <CancellationToken>())) .Returns(() => Task.FromResult(GetStream("store-response-content"))); Mapper .Setup(x => x.ToHttpAsync(It.IsAny <HttpRequestMessage>(), It.IsAny <CancellationToken>())) .Returns(() => Task.FromResult(Request)); Mapper .Setup(x => x.ToHttpMessage(It.IsAny <HttpRequest>())) .Returns(() => RequestMessage); Mapper .Setup(x => x.ToHttpAsync(It.IsAny <HttpResponseMessage>(), It.IsAny <CancellationToken>())) .Returns(() => Task.FromResult(Response)); Mapper .Setup(x => x.ToHttpMessage(It.IsAny <HttpResponse>())) .Returns(() => ResponseMessage); Serializer .Setup(x => x.Serialize(It.IsAny <Stream>(), It.IsAny <HttpRequest>())) .Callback <Stream, HttpRequest>((s, r) => WriteToStream(s, "serialized")); Serializer .Setup(x => x.Deserialize <HttpRequest>(It.IsAny <Stream>())) .Returns(() => Request); Serializer .Setup(x => x.Serialize(It.IsAny <Stream>(), It.IsAny <HttpResponseOrException>())) .Callback <Stream, HttpResponseOrException>((s, r) => WriteToStream(s, "serialized")); Serializer .Setup(x => x.Deserialize <HttpResponseOrException>(It.IsAny <Stream>())) .Returns(() => ResponseOrException); Target = new HttpMessageStore(Store.Object, Mapper.Object, Serializer.Object); }