Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class RestClientProvider : TypeProvider
{
private const string RepeatabilityRequestIdHeader = "Repeatability-Request-ID";
private const string RepeatabilityFirstSentHeader = "Repeatability-First-Sent";
private const string MaxPageSizeParameterName = "maxpagesize";

private static readonly Dictionary<string, ParameterProvider> _knownSpecialHeaderParams = new(StringComparer.OrdinalIgnoreCase)
{
Expand Down Expand Up @@ -222,7 +223,7 @@ private MethodBodyStatements BuildMessage(

if (reinjectedParamsMap.Count > 0)
{
statements.AddRange(AppendQueryParameters(uri, operation, reinjectedParamsMap));
statements.AddRange(AppendQueryParameters(uri, operation, reinjectedParamsMap, isNextLinkRequest: true));
}
}
else
Expand Down Expand Up @@ -417,7 +418,7 @@ private IEnumerable<MethodBodyStatement> AppendHeaderParameters(HttpRequestApi r
return statements;
}

private static List<MethodBodyStatement> AppendQueryParameters(ScopedApi uri, InputOperation operation, Dictionary<string, ParameterProvider> paramMap)
private static List<MethodBodyStatement> AppendQueryParameters(ScopedApi uri, InputOperation operation, Dictionary<string, ParameterProvider> paramMap, bool isNextLinkRequest = false)
{
List<MethodBodyStatement> statements = new(operation.Parameters.Count);

Expand All @@ -426,7 +427,7 @@ private static List<MethodBodyStatement> AppendQueryParameters(ScopedApi uri, In
if (inputParameter is not InputQueryParameter inputQueryParameter)
continue;

var queryStatement = BuildQueryParameterStatement(uri, inputQueryParameter, paramMap, operation);
var queryStatement = BuildQueryParameterStatement(uri, inputQueryParameter, paramMap, operation, isNextLinkRequest);
if (queryStatement != null)
{
statements.Add(queryStatement);
Expand All @@ -440,7 +441,8 @@ private static List<MethodBodyStatement> AppendQueryParameters(ScopedApi uri, In
ScopedApi uri,
InputQueryParameter inputQueryParameter,
Dictionary<string, ParameterProvider> paramMap,
InputOperation operation)
InputOperation operation,
bool isNextLinkRequest = false)
{
GetParamInfo(paramMap, operation, inputQueryParameter, out var paramType, out var serializationFormat, out var valueExpression);
if (valueExpression == null)
Expand All @@ -450,6 +452,14 @@ private static List<MethodBodyStatement> AppendQueryParameters(ScopedApi uri, In

var statement = BuildAppendQueryStatement(uri, inputQueryParameter, paramType, valueExpression, serializationFormat);

// Runtime check to avoid duplicate pagination parameters
if (isNextLinkRequest && ShouldSkipReinjectedParameter(inputQueryParameter.SerializedName))
{
var parameterExistsCheck = uri.Property("Query").Invoke("Contains", Literal($"{inputQueryParameter.SerializedName}="));
var conditionalStatement = new IfStatement(Not(parameterExistsCheck)) { statement };
statement = conditionalStatement;
}

// Apply null check if needed
if (!inputQueryParameter.IsRequired || paramType?.IsNullable == true ||
(paramType is { IsValueType: false, IsFrameworkType: true } && paramType.FrameworkType != typeof(string)))
Expand Down Expand Up @@ -802,6 +812,12 @@ private static bool TryGetSpecialHeaderParam(InputParameter inputParameter, [Not
return false;
}

private static bool ShouldSkipReinjectedParameter(string parameterName)
{
return parameterName.Equals(MaxPageSizeParameterName, StringComparison.OrdinalIgnoreCase);
// In the future, we can extend this to check multiple parameters
}

private static List<int> GetSuccessStatusCodes(InputOperation operation)
{
HashSet<int> statusCodes = [];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ public partial class TestClient
uri.AppendQuery("p1", p1, true);
if ((maxPageSize != null))
{
uri.AppendQuery("maxPageSize", global::Sample.TypeFormatters.ConvertToString(maxPageSize), true);
if (!uri.Query.Contains("maxPageSize="))
Comment thread
radhgupta marked this conversation as resolved.
Outdated
{
uri.AppendQuery("maxPageSize", global::Sample.TypeFormatters.ConvertToString(maxPageSize), true);
}
}
global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200);
global::System.ClientModel.Primitives.PipelineRequest request = message.Request;
Expand Down
Loading