0

I have a curl statement that has -F in it. What do I need to do for cURL -F? I have been able to get -b to work by passing it into the header by adding the following to the code below request.Headers.Add(HttpRequestHeader.Cookie, (header));

For adding the documentfile and xml to the content variable I would do the following, however this does not work and gives an error. According to the vendor spec you have to have a space between xml= and the data.

byte[] byteData = Bytes.Combine(Bytes.ConvertToBytesUTF8("documentFile="), File.ReadAllBytes(file));
string postData = new StreamReader(file2).ReadToEnd();
postData = string.Format(postData, documentpath,folderid);
byteData = Bytes.Combine(byteData,Bytes.ConvertToBytesUTF8("xml= "));
byteData = Bytes.Combine(byteData,Bytes.ConvertToBytesUTF8(postData);
byte[] content = byteData;

public class Bytes
{
    public static byte[] ConvertToBytesUTF8(string postData)
    {
        byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(postData);
        return byteArray;
    }

    public static byte[] Combine(params byte[][] arrays)
    {
        byte[] rv = new byte[arrays.Sum(a => a.Length)];
        int offset = 0;
        foreach (byte[] array in arrays)
        {
            System.Buffer.BlockCopy(array, 0, rv, offset, array.Length);
            offset += array.Length;
        }
        return rv;
    }
}

If the curl contains -d instead of -F I have been doing the following passing the content as bytes into the variable content However, in any curl I have had to use it has only ever had 1 -d so I have never had to combine the bytes like I am doing above.

request = WebRequest.Create(connectionstring);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
if (content != null)
{
   request.ContentLength = content.Length;
}

Stream dataStream = request.GetRequestStream();

if (content!=null && content.Length > 0)
{
   dataStream.Write(content, 0, content.Length);
}

dataStream.Close();

WebResponse response = request.GetResponse();

dataStream = response.GetResponseStream();

StreamReader reader = new StreamReader (dataStream);

string responseReader = reader.ReadToEnd();

reader.Close();
dataStream.Close();
response.Close();

return responseReader;

What do I need to do for cURL -F? I tried using both the method of passing the data into the header and into the request and neither worked for passing the -F fields. I get errors from the receiver Ill-formed request parameter cannot be converted to Java field type. It says the problem is with documentFile. I am also combining both bytes for documentFile and xml portions back to back. Is this the issue? Do I need a separator of some kind in between? This is also the first time I've had more than one file to pass at a time.

Here is the curl statement I am interested in reproducing using a WebRequest

curl -k -X POST
-b "ssoGlobalSessionID=YOUR_SESSION_ID"
–F "documentFile=@/Users/User/Test.PDF"
–F "xml=XML_REQUEST.XML" 
"url"
2
  • Sounds like it could be an encoding problem. Could you post the datatype and how you populate the content variable? Commented Feb 17, 2015 at 21:57
  • Have updated code. Shows how I am combining files into bytes. Commented Feb 18, 2015 at 13:53

1 Answer 1

1

To replicate this statement in curl

curl -k -X POST
-b "ssoGlobalSessionID=YOUR_SESSION_ID"
–F "documentFile=@c:/Users/User/Test.PDF"
–F "xml=XML_REQUEST.XML" 
"url"

This is the code that works in C#

StringBuilder contents = new StringBuilder();
byte[] content=null;
string header = "ssoGlobalSessionID=YOUR_SESSION_ID";
string documentfile = "c:/Users/User/Test.PDF";
string filename = Path.GetFileName(file);
static string boundary = Guid.NewGuid().ToString();
WebRequest request = WebRequest.Create(url);
request.Method = "POST";
request.ContentType = string.Format("multipart/form-data; boundary={0}, boundary);
request.Headers.Add(HttpRequestHeader.Cookie, header);
AddContentFileCurl(File.ReadAllBytes(documentfile), "documentFile", filename);
AddContentFormCurl(System.Text.Encoding.ASCII.GetBytes("XMLMARKUP"),"xml");
LastFileAddedCurl();
if (content != null)
{
   request.ContentLength = content.Length;
}

Stream dataStream = request.GetRequestStream();

if (content!=null && content.Length > 0)
{
   dataStream.Write(content, 0, content.Length);
}

dataStream.Close();

WebResponse response = request.GetResponse();

dataStream = response.GetResponseStream();

StreamReader reader = new StreamReader (dataStream);

string responseReader = reader.ReadToEnd();

reader.Close();
dataStream.Close();
response.Close();

The 3 methods I created for this and one class I got from another post for MIMETypes I copied below.

public void AddContentFileCurl(byte[] file, string name, string filename)
    {
        string header = string.Format("--{0}", boundary);
        string fileContentType = MIMEAssistant.GetMIMEType(filename);                       
        contents.AppendLine(header);
        string fileHeader=String.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"",name,filename);
        string fileData = Encoding.UTF8.GetString(file);
        contents.AppendLine(fileHeader);
        contents.AppendLine(String.Format("Content-Type: {0}", fileContentType));
        contents.AppendLine();
        contents.AppendLine(fileData);
    }

public void AddContentFormCurl(byte[] file, string name)
    {
        string header = string.Format("--{0}", boundary);
        contents.AppendLine(header);
        string fileHeader = String.Format("Content-Disposition: form-data; name=\"{0}\"", name);
        string fileData = Encoding.UTF8.GetString(file);
        contents.AppendLine(fileHeader);
        contents.AppendLine();
        contents.AppendLine(fileData);
    }

public void LastFileAddedCurl()
    {
        string footer = string.Format("--{0}--", boundary);         
        contents.AppendLine(footer);
        string cstring = contents.ToString();
        byte[] bytes = Encoding.UTF8.GetBytes(cstring);
        if (content != null)
        {
            content = Bytes.Combine(content, bytes);
        }
        else
        {
            content = bytes;
        }
    }

MIMEtypes

public static class MIMEAssistant
{
    private static readonly Dictionary<string, string> MIMETypesDictionary = new Dictionary<string, string>
{
{"ai", "application/postscript"},
{"aif", "audio/x-aiff"},
{"aifc", "audio/x-aiff"},
{"aiff", "audio/x-aiff"},
{"asc", "text/plain"},
{"atom", "application/atom+xml"},
{"au", "audio/basic"},
{"avi", "video/x-msvideo"},
{"bcpio", "application/x-bcpio"},
{"bin", "application/octet-stream"},
{"bmp", "image/bmp"},
{"cdf", "application/x-netcdf"},
{"cgm", "image/cgm"},
{"class", "application/octet-stream"},
{"cpio", "application/x-cpio"},
{"cpt", "application/mac-compactpro"},
{"csh", "application/x-csh"},
{"css", "text/css"},
{"dcr", "application/x-director"},
{"dif", "video/x-dv"},
{"dir", "application/x-director"},
{"djv", "image/vnd.djvu"},
{"djvu", "image/vnd.djvu"},
{"dll", "application/octet-stream"},
{"dmg", "application/octet-stream"},
{"dms", "application/octet-stream"},
{"doc", "application/msword"},
{"docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
{"dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"},
{"docm","application/vnd.ms-word.document.macroEnabled.12"},
{"dotm","application/vnd.ms-word.template.macroEnabled.12"},
{"dtd", "application/xml-dtd"},
{"dv", "video/x-dv"},
{"dvi", "application/x-dvi"},
{"dxr", "application/x-director"},
{"eps", "application/postscript"},
{"etx", "text/x-setext"},
{"exe", "application/octet-stream"},
{"ez", "application/andrew-inset"},
{"gif", "image/gif"},
{"gram", "application/srgs"},
{"grxml", "application/srgs+xml"},
{"gtar", "application/x-gtar"},
{"hdf", "application/x-hdf"},
{"hqx", "application/mac-binhex40"},
{"htm", "text/html"},
{"html", "text/html"},
{"ice", "x-conference/x-cooltalk"},
{"ico", "image/x-icon"},
{"ics", "text/calendar"},
{"ief", "image/ief"},
{"ifb", "text/calendar"},
{"iges", "model/iges"},
{"igs", "model/iges"},
{"jnlp", "application/x-java-jnlp-file"},
{"jp2", "image/jp2"},
{"jpe", "image/jpeg"},
{"jpeg", "image/jpeg"},
{"jpg", "image/jpeg"},
{"js", "application/x-javascript"},
{"kar", "audio/midi"},
{"latex", "application/x-latex"},
{"lha", "application/octet-stream"},
{"lzh", "application/octet-stream"},
{"m3u", "audio/x-mpegurl"},
{"m4a", "audio/mp4a-latm"},
{"m4b", "audio/mp4a-latm"},
{"m4p", "audio/mp4a-latm"},
{"m4u", "video/vnd.mpegurl"},
{"m4v", "video/x-m4v"},
{"mac", "image/x-macpaint"},
{"man", "application/x-troff-man"},
{"mathml", "application/mathml+xml"},
{"me", "application/x-troff-me"},
{"mesh", "model/mesh"},
{"mid", "audio/midi"},
{"midi", "audio/midi"},
{"mif", "application/vnd.mif"},
{"mov", "video/quicktime"},
{"movie", "video/x-sgi-movie"},
{"mp2", "audio/mpeg"},
{"mp3", "audio/mpeg"},
{"mp4", "video/mp4"},
{"mpe", "video/mpeg"},
{"mpeg", "video/mpeg"},
{"mpg", "video/mpeg"},
{"mpga", "audio/mpeg"},
{"ms", "application/x-troff-ms"},
{"msh", "model/mesh"},
{"mxu", "video/vnd.mpegurl"},
{"nc", "application/x-netcdf"},
{"oda", "application/oda"},
{"ogg", "application/ogg"},
{"pbm", "image/x-portable-bitmap"},
{"pct", "image/pict"},
{"pdb", "chemical/x-pdb"},
{"pdf", "application/pdf"},
{"pgm", "image/x-portable-graymap"},
{"pgn", "application/x-chess-pgn"},
{"pic", "image/pict"},
{"pict", "image/pict"},
{"png", "image/png"}, 
{"pnm", "image/x-portable-anymap"},
{"pnt", "image/x-macpaint"},
{"pntg", "image/x-macpaint"},
{"ppm", "image/x-portable-pixmap"},
{"ppt", "application/vnd.ms-powerpoint"},
{"pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"},
{"potx","application/vnd.openxmlformats-officedocument.presentationml.template"},
{"ppsx","application/vnd.openxmlformats-officedocument.presentationml.slideshow"},
{"ppam","application/vnd.ms-powerpoint.addin.macroEnabled.12"},
{"pptm","application/vnd.ms-powerpoint.presentation.macroEnabled.12"},
{"potm","application/vnd.ms-powerpoint.template.macroEnabled.12"},
{"ppsm","application/vnd.ms-powerpoint.slideshow.macroEnabled.12"},
{"ps", "application/postscript"},
{"qt", "video/quicktime"},
{"qti", "image/x-quicktime"},
{"qtif", "image/x-quicktime"},
{"ra", "audio/x-pn-realaudio"},
{"ram", "audio/x-pn-realaudio"},
{"ras", "image/x-cmu-raster"},
{"rdf", "application/rdf+xml"},
{"rgb", "image/x-rgb"},
{"rm", "application/vnd.rn-realmedia"},
{"roff", "application/x-troff"},
{"rtf", "text/rtf"},
{"rtx", "text/richtext"},
{"sgm", "text/sgml"},
{"sgml", "text/sgml"},
{"sh", "application/x-sh"},
{"shar", "application/x-shar"},
{"silo", "model/mesh"},
{"sit", "application/x-stuffit"},
{"skd", "application/x-koan"},
{"skm", "application/x-koan"},
{"skp", "application/x-koan"},
{"skt", "application/x-koan"},
{"smi", "application/smil"},
{"smil", "application/smil"},
{"snd", "audio/basic"},
{"so", "application/octet-stream"},
{"spl", "application/x-futuresplash"},
{"src", "application/x-wais-source"},
{"sv4cpio", "application/x-sv4cpio"},
{"sv4crc", "application/x-sv4crc"},
{"svg", "image/svg+xml"},
{"swf", "application/x-shockwave-flash"},
{"t", "application/x-troff"},
{"tar", "application/x-tar"},
{"tcl", "application/x-tcl"},
{"tex", "application/x-tex"},
{"texi", "application/x-texinfo"},
{"texinfo", "application/x-texinfo"},
{"tif", "image/tiff"},
{"tiff", "image/tiff"},
{"tr", "application/x-troff"},
{"tsv", "text/tab-separated-values"},
{"txt", "text/plain"},
{"ustar", "application/x-ustar"},
{"vcd", "application/x-cdlink"},
{"vrml", "model/vrml"},
{"vxml", "application/voicexml+xml"},
{"wav", "audio/x-wav"},
{"wbmp", "image/vnd.wap.wbmp"},
{"wbmxl", "application/vnd.wap.wbxml"},
{"wml", "text/vnd.wap.wml"},
{"wmlc", "application/vnd.wap.wmlc"},
{"wmls", "text/vnd.wap.wmlscript"},
{"wmlsc", "application/vnd.wap.wmlscriptc"},
{"wrl", "model/vrml"},
{"xbm", "image/x-xbitmap"},
{"xht", "application/xhtml+xml"},
{"xhtml", "application/xhtml+xml"},
{"xls", "application/vnd.ms-excel"},                        
{"xml", "application/xml"},
{"xpm", "image/x-xpixmap"},
{"xsl", "application/xml"},
{"xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
{"xltx","application/vnd.openxmlformats-officedocument.spreadsheetml.template"},
{"xlsm","application/vnd.ms-excel.sheet.macroEnabled.12"},
{"xltm","application/vnd.ms-excel.template.macroEnabled.12"},
{"xlam","application/vnd.ms-excel.addin.macroEnabled.12"},
{"xlsb","application/vnd.ms-excel.sheet.binary.macroEnabled.12"},
{"xslt", "application/xslt+xml"},
{"xul", "application/vnd.mozilla.xul+xml"},
{"xwd", "image/x-xwindowdump"},
{"xyz", "chemical/x-xyz"},
{"zip", "application/zip"}
};

public static string GetMIMEType(string fileName)
{
        //get file extension
        string extension = Path.GetExtension(fileName).ToLowerInvariant();

        if (extension.Length > 0 &&
            MIMETypesDictionary.ContainsKey(extension.Remove(0, 1)))
        {
            return MIMETypesDictionary[extension.Remove(0, 1)];
        }
        return "unknown/unknown";
}
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.