Skip to content

Commit 7f035a0

Browse files
Added ClientPipeline.CreateMessage helper overload so codegen looks nicer (Azure#51491)
* added createmessage helper * typo * typo * fixed doc comments * updated api file
1 parent ab61334 commit 7f035a0

File tree

6 files changed

+75
-2
lines changed

6 files changed

+75
-2
lines changed

sdk/core/System.ClientModel/api/System.ClientModel.net8.0.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ internal ClientPipeline() { }
171171
public static System.ClientModel.Primitives.ClientPipeline Create(System.ClientModel.Primitives.ClientPipelineOptions? options = null) { throw null; }
172172
public static System.ClientModel.Primitives.ClientPipeline Create(System.ClientModel.Primitives.ClientPipelineOptions options, System.ReadOnlySpan<System.ClientModel.Primitives.PipelinePolicy> perCallPolicies, System.ReadOnlySpan<System.ClientModel.Primitives.PipelinePolicy> perTryPolicies, System.ReadOnlySpan<System.ClientModel.Primitives.PipelinePolicy> beforeTransportPolicies) { throw null; }
173173
public System.ClientModel.Primitives.PipelineMessage CreateMessage() { throw null; }
174+
public System.ClientModel.Primitives.PipelineMessage CreateMessage(System.Uri uri, string method, System.ClientModel.Primitives.PipelineMessageClassifier? classifier = null) { throw null; }
174175
public void Send(System.ClientModel.Primitives.PipelineMessage message) { }
175176
public System.Threading.Tasks.ValueTask SendAsync(System.ClientModel.Primitives.PipelineMessage message) { throw null; }
176177
}

sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ internal ClientPipeline() { }
170170
public static System.ClientModel.Primitives.ClientPipeline Create(System.ClientModel.Primitives.ClientPipelineOptions? options = null) { throw null; }
171171
public static System.ClientModel.Primitives.ClientPipeline Create(System.ClientModel.Primitives.ClientPipelineOptions options, System.ReadOnlySpan<System.ClientModel.Primitives.PipelinePolicy> perCallPolicies, System.ReadOnlySpan<System.ClientModel.Primitives.PipelinePolicy> perTryPolicies, System.ReadOnlySpan<System.ClientModel.Primitives.PipelinePolicy> beforeTransportPolicies) { throw null; }
172172
public System.ClientModel.Primitives.PipelineMessage CreateMessage() { throw null; }
173+
public System.ClientModel.Primitives.PipelineMessage CreateMessage(System.Uri uri, string method, System.ClientModel.Primitives.PipelineMessageClassifier? classifier = null) { throw null; }
173174
public void Send(System.ClientModel.Primitives.PipelineMessage message) { }
174175
public System.Threading.Tasks.ValueTask SendAsync(System.ClientModel.Primitives.PipelineMessage message) { throw null; }
175176
}

sdk/core/System.ClientModel/src/Message/PipelineRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace System.ClientModel.Primitives;
1010
/// The type of a <see cref="PipelineRequest"/> is specific to the type of the
1111
/// <see cref="PipelineTransport"/> used by the <see cref="ClientPipeline"/>
1212
/// that sends the request. Because of this,
13-
/// <see cref="ClientPipeline.CreateMessage"/> is used to create an instance of
13+
/// <see cref="ClientPipeline.CreateMessage()"/> is used to create an instance of
1414
/// <see cref="PipelineRequest"/> for a given pipeline.
1515
/// </summary>
1616
public abstract class PipelineRequest : IDisposable

sdk/core/System.ClientModel/src/Pipeline/ClientPipeline.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,30 @@ public PipelineMessage CreateMessage()
194194
return message;
195195
}
196196

197+
/// <summary>
198+
/// Creates a <see cref="PipelineMessage"/> that can be sent using this
199+
/// pipeline instance with the specified URI, HTTP method, and response
200+
/// classifier.
201+
/// </summary>
202+
/// <param name="uri">The <see cref="Uri"/> for the HTTP request.</param>
203+
/// <param name="method">The HTTP method for the request.</param>
204+
/// <param name="classifier">The <see cref="PipelineMessageClassifier"/>
205+
/// to use for determining response success and retry behavior. If not provided,
206+
/// <see cref="PipelineMessageClassifier.Default"/> will be used.</param>
207+
/// <returns>The created <see cref="PipelineMessage"/> with the specified
208+
/// URI, method, and classifier configured.</returns>
209+
public PipelineMessage CreateMessage(Uri uri, string method, PipelineMessageClassifier? classifier = default)
210+
{
211+
Argument.AssertNotNull(uri, nameof(uri));
212+
Argument.AssertNotNull(method, nameof(method));
213+
214+
PipelineMessage message = CreateMessage();
215+
message.Request.Uri = uri;
216+
message.Request.Method = method;
217+
message.ResponseClassifier = classifier ?? PipelineMessageClassifier.Default;
218+
return message;
219+
}
220+
197221
/// <summary>
198222
/// Send the provided <see cref="PipelineMessage"/>.
199223
/// </summary>

sdk/core/System.ClientModel/src/Pipeline/PipelineTransport.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ protected PipelineTransport(bool enableLogging, ILoggerFactory? loggerFactory)
4545
/// <summary>
4646
/// Create an instance of <see cref="PipelineMessage"/> that can be sent
4747
/// using this transport instance. This method will rarely be called directly;
48-
/// <see cref="ClientPipeline.CreateMessage"/> should be called instead.
48+
/// <see cref="ClientPipeline.CreateMessage()"/> should be called instead.
4949
/// </summary>
5050
/// <returns>A <see cref="PipelineMessage"/> that can be passed to
5151
/// <see cref="Process(PipelineMessage)"/>.</returns>

sdk/core/System.ClientModel/tests/Pipeline/ClientPipelineTests.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,4 +331,51 @@ public async Task RequestOptionsCanCustomizePipeline()
331331
Assert.AreEqual("Response:RetryPolicy", observations[index++]);
332332
Assert.AreEqual("Response:A", observations[index++]);
333333
}
334+
335+
[Test]
336+
public void CreateMessageWithUriMethodAndClassifierSetsProperties()
337+
{
338+
ClientPipeline pipeline = ClientPipeline.Create();
339+
Uri testUri = new Uri("https://example.com/test");
340+
string testMethod = "POST";
341+
PipelineMessageClassifier testClassifier = PipelineMessageClassifier.Create(ReadOnlySpan<ushort>.Empty);
342+
343+
PipelineMessage message = pipeline.CreateMessage(testUri, testMethod, testClassifier);
344+
345+
Assert.IsNotNull(message);
346+
Assert.AreEqual(testUri, message.Request.Uri);
347+
Assert.AreEqual(testMethod, message.Request.Method);
348+
Assert.AreEqual(testClassifier, message.ResponseClassifier);
349+
Assert.IsNotNull(message.NetworkTimeout);
350+
}
351+
352+
[Test]
353+
public void CreateMessageThrowsOnNullUriOrMethod()
354+
{
355+
ClientPipeline pipeline = ClientPipeline.Create();
356+
Uri testUri = new Uri("https://example.com/test");
357+
string testMethod = "GET";
358+
PipelineMessageClassifier testClassifier = PipelineMessageClassifier.Default;
359+
360+
Assert.Throws<ArgumentNullException>(() =>
361+
pipeline.CreateMessage(null!, testMethod, testClassifier));
362+
363+
Assert.Throws<ArgumentNullException>(() =>
364+
pipeline.CreateMessage(testUri, null!, testClassifier));
365+
}
366+
367+
[Test]
368+
public void CreateMessageWithUriAndMethodUsesDefaultClassifier()
369+
{
370+
ClientPipeline pipeline = ClientPipeline.Create();
371+
Uri testUri = new Uri("https://example.com/test");
372+
string testMethod = "DELETE";
373+
374+
PipelineMessage message = pipeline.CreateMessage(testUri, testMethod);
375+
376+
Assert.IsNotNull(message);
377+
Assert.AreEqual(testUri, message.Request.Uri);
378+
Assert.AreEqual(testMethod, message.Request.Method);
379+
Assert.AreEqual(PipelineMessageClassifier.Default, message.ResponseClassifier);
380+
}
334381
}

0 commit comments

Comments
 (0)