Skip to content

Commit

Permalink
Make HttpPipelineMessage.Request readonly (#7918)
Browse files Browse the repository at this point in the history
  • Loading branch information
pakrym authored Oct 3, 2019
1 parent ed4fc0d commit 2fc7991
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 83 deletions.
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/src/Pipeline/HttpPipelineMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public HttpPipelineMessage(Request request, ResponseClassifier responseClassifie
BufferResponse = true;
}

public Request Request { get; set; }
public Request Request { get; }

public Response Response
{
Expand Down
101 changes: 40 additions & 61 deletions sdk/core/Azure.Core/tests/EventSourceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,19 +79,17 @@ public async Task SendingRequestProducesEvents()
MockTransport mockTransport = CreateMockTransport(response);

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: true, int.MaxValue, s_allowedHeaders, s_allowedQueryParameters) });
string requestId;
string requestId = null;

using (Request request = pipeline.CreateRequest())
await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io/api-version=5"));
request.Headers.Add("Date", "3/26/2019");
request.Headers.Add("Custom-Header", "Value");
request.Content = HttpPipelineRequestContent.Create(new byte[] { 1, 2, 3, 4, 5 });
requestId = request.ClientRequestId;

await SendRequestAsync(pipeline, request);
}
});

EventWrittenEventArgs e = _listener.SingleEventById(RequestEvent);
Assert.AreEqual(EventLevel.Informational, e.Level);
Expand Down Expand Up @@ -132,19 +130,17 @@ public async Task GettingErrorRequestProducesEvents()
MockTransport mockTransport = CreateMockTransport(response);

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: true, int.MaxValue, s_allowedHeaders, s_allowedQueryParameters) });
string requestId;
string requestId = null;

using (Request request = pipeline.CreateRequest())
await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io"));
request.Headers.Add("Date", "3/26/2019");
request.Headers.Add("Custom-Header", "Value");
request.Content = HttpPipelineRequestContent.Create(new byte[] { 1, 2, 3, 4, 5 });
requestId = request.ClientRequestId;

await SendRequestAsync(pipeline, request);
}
});

EventWrittenEventArgs e = _listener.SingleEventById(ErrorResponseEvent);
Assert.AreEqual(EventLevel.Error, e.Level);
Expand All @@ -167,18 +163,16 @@ public async Task RequestContentIsLoggedAsText()
MockTransport mockTransport = CreateMockTransport(response);

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: true, int.MaxValue, s_allowedHeaders, s_allowedQueryParameters) });
string requestId;
string requestId = null;

using (Request request = pipeline.CreateRequest())
await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io"));
request.Content = HttpPipelineRequestContent.Create(Encoding.UTF8.GetBytes("Hello world"));
request.Headers.Add("Content-Type", "text/json");
requestId = request.ClientRequestId;

await SendRequestAsync(pipeline, request);
}
});

EventWrittenEventArgs e = _listener.SingleEventById(RequestContentTextEvent);
Assert.AreEqual(EventLevel.Verbose, e.Level);
Expand All @@ -200,15 +194,13 @@ public async Task ContentIsNotLoggedAsTextWhenDisabled()

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: false, int.MaxValue, s_allowedHeaders, s_allowedQueryParameters) });

using (Request request = pipeline.CreateRequest())
await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io"));
request.Content = HttpPipelineRequestContent.Create(Encoding.UTF8.GetBytes("Hello world"));
request.Headers.Add("Content-Type", "text/json");

await SendRequestAsync(pipeline, request);
}
});

AssertNoContentLogged();
}
Expand All @@ -223,14 +215,12 @@ public async Task ContentIsNotLoggedWhenDisabled()

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: false, int.MaxValue, s_allowedHeaders, s_allowedQueryParameters) });

using (Request request = pipeline.CreateRequest())
await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io"));
request.Content = HttpPipelineRequestContent.Create(Encoding.UTF8.GetBytes("Hello world"));

await SendRequestAsync(pipeline, request);
}
});

AssertNoContentLogged();
}
Expand All @@ -246,14 +236,12 @@ public async Task RequestContentIsNotLoggedWhenDisabled()

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: false, int.MaxValue, s_allowedHeaders, s_allowedQueryParameters) });

using (Request request = pipeline.CreateRequest())
await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io"));
request.Content = HttpPipelineRequestContent.Create(Encoding.UTF8.GetBytes("Hello world"));

await SendRequestAsync(pipeline, request);
}
});

AssertNoContentLogged();
}
Expand Down Expand Up @@ -436,18 +424,16 @@ public async Task RequestContentLogsAreLimitedInLength()
MockTransport mockTransport = CreateMockTransport(response);

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: true, 5, s_allowedHeaders, s_allowedQueryParameters) });
string requestId;
string requestId = null;

using (Request request = pipeline.CreateRequest())
await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io"));
request.Content = HttpPipelineRequestContent.Create(Encoding.UTF8.GetBytes("Hello world"));
request.Headers.Add("Content-Type", "text/json");
requestId = request.ClientRequestId;

await SendRequestAsync(pipeline, request);
}
});

EventWrittenEventArgs e = _listener.SingleEventById(RequestContentTextEvent);
Assert.AreEqual(EventLevel.Verbose, e.Level);
Expand Down Expand Up @@ -492,20 +478,17 @@ public async Task HeadersAndQueryParametersAreSanitized()
MockTransport mockTransport = CreateMockTransport(response);

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: false, int.MaxValue, s_allowedHeaders, s_allowedQueryParameters) });
string requestId;
string requestId = null;

using (Request request = pipeline.CreateRequest())
{
await SendRequestAsync(pipeline, request => {
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io?api-version=5&secret=123"));
request.Headers.Add("Date", "3/26/2019");
request.Headers.Add("Custom-Header", "Value");
request.Headers.Add("Secret-Custom-Header", "Value");
request.Content = HttpPipelineRequestContent.Create(new byte[] { 1, 2, 3, 4, 5 });
requestId = request.ClientRequestId;

await SendRequestAsync(pipeline, request);
}
});

EventWrittenEventArgs e = _listener.SingleEventById(RequestEvent);
Assert.AreEqual(EventLevel.Informational, e.Level);
Expand Down Expand Up @@ -537,9 +520,9 @@ public async Task HeadersAndQueryParametersAreNotSanitizedWhenStars()
MockTransport mockTransport = CreateMockTransport(response);

var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: false, int.MaxValue, new[] {"*"}, new[] {"*"}) });
string requestId;
string requestId = null;

using (Request request = pipeline.CreateRequest())
await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io?api-version=5&secret=123"));
Expand All @@ -548,9 +531,7 @@ public async Task HeadersAndQueryParametersAreNotSanitizedWhenStars()
request.Headers.Add("Secret-Custom-Header", "Value");
request.Content = HttpPipelineRequestContent.Create(new byte[] { 1, 2, 3, 4, 5 });
requestId = request.ClientRequestId;

await SendRequestAsync(pipeline, request);
}
});

EventWrittenEventArgs e = _listener.SingleEventById(RequestEvent);
Assert.AreEqual(EventLevel.Informational, e.Level);
Expand Down Expand Up @@ -588,30 +569,28 @@ private async Task<Response> SendRequest(bool isSeekable, bool isError, Action<M
MockTransport mockTransport = CreateMockTransport(mockResponse);
var pipeline = new HttpPipeline(mockTransport, new[] { new LoggingPolicy(logContent: true, maxLength, s_allowedHeaders, s_allowedQueryParameters) });

using (Request request = pipeline.CreateRequest())
Response response = await SendRequestAsync(pipeline, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("https://contoso.a.io"));
});

Response response = await SendRequestAsync(pipeline, request);

var buffer = new byte[11];
var buffer = new byte[11];

if (IsAsync)
{
Assert.AreEqual(6, await response.ContentStream.ReadAsync(buffer, 5, 6));
Assert.AreEqual(5, await response.ContentStream.ReadAsync(buffer, 6, 5));
Assert.AreEqual(0, await response.ContentStream.ReadAsync(buffer, 0, 5));
}
else
{
Assert.AreEqual(6, response.ContentStream.Read(buffer, 5, 6));
Assert.AreEqual(5, response.ContentStream.Read(buffer, 6, 5));
Assert.AreEqual(0, response.ContentStream.Read(buffer, 0, 5));
}

return mockResponse;
if (IsAsync)
{
Assert.AreEqual(6, await response.ContentStream.ReadAsync(buffer, 5, 6));
Assert.AreEqual(5, await response.ContentStream.ReadAsync(buffer, 6, 5));
Assert.AreEqual(0, await response.ContentStream.ReadAsync(buffer, 0, 5));
}
else
{
Assert.AreEqual(6, response.ContentStream.Read(buffer, 5, 6));
Assert.AreEqual(5, response.ContentStream.Read(buffer, 6, 5));
Assert.AreEqual(0, response.ContentStream.Read(buffer, 0, 5));
}

return mockResponse;
}

}
Expand Down
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/tests/PipelineTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class PipelineTestBase
{
protected static async Task<Response> ExecuteRequest(Request request, HttpClientTransport transport)
{
var message = new HttpPipelineMessage(request, new ResponseClassifier()) { Request = request };
var message = new HttpPipelineMessage(request, new ResponseClassifier());
await transport.ProcessAsync(message);
return message.Response;
}
Expand Down
26 changes: 14 additions & 12 deletions sdk/core/Azure.Core/tests/RequestActivityPolicyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,14 @@ public async Task ActivityIsCreatedForRequest()
return mockResponse;
});

using Request request = mockTransport.CreateRequest();
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("http://example.com"));
request.Headers.Add("User-Agent", "agent");

Task<Response> requestTask = SendRequestAsync(mockTransport, request, s_enabledPolicy);
string clientRequestId = null;
Task<Response> requestTask = SendRequestAsync(mockTransport, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("http://example.com"));
request.Headers.Add("User-Agent", "agent");
clientRequestId = request.ClientRequestId;
}, s_enabledPolicy);

await requestTask;

Expand All @@ -57,7 +59,7 @@ public async Task ActivityIsCreatedForRequest()
CollectionAssert.Contains(activity.Tags, new KeyValuePair<string, string>("http.url", "http://example.com/"));
CollectionAssert.Contains(activity.Tags, new KeyValuePair<string, string>("http.method", "GET"));
CollectionAssert.Contains(activity.Tags, new KeyValuePair<string, string>("http.user_agent", "agent"));
CollectionAssert.Contains(activity.Tags, new KeyValuePair<string, string>("requestId", request.ClientRequestId));
CollectionAssert.Contains(activity.Tags, new KeyValuePair<string, string>("requestId", clientRequestId));
CollectionAssert.Contains(activity.Tags, new KeyValuePair<string, string>("serviceRequestId", "server request id"));
}

Expand All @@ -80,11 +82,11 @@ public async Task ActivityIdIsStampedOnRequest()
return new MockResponse(201);
});

using Request request = mockTransport.CreateRequest();
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("http://example.com"));

Task<Response> requestTask = SendRequestAsync(mockTransport, request, s_enabledPolicy);
Task<Response> requestTask = SendRequestAsync(mockTransport, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("http://example.com"));
}, s_enabledPolicy);

await requestTask;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ public SyncAsyncPolicyTestBase(bool isAsync) : base(isAsync)
{
}

protected async Task<Response> SendRequestAsync(HttpPipeline pipeline, Request request, bool bufferResponse = true, CancellationToken cancellationToken = default)
protected async Task<Response> SendRequestAsync(HttpPipeline pipeline, Action<Request> requestAction, bool bufferResponse = true, CancellationToken cancellationToken = default)
{
HttpPipelineMessage message = pipeline.CreateMessage();
message.BufferResponse = bufferResponse;
message.Request = request;
requestAction(message.Request);

if (IsAsync)
{
Expand All @@ -36,20 +36,21 @@ protected async Task<Response> SendRequestAsync(HttpPipeline pipeline, Request r
return message.Response;
}

protected async Task<Response> SendRequestAsync(HttpPipelineTransport transport, Request request, HttpPipelinePolicy policy, ResponseClassifier responseClassifier = null, bool bufferResponse = true)
protected async Task<Response> SendRequestAsync(HttpPipelineTransport transport, Action<Request> requestAction, HttpPipelinePolicy policy, ResponseClassifier responseClassifier = null, bool bufferResponse = true)
{
await Task.Yield();

var pipeline = new HttpPipeline(transport, new[] { policy }, responseClassifier);
return await SendRequestAsync(pipeline, request, bufferResponse, CancellationToken.None);
return await SendRequestAsync(pipeline, requestAction, bufferResponse, CancellationToken.None);
}

protected async Task<Response> SendGetRequest(HttpPipelineTransport transport, HttpPipelinePolicy policy, ResponseClassifier responseClassifier = null, bool bufferResponse = true)
{
using Request request = transport.CreateRequest();
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("http://example.com"));
return await SendRequestAsync(transport, request, policy, responseClassifier, bufferResponse);
return await SendRequestAsync(transport, request =>
{
request.Method = RequestMethod.Get;
request.Uri.Reset(new Uri("http://example.com"));
}, policy, responseClassifier, bufferResponse);
}
}
}

0 comments on commit 2fc7991

Please sign in to comment.