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()); }
/// <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)))); }