Giter Club home page Giter Club logo

Comments (19)

masroore avatar masroore commented on May 21, 2024 1

@hieple I stand corrected, ContentType is applicable only to the response from web server.
I could not find any easy way to set the content-type header on the request.
You'll need to construct the HTTP header manually:

var headers = new CurlSlist();
headers.Append("Content-Type: application/soap+xml; charset=utf-8");
easy.HttpHeader = headers;

from curlsharp.

masroore avatar masroore commented on May 21, 2024

Are you running Windows or Mono Linux/OSX? All the examples you've mentioned are working fine on my end. (Windows 8.1 x64).
Make sure to copy the appropriate DLL for the environment (32/64 bit).
To avoid further confusion, re-target the projects from "Any CPU" to the specific architecture of your choice.

from curlsharp.

http200it avatar http200it commented on May 21, 2024

Run on a Windows 2008 Standard R2 - 64 bit and Mono 3.8
GET method, a proxy for these systems work.
The POST method does not send data to the program itself starts, but does not send.
Built in this way
Download> https://github.com/masroore/CurlSharp>
Open project> CurlSharp> Debug> MixedPlatforms> Bulid Solutions

1> ------ Build started: Project: CurlSharp, Configuration: Debug Any CPU ------
1> CurlSharp -> C:\Users\Administrator\Downloads\CurlSharp-master(1)\CurlSharp-master\CurlSharp\bin\Debug\CurlSharp.dll

I run the test program, and download the code works. POST does not work send in the 32 Bit and 64 Bit
If possible, ask me about posting your CurlSharp.dll 64 bit that works well for you.
Sorry for English writing by the translator

from curlsharp.

mangusta avatar mangusta commented on May 21, 2024

Hi.
I have similar problem with POST method. I wasn't able to send any data using CURLSHARP. My environment is Win 7 64 bit - compile via "Any CPU" and "x64".

This is my complete C# cod (I've change domain only):

using CurlSharp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{

class Program
{

    static void Main(string[] args)
    {
        int bits = IntPtr.Size * 8;
        Console.WriteLine("Test curl {0} bit", bits);
        Curl.GlobalInit(CurlInitFlag.All);
        Console.WriteLine("Curl Version: {0}\n", Curl.Version);

        try
        {

            Console.WriteLine("\n========== TEST 1 CurlEasy Post ============");

            using (var easy = new CurlEasy())
            {

                easy.WriteFunction = OnWriteData;
                easy.WriteData = null;
                easy.PostFields = "parm1=value1&parm2=value2";
                easy.UserAgent = "MyUserAgent CurlEasy Post";
                easy.FollowLocation = true;
                easy.Url = "http://xxxxx.com/testpost.php";
                easy.Post = true;
                var code = easy.Perform();
            }


            Console.WriteLine("\n========== TEST 2 CurlEasy HttpPost ============");

            var mf = new CurlHttpMultiPartForm();
            mf.AddSection(CurlFormOption.CopyName, "parm1", CurlFormOption.CopyContents, "value1", CurlFormOption.End);
            mf.AddSection(CurlFormOption.CopyName, "parm2", CurlFormOption.CopyContents, "value2", CurlFormOption.End);
            using (var easy = new CurlEasy())
            {

                easy.WriteFunction = OnWriteData;
                easy.WriteData = null;
                easy.UserAgent = "MyUserAgent CurlEasy HttpPost";
                easy.FollowLocation = true;
                easy.Url = "http://xxxxx.com/testpost.php";
                easy.HttpPost = mf;
                var code = easy.Perform();
            }  


            Curl.GlobalCleanup();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

        Console.WriteLine("\n========== TEST 3 HttpWebRequest ============");

        var request = (HttpWebRequest)WebRequest.Create("http://xxxxx.com/testpost.php");
        var data = Encoding.ASCII.GetBytes("parm1=value1&parm2=value2");
        request.UserAgent = "MyUserAgent HttpWebRequest";
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = data.Length;

        using (var stream = request.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
        }

        var response = (HttpWebResponse)request.GetResponse();
        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

        Console.WriteLine(responseString);    
        Console.ReadLine();
    }

    public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
    {
        Console.Write(Encoding.UTF8.GetString(buf));
        return size * nmemb;
    }

    public static Int32 OnHeaderData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
    {
        var userData = (string)extraData;
        Console.Write("->"+Encoding.UTF8.GetString(buf));
        return size * nmemb;
    }

    public static void OnDebug(CurlInfoType infoType, String msg, Object extraData)
    {
        // print out received data only
        if (infoType == CurlInfoType.DataIn)
            Console.WriteLine(msg);
    }


    public static void Testowuec()
    {

    }
}

}

And here are the results:

Test curl 64 bit
Curl Version: libcurl/7.23.1 OpenSSL/1.0.1e zlib/1.2.8

========== TEST 1 CurlEasy Post ============
Array
(
)
User-Agent: MyUserAgent CurlEasy Post
Host: xxxxx.com
Accept: /
Content-Length: 1
Content-Type: application/x-www-form-urlencoded

========== TEST 2 CurlEasy HttpPost ============
Array
(
)
User-Agent: MyUserAgent CurlEasy HttpPost
Host: xxxxx.com
Accept: /
Content-Length: 0

========== TEST 3 HttpWebRequest ============
Array
(
[parm1] => value1
[parm2] => value2
)
User-Agent: MyUserAgent HttpWebRequest
Content-Type: application/x-www-form-urlencoded
Host: xxxxx.com
Content-Length: 25
Expect: 100-continue
Connection: Keep-Alive

The POST receiver:

$value) { echo "$header: $value\n"; } ?>

As you can see only HttpWebRequest (TEST 3) sent POST data.
I'm not sure is some problem with CurlSharp, my code or sth else...

from curlsharp.

masroore avatar masroore commented on May 21, 2024

@mangusta @http200it The POST bug has been fixed for WIN64. Please see the newly added EasyPost sample application.

Expected outputs:

64-bit build:

Test curl 64 bit
Curl Version: libcurl/7.38.0 OpenSSL/1.0.1g zlib/1.2.8 WinIDN libssh2/1.4.3


========== TEST 1 HttpWebRequest ============
User-Agent: HttpWebRequest
Content-Type: application/x-www-form-urlencoded
Host: localhost
Content-Length: 38
Expect: 100-continue
Connection: Keep-Alive

Array
(
    [parm1] => 12345
    [parm2] => "Hello world!"
)


========== TEST 2 CurlEasy PostFields ============
User-Agent: CurlEasy PostFields
Host: localhost
Accept: */*
Content-Length: 38
Content-Type: application/x-www-form-urlencoded

Array
(
    [parm1] => 12345
    [parm2] => "Hello world!"
)
Press <ENTER> to exit...

32-bit build utilizing libcurlshim.dll:

Test curl 32 bit
Curl Version: libcurl/7.38.0 OpenSSL/1.0.1g zlib/1.2.8 WinIDN libssh2/1.4.3


========== TEST 1 HttpWebRequest ============
User-Agent: HttpWebRequest
Content-Type: application/x-www-form-urlencoded
Host: localhost
Content-Length: 38
Expect: 100-continue
Connection: Keep-Alive

Array
(
    [parm1] => 12345
    [parm2] => "Hello world!"
)


========== TEST 2 CurlEasy PostFields ============
User-Agent: CurlEasy PostFields
Host: localhost
Accept: */*
Content-Length: 38
Content-Type: application/x-www-form-urlencoded

Array
(
    [parm1] => 12345
    [parm2] => "Hello world!"
)

========== TEST 3 CurlEasy HttpPost ============
User-Agent: CurlEasy HttpPost
Host: localhost
Accept: */*
Content-Length: 246
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------226a2f4ded940c61

Array
(
    [parm1] => value1
    [parm2] => value2
)
Press <ENTER> to exit...

from curlsharp.

http200it avatar http200it commented on May 21, 2024

Thank you very much for improving CurlSharp 64 bit for POST - PostFields.
:-)

from curlsharp.

masroore avatar masroore commented on May 21, 2024

@http200it 32-bit build of CurlSharp uses the libcurlshim.dll helper library which was originally authored by Jeff Phillips. Unfortunately, this library was not ported to WIN64. I'm of little help in this regard as my C and assembly language skills are rusty. The CurlHttpMultiPartForm class is dependent on libcurlshim.dll and does not yet work in non-WIN32 builds.

from curlsharp.

http200it avatar http200it commented on May 21, 2024

@ masroore - It is important that it works the ability to send POST data under Linux 64 Bit Net MONO. The primary concern ;)

from curlsharp.

masroore avatar masroore commented on May 21, 2024

@http200it @mangusta Now the 64-bit HttpPost (multipart form-data) feature works without libcurlshim helper library.

Output from the EasyPost sample:

Test curl 64 bit
Curl Version: libcurl/7.38.0 OpenSSL/1.0.1g zlib/1.2.8 WinIDN libssh2/1.4.3


========== TEST 1 HttpWebRequest ============
User-Agent: HttpWebRequest
Content-Type: application/x-www-form-urlencoded
Host: localhost
Content-Length: 32
Expect: 100-continue
Connection: Keep-Alive

Array
(
    [parm1] => 12345
    [parm2] => Hello world!
)


========== TEST 2 CurlEasy PostFields ============
User-Agent: CurlEasy PostFields
Host: localhost
Accept: */*
Content-Length: 32
Content-Type: application/x-www-form-urlencoded

Array
(
    [parm1] => 12345
    [parm2] => Hello world!
)

========== TEST 3 CurlEasy HttpPost ============
User-Agent: CurlEasy HttpPost
Host: localhost
Accept: */*
Content-Length: 251
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------a61b6eaa416a1e00

Array
(
    [parm1] => 12345
    [parm2] => Hello world!
)

Press <ENTER> to exit...

from curlsharp.

http200it avatar http200it commented on May 21, 2024

It works by sending a POST easy.PostFields and easy.HttpPost on Windows 64 Bit and Linux Debian 7 64 Bit - Mono 3.8. Once again, thank you very much for improving the code.

@masroore - you are great ! -> Thank you :)

from curlsharp.

masroore avatar masroore commented on May 21, 2024

@http200it Thanks for confirming the fix on 64-bit Linux. I confirm the PostFields and HttpPost features work on OS X Xamarin as well.

from curlsharp.

http200it avatar http200it commented on May 21, 2024

Even setting the parameters works and does not work. I think it should work interchangeably so and so.

//easy.UserAgent = "Do UserAgent"; // Works
easy.SetOpt(CurlOption.UserAgent, "Do UserAgent SetOpt"); // Does not work

//easy.Proxy = "xxx.xxx.xxx.xxx:21320"; // Works
easy.SetOpt(CurlOption.Proxy, "xxx.xxx.xxx.xxx:21320"); // Does not work

//easy.PostFields = postData; // Works :)
easy.SetOpt(CurlOption.PostFields, postData); // Does not work

//easy.Encoding = "gzip, deflate"; // Works
easy.SetOpt(CurlOption.Encoding, "gzip, deflate"); // Does not work

easy.FollowLocation = true; // Works or
easy.SetOpt(CurlOption.FollowLocation, true); // Works

At the time, please check yourself/

from curlsharp.

masroore avatar masroore commented on May 21, 2024

@http200it Thanks for reporting the bug. String options were not set properly in the setObjectOptions() method.
Issue #2 is now fixed.

from curlsharp.

http200it avatar http200it commented on May 21, 2024

@masroore - Now the function easy.SetOpt (CurlOption. **, ***); works as it should.
Tested on Windows 64bit and Linix 64bit mono.
Thanks again for the quick improvement and help :-)

from curlsharp.

mangusta avatar mangusta commented on May 21, 2024

@masroore thank you very much for your intervention and for whole great job! It's working now. All the best!

from curlsharp.

hieple avatar hieple commented on May 21, 2024

Love curl and this .NET port.

However, I try to set option
easy.SetOpt(CurlOption.HttpHeader, "application/soap+xml; charset=utf-8");

but it always shows content-type:
application/x-www-form-urlencoded

from curlsharp.

masroore avatar masroore commented on May 21, 2024

@hieple Are you trying to set the content-type header? You can use the ContentType property:

easy.ContentType = "application/soap+xml; charset=utf-8";

FYI, CurlOption.HttpHeader takes a linked list of strings.

from curlsharp.

hieple avatar hieple commented on May 21, 2024

But easy.ContentType is read-only

from curlsharp.

http200it avatar http200it commented on May 21, 2024

Hello again. It does not work to send a file or send wrong? My test code:
string avatar = Application.StartupPath + @"\avatary\myface.jpg";
var mf = new CurlHttpMultiPartForm();
mf.AddSection(CurlFormOption.CopyName, "parm1", CurlFormOption.CopyContents, "value1", CurlFormOption.End);
mf.AddSection(CurlFormOption.CopyName, "parm2", CurlFormOption.CopyContents, "value2", CurlFormOption.End);
if (File.Exists(avatar))
{
mf.AddSection(CurlFormOption.CopyName, "uploadedfile", CurlFormOption.File, avatar, CurlFormOption.ContentType, "application/octet-stream", CurlFormOption.End);
Console.WriteLine(avatar);
}
easy.HttpPost = mf;

$value) { echo "$header: $value \r\n"; } ?>

My OUT:
Array
(
[parm1] => value1
[parm2] => value2
)
Array
(
)
Host: www.testsite.com
Connection: close
Content-Length: 246
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
Accept-Encoding: gzip,deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Cache-Control: max-age=0
Pragma: no-cache
Content-Type: multipart/form-data; boundary=------------------------e489e380b38b4322

from curlsharp.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.