Ejemplo n.º 1
0
    public void GetFullUrl_ForceGetDefaultPort_Success()
    {
        var curlOptions = new CurlOptions();

        curlOptions.Url      = new Uri("https://google.com/");
        curlOptions.ForceGet = true;
        curlOptions.UploadData.Add(new UploadData("test"));

        Assert.Equal("https://google.com/?test", curlOptions.GetFullUrl());
    }
Ejemplo n.º 2
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))));
    }