/// <summary>
        /// Generate the HttpClient using statements with empty using block.
        /// </summary>
        /// <param name="curlOptions">The curl options.</param>
        /// <returns>Collection of <see cref="UsingStatementSyntax"/>.</returns>
        /// <remarks>
        /// using (var httpClient = new HttpClient())
        /// {
        /// }
        /// </remarks>
        private UsingStatementSyntax CreateHttpClientUsing(CurlOptions curlOptions)
        {
            var argumentSyntax = ShouldGenerateHandler(curlOptions)
                                     ? new[] { SyntaxFactory.Argument(SyntaxFactory.IdentifierName(HandlerVariableName)) }
                                     : new ArgumentSyntax[0];

            return(RoslynExtensions.CreateUsingStatement(HttpClientVariableName, nameof(HttpClient), argumentSyntax));
        }
Esempio n. 2
0
    /// <summary>
    /// Generate the HttpClient using statements with empty using block.
    /// </summary>
    /// <param name="curlOptions">The curl options.</param>
    /// <returns>Collection of <see cref="UsingStatementSyntax"/>.</returns>
    /// <remarks>
    /// using (var httpClient = new HttpClient())
    /// {
    /// }
    /// </remarks>
    private UsingStatementSyntax CreateHttpClientUsing(CurlOptions curlOptions)
    {
        var argumentSyntax = ShouldGenerateHandler(curlOptions)
            ? new[] { SyntaxFactory.Argument(SyntaxFactory.IdentifierName(HandlerVariableName)) }
            : new ArgumentSyntax[0];
        var usingStatement = RoslynExtensions.CreateUsingStatement(HttpClientVariableName, nameof(HttpClient), argumentSyntax);

        return(usingStatement
               .PrependComment("// In production code, don't destroy the HttpClient through using, but better use IHttpClientFactory factory or at least reuse an existing HttpClient instance"
                               + Chars.NewLineString + "// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests"
                               + Chars.NewLineString + "// https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/"));
    }
        private UsingStatementSyntax CreateRequestUsingStatement(CurlOptions curlOptions)
        {
            var methodNameArgument = RoslynExtensions.CreateStringLiteralArgument(curlOptions.HttpMethod);
            var httpMethodArgument = RoslynExtensions.CreateObjectCreationExpression(nameof(HttpMethod), methodNameArgument);

            var urlArgument = RoslynExtensions.CreateStringLiteralArgument(curlOptions.Url.ToString());

            return(RoslynExtensions.CreateUsingStatement(
                       RequestVariableName,
                       nameof(HttpRequestMessage),
                       SyntaxFactory.Argument(httpMethodArgument),
                       urlArgument));
        }
Esempio n. 4
0
    /// <summary>
    /// Generate the HttpRequestMessage using statements with statements inside the using blocks.
    /// </summary>
    /// <param name="curlOptions">The curl options.</param>
    /// <returns>Collection of <see cref="UsingStatementSyntax"/>.</returns>
    /// <remarks>
    /// using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://github.com/"))
    /// {
    ///     var response = await httpClient.SendAsync(request);
    /// }
    /// </remarks>
    private IEnumerable <UsingStatementSyntax> CreateRequestUsingStatements(CurlOptions curlOptions)
    {
        var innerBlock = SyntaxFactory.Block();

        var methodNameArgument = RoslynExtensions.CreateStringLiteralArgument(curlOptions.HttpMethod);
        var httpMethodArgument = RoslynExtensions.CreateObjectCreationExpression(nameof(HttpMethod), methodNameArgument);

        var urlArgument           = RoslynExtensions.CreateStringLiteralArgument(curlOptions.GetFullUrl());
        var requestUsingStatement = RoslynExtensions.CreateUsingStatement(
            RequestVariableName,
            nameof(HttpRequestMessage),
            SyntaxFactory.Argument(httpMethodArgument),
            urlArgument);

        var statements = CreateHeaderAssignmentStatements(curlOptions);

        innerBlock = innerBlock.AddStatements(statements.ToArray());

        if (!string.IsNullOrEmpty(curlOptions.UserPasswordPair))
        {
            var basicAuthorizationStatements = CreateBasicAuthorizationStatements(curlOptions);
            innerBlock = innerBlock.AddStatements(basicAuthorizationStatements);
        }

        var requestInnerBlocks = new LinkedList <UsingStatementSyntax>();

        if (curlOptions.HasDataPayload && !curlOptions.ForceGet)
        {
            var assignmentExpression = CreateStringContentAssignmentStatement(curlOptions);
            requestInnerBlocks.AddLast(
                requestUsingStatement.WithStatement(innerBlock.AddStatements(assignmentExpression.ToArray())));
        }
        else if (curlOptions.HasFormPayload)
        {
            var multipartContentStatements = CreateMultipartContentStatements(curlOptions);
            requestInnerBlocks.AddLast(
                requestUsingStatement.WithStatement(innerBlock.AddStatements(multipartContentStatements.ToArray())));
        }
        else if (curlOptions.HasFilePayload)
        {
            foreach (var file in curlOptions.UploadFiles)
            {
                // NOTE that you must use a trailing / on the last directory to really prove to
                // Curl that there is no file name or curl will think that your last directory name is the remote file name to use.
                if (!string.IsNullOrEmpty(curlOptions.Url.PathAndQuery) &&
                    curlOptions.Url.PathAndQuery.EndsWith('/'))
                {
                    var objectCreationExpressionSyntaxs = requestUsingStatement.DescendantNodes()
                                                          .OfType <ObjectCreationExpressionSyntax>()
                                                          .First(
                        t => t.Type is IdentifierNameSyntax identifier &&
                        identifier.Identifier.ValueText == nameof(HttpRequestMessage));

                    var s = objectCreationExpressionSyntaxs.ArgumentList.Arguments.Last();

                    requestUsingStatement = requestUsingStatement.ReplaceNode(
                        s,
                        RoslynExtensions.CreateStringLiteralArgument(curlOptions.GetUrlForFileUpload(file).ToString()));
                }

                var byteArrayContentExpression = CreateNewByteArrayContentExpression(file);
                requestInnerBlocks.AddLast(requestUsingStatement.WithStatement(innerBlock.AddStatements(
                                                                                   SyntaxFactory.ExpressionStatement(
                                                                                       RoslynExtensions.CreateMemberAssignmentExpression(
                                                                                           RequestVariableName,
                                                                                           RequestContentPropertyName,
                                                                                           byteArrayContentExpression))
                                                                                   .AppendWhiteSpace())));
            }
        }
        else if (curlOptions.HttpVersionSpecified)
        {
            var httpVersionStatement = CreateSetHttpVersionStatement(curlOptions);
            innerBlock = innerBlock.AddStatements(httpVersionStatement);
        }

        var sendStatement = CreateSendStatement();

        if (!requestInnerBlocks.Any())
        {
            return(new List <UsingStatementSyntax> {
                requestUsingStatement.WithStatement(innerBlock.AddStatements(sendStatement))
            });
        }

        return(requestInnerBlocks.Select(i => i.WithStatement(((BlockSyntax)i.Statement).AddStatements(sendStatement))));
    }