in src/AutoRest.CSharp/Common/Generation/Writers/RequestWriterHelpers.cs [37:242]
public static void WriteRequestCreation(CodeWriter writer, RestClientMethod clientMethod, ClientFields fields, string? responseClassifierType, bool writeSDKUserAgent, IReadOnlyList<Parameter>? clientParameters = null)
{
using var methodScope = writer.AmbientScope();
var parameters = clientMethod.Parameters;
var methodName = CreateRequestMethodName(clientMethod.Name);
writer.Append($"internal {Configuration.ApiTypes.HttpMessageType} {methodName}(");
foreach (Parameter clientParameter in parameters)
{
writer.Append($"{clientParameter.Type} {clientParameter.Name:D},");
}
writer.RemoveTrailingComma();
writer.Line($")");
using (writer.Scope())
{
var message = new CodeWriterDeclaration("message");
var request = new CodeWriterDeclaration("request");
var uri = new CodeWriterDeclaration("uri");
if (Configuration.IsBranded)
{
if (clientMethod.Parameters.Contains(KnownParameters.RequestContext))
{
writer.Append($"var {message:D} = {Configuration.ApiTypes.GetHttpPipelineCreateMessageFormat(true)}");
if (responseClassifierType != default)
{
writer.Append($", {responseClassifierType}");
}
writer.Line($");");
}
else
{
writer.Line($"var {message:D} = {Configuration.ApiTypes.GetHttpPipelineCreateMessageFormat(false)});");
}
}
else
{
writer.Line($"var {message:D} = _pipeline.CreateMessage();");
writer.Line($"{message}.ResponseClassifier = {responseClassifierType};");
}
writer.Line($"var {request:D} = {message}.{Configuration.ApiTypes.HttpMessageRequestName};");
var method = clientMethod.Request.HttpMethod;
if (!clientMethod.BufferResponse)
{
writer.Line($"{message}.BufferResponse = false;");
}
writer.Line(Configuration.ApiTypes.GetSetMethodString(request.ActualName, method.Method));
writer.Line($"var {uri:D} = new {Configuration.ApiTypes.RequestUriType}();");
foreach (var segment in clientMethod.Request.PathSegments)
{
var value = GetFieldReference(fields, segment.Value);
if (value.Type.IsFrameworkType && value.Type.FrameworkType == typeof(Uri))
{
writer.Append($"{uri}.Reset(");
WriteConstantOrParameter(writer, value, enumAsString: !segment.IsRaw);
writer.Line($");");
}
else if (!value.IsConstant && value.Reference.Name == "nextLink")
{
WritePathSegment(writer, uri, segment, value, "AppendRawNextLink");
}
else
{
WritePathSegment(writer, uri, segment, value);
}
}
//TODO: Duplicate code between query and header parameter processing logic
foreach (var queryParameter in clientMethod.Request.Query)
{
WriteQueryParameter(writer, uri, queryParameter, fields, clientParameters);
}
writer.Line(Configuration.ApiTypes.GetSetUriString(request.ActualName, uri.ActualName));
WriteHeaders(writer, clientMethod, request, content: false, fields);
switch (clientMethod.Request.Body)
{
case RequestContentRequestBody body:
WriteHeaders(writer, clientMethod, request, content: true, fields);
writer.Line(Configuration.ApiTypes.GetSetContentString(request.ActualName, body.Parameter.Name));
break;
case SchemaRequestBody body:
using (WriteValueNullCheck(writer, body.Value))
{
WriteHeaders(writer, clientMethod, request, content: true, fields);
WriteSerializeContent(writer, request, body.Serialization, GetConstantOrParameter(body.Value, ignoreNullability: true, convertBinaryDataToArray: false));
}
break;
case BinaryRequestBody binaryBody:
using (WriteValueNullCheck(writer, binaryBody.Value))
{
WriteHeaders(writer, clientMethod, request, content: true, fields);
writer.Append($"{request}.Content = {Configuration.ApiTypes.RequestContentType}.{Configuration.ApiTypes.RequestContentCreateName}(");
WriteConstantOrParameter(writer, binaryBody.Value);
writer.Line($");");
}
break;
case TextRequestBody textBody:
using (WriteValueNullCheck(writer, textBody.Value))
{
WriteHeaders(writer, clientMethod, request, content: true, fields);
writer.Append($"{request}.Content = new {typeof(StringRequestContent)}(");
WriteConstantOrParameter(writer, textBody.Value);
writer.Line($");");
}
break;
case MultipartRequestBody multipartRequestBody:
WriteHeaders(writer, clientMethod, request, content: true, fields);
var multipartContent = new CodeWriterDeclaration("content");
writer.Line($"var {multipartContent:D} = new {typeof(MultipartFormDataContent)}();");
foreach (var bodyParameter in multipartRequestBody.RequestBodyParts)
{
switch (bodyParameter.Content)
{
case BinaryRequestBody binaryBody:
using (WriteValueNullCheck(writer, binaryBody.Value))
{
writer.Append($"{multipartContent}.Add({Configuration.ApiTypes.RequestContentType}.{Configuration.ApiTypes.RequestContentCreateName}(");
WriteConstantOrParameter(writer, binaryBody.Value);
writer.Line($"), {bodyParameter.Name:L}, null);");
}
break;
case TextRequestBody textBody:
using (WriteValueNullCheck(writer, textBody.Value))
{
writer.Append($"{multipartContent}.Add(new {typeof(StringRequestContent)}(");
WriteConstantOrParameter(writer, textBody.Value);
writer.Line($"), {bodyParameter.Name:L}, null);");
}
break;
case BinaryCollectionRequestBody collectionBody:
var collectionItemVariable = new CodeWriterDeclaration("value");
using (writer.Scope($"foreach (var {collectionItemVariable:D} in {collectionBody.Value.Reference.Name})"))
{
writer.Append($"{multipartContent}.Add({Configuration.ApiTypes.RequestContentType}.{Configuration.ApiTypes.RequestContentCreateName}({collectionItemVariable}), {bodyParameter.Name:L}, null);");
}
break;
default:
throw new NotImplementedException(bodyParameter.Content?.GetType().FullName);
}
}
writer.Line($"{multipartContent}.ApplyToRequest({request});");
break;
case FlattenedSchemaRequestBody flattenedSchemaRequestBody:
WriteHeaders(writer, clientMethod, request, content: true, fields);
var initializers = new List<PropertyInitializer>();
foreach (var initializer in flattenedSchemaRequestBody.Initializers)
{
initializers.Add(new PropertyInitializer(initializer.Property.Declaration.Name, initializer.Property.Declaration.Type, initializer.Property.IsReadOnly, initializer.Value.GetReferenceOrConstantFormattable(), initializer.Value.Type));
}
var modelVariable = new CodeWriterDeclaration("model");
writer.WriteInitialization(
v => writer.Line($"var {modelVariable:D} = {v};"),
flattenedSchemaRequestBody.ObjectType,
flattenedSchemaRequestBody.ObjectType.InitializationConstructor,
initializers);
WriteSerializeContent(writer, request, flattenedSchemaRequestBody.Serialization, $"{modelVariable:I}");
break;
case UrlEncodedBody urlEncodedRequestBody:
var urlContent = new CodeWriterDeclaration("content");
WriteHeaders(writer, clientMethod, request, content: true, fields);
writer.Line($"var {urlContent:D} = new {typeof(FormUrlEncodedContent)}();");
foreach (var (name, value) in urlEncodedRequestBody.Values)
{
using (WriteValueNullCheck(writer, value))
{
writer.Append($"{urlContent}.Add({name:L},");
WriteConstantOrParameterAsString(writer, value);
writer.Line($");");
}
}
writer.Line($"{request}.Content = {urlContent};");
break;
case null:
break;
default:
throw new NotImplementedException(clientMethod.Request.Body?.GetType().FullName);
}
if (writeSDKUserAgent)
{
writer.Line($"_userAgent.Apply({message});");
}
// we need to apply the RequestOptions in non-branded case as a last step
if (!Configuration.IsBranded && clientMethod.Parameters.Contains(KnownParameters.RequestContext))
{
writer.Line($"{message}.Apply({KnownParameters.RequestContext.Name:I});");
}
writer.Line($"return {message};");
}
writer.Line();
}