示例#1
0
        /// <summary>
        /// Generates the string content creation expression.
        /// </summary>
        /// <param name="contentSyntax">The content syntax.</param>
        /// <param name="curlOptions">The curl options.</param>
        /// <returns>
        ///   <see cref="ObjectCreationExpressionSyntax" /> expression.
        /// </returns>
        /// <remarks>
        /// new StringContent("{\"status\": \"resolved\"}", Encoding.UTF8, "application/json")
        /// </remarks>
        private ObjectCreationExpressionSyntax CreateStringContentCreation(ArgumentSyntax contentSyntax, CurlOptions curlOptions)
        {
            var arguments = new LinkedList <ArgumentSyntax>();

            arguments.AddLast(contentSyntax);

            var contentHeader = curlOptions.GetHeader(HeaderNames.ContentType);

            if (!string.IsNullOrEmpty(contentHeader))
            {
                var contentTypeValues = contentHeader.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                arguments.AddLast(SyntaxFactory.Argument(RoslynExtensions.CreateMemberAccessExpression("Encoding", "UTF8")));
                arguments.AddLast(RoslynExtensions.CreateStringLiteralArgument(contentTypeValues[0].Trim()));
            }

            var stringContentCreation = RoslynExtensions.CreateObjectCreationExpression("StringContent", arguments.ToArray());

            return(stringContentCreation);
        }
示例#2
0
    /// <summary>
    /// Generates the string content creation statements.
    /// </summary>
    /// <param name="curlOptions">The curl options.</param>
    /// <returns>Collection of <see cref="StatementSyntax"/>.</returns>
    /// <remarks>
    /// request.Content = new StringContent("{\"status\": \"resolved\"}", Encoding.UTF8, "application/json");
    /// </remarks>
    private IEnumerable <StatementSyntax> CreateStringContentAssignmentStatement(CurlOptions curlOptions)
    {
        var expressions = new LinkedList <ExpressionSyntax>();

        foreach (var data in curlOptions.UploadData)
        {
            if (data.IsUrlEncoded)
            {
                ExpressionSyntax dataExpression;
                if (data.IsFile)
                {
                    dataExpression = CreateFileReadAllTextExpression(data.Content);
                }
                else
                {
                    dataExpression = SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(data.Content));
                }

                dataExpression = RoslynExtensions.CreateInvocationExpression("Uri", "EscapeDataString", SyntaxFactory.Argument(dataExpression));

                if (data.HasName)
                {
                    dataExpression =
                        RoslynExtensions.CreateInterpolatedStringExpression($"{data.Name}=", dataExpression);
                }

                expressions.AddLast(dataExpression);

                continue;
            }

            if (data.Type == UploadDataType.BinaryFile)
            {
                var readFileExpression = CreateFileReadAllTextExpression(data.Content);
                expressions.AddLast(readFileExpression);

                continue;
            }

            if (data.Type == UploadDataType.InlineFile)
            {
                var readFileExpression = CreateFileReadAllTextExpression(data.Content);
                var replaceNewLines    = RoslynExtensions.CreateInvocationExpression(
                    "Regex",
                    "Replace",
                    SyntaxFactory.Argument(readFileExpression),
                    RoslynExtensions.CreateStringLiteralArgument(@"(?:\r\n|\n|\r)"),
                    SyntaxFactory.Argument(RoslynExtensions.CreateMemberAccessExpression("string", "Empty")));
                expressions.AddLast(replaceNewLines);

                continue;
            }

            expressions.AddLast(
                SyntaxFactory.LiteralExpression(
                    SyntaxKind.StringLiteralExpression,
                    SyntaxFactory.Literal(data.Content)));
        }

        var            statements = new LinkedList <StatementSyntax>();
        ArgumentSyntax stringContentArgumentSyntax;

        if (expressions.Count > 1)
        {
            var contentListVariableName = "contentList";
            statements.AddLast(
                SyntaxFactory.LocalDeclarationStatement(
                    RoslynExtensions.CreateVariableFromNewObjectExpression(contentListVariableName, "List<string>")));

            foreach (var expression in expressions)
            {
                statements.AddLast(
                    SyntaxFactory.ExpressionStatement(
                        RoslynExtensions.CreateInvocationExpression(
                            contentListVariableName,
                            "Add",
                            SyntaxFactory.Argument(expression))));
            }

            stringContentArgumentSyntax = SyntaxFactory.Argument(
                RoslynExtensions.CreateInvocationExpression(
                    "string",
                    "Join",
                    RoslynExtensions.CreateStringLiteralArgument("&"),
                    SyntaxFactory.Argument(SyntaxFactory.IdentifierName(contentListVariableName))));
        }
        else
        {
            stringContentArgumentSyntax = SyntaxFactory.Argument(expressions.First.Value);
        }

        var stringContentCreation = CreateStringContentCreation(
            stringContentArgumentSyntax);

        statements.AddLast(
            SyntaxFactory.ExpressionStatement(
                RoslynExtensions.CreateMemberAssignmentExpression(
                    RequestVariableName,
                    RequestContentPropertyName,
                    stringContentCreation)));

        var memberAccessExpressionSyntax = RoslynExtensions.CreateMemberAccessExpression(
            RoslynExtensions.CreateMemberAccessExpression(
                RoslynExtensions.CreateMemberAccessExpression(RequestVariableName, RequestContentPropertyName),
                "Headers"),
            "ContentType");

        statements.AddLast(
            SyntaxFactory.ExpressionStatement(
                RoslynExtensions.CreateMemberAssignmentExpression(
                    memberAccessExpressionSyntax,
                    RoslynExtensions.CreateInvocationExpression("MediaTypeHeaderValue", "Parse", RoslynExtensions.CreateStringLiteralArgument(curlOptions.GetHeader(HeaderNames.ContentType))))));

        statements.TryAppendWhiteSpaceAtEnd();

        return(statements);
    }