cURL <- feature












6















$ cat file | curl -F 'sprunge=<-' http://sprunge.us


So the output of echo gets passed as a POST parameter to cURL. Is this a cURL specific feature?










share|improve this question

























  • You can use curl -F 'sprunge=<file' http://sprunge.us instead.

    – user26112
    Jul 22 '13 at 4:53


















6















$ cat file | curl -F 'sprunge=<-' http://sprunge.us


So the output of echo gets passed as a POST parameter to cURL. Is this a cURL specific feature?










share|improve this question

























  • You can use curl -F 'sprunge=<file' http://sprunge.us instead.

    – user26112
    Jul 22 '13 at 4:53
















6












6








6


2






$ cat file | curl -F 'sprunge=<-' http://sprunge.us


So the output of echo gets passed as a POST parameter to cURL. Is this a cURL specific feature?










share|improve this question
















$ cat file | curl -F 'sprunge=<-' http://sprunge.us


So the output of echo gets passed as a POST parameter to cURL. Is this a cURL specific feature?







command-line curl






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jul 22 '13 at 4:40







Jürgen Paul

















asked Jul 22 '13 at 4:17









Jürgen PaulJürgen Paul

227138




227138













  • You can use curl -F 'sprunge=<file' http://sprunge.us instead.

    – user26112
    Jul 22 '13 at 4:53





















  • You can use curl -F 'sprunge=<file' http://sprunge.us instead.

    – user26112
    Jul 22 '13 at 4:53



















You can use curl -F 'sprunge=<file' http://sprunge.us instead.

– user26112
Jul 22 '13 at 4:53







You can use curl -F 'sprunge=<file' http://sprunge.us instead.

– user26112
Jul 22 '13 at 4:53












2 Answers
2






active

oldest

votes


















6














- is commonly used to represent standard input and < is commonly used to
represent redirection from a file. I believe those syntaxes come from early
shells. Together, they imply taking in standard input and sending/redirecting
it elsewhere. The syntax is almost natural.



Looking at the cURL revision history,
the < syntax was added to cURL in mid-2000. The revision that added this
feature is available as Git commit 5b7a5046e6.



From the changelog,



Torsten Foertsch <torsten.foertsch at gmx.net> brought a set of fixes for
the rfc1867 form posts. He introduced 'name=<file' which brings a means to
suuply very large text chunks read from the given file name. It differs from
'name=@file' in the way that this latter thing is marked in the uploaded
contents as a file upload, while the first is just text (as in a input or
textarea field). Torsten also corrected a bug that would happen if you used
%s or similar in a -F file name.


There is no mention of the inspiration or origin of this feature.



The @- syntax was present in cURL in the earliest version of the source I
could find. From the first revision in late 1999,



/* postfield data */
if('@' == *nextarg) {
/* the data begins with a '@' letter, it means that a file name
or - (stdin) follows */
FILE *file;
nextarg++; /* pass the @ */


It's difficult to determine if it is cURL-specific. The syntax is common and
natural. The cURL feature with which it is associated is a base feature of
cURL. Tools similar to cURL are likely to implement some form if it.





The original question asked about



$ echo foo | curl -d 'sprunge=<-' http://sprunge.us


Here was my answer:



I do not believe that is a feature of cURL.



$ # Terminal A
$ curl --version
curl 7.31.0 (x86_64-unknown-linux-gnu) libcurl/7.31.0 OpenSSL/1.0.1e zlib/1.2.8 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
$
$ echo foo | curl -d 'sprunge=<-' localhost:2222

$ # Terminal B
$ nc -l 2222
POST / HTTP/1.1
User-Agent: curl/7.31.0
Host: localhost:2222
Accept: */*
Content-Length: 7
Content-Type: application/x-www-form-urlencoded

sprunge=<-


I couldn't find any mention of this feature in the cURL documentation. There is a similar feature though.




If you start the data with the letter @, the rest should be a file name to
read the data from, or - if you want curl to read the data from stdin. The
contents of the file must already be URL-encoded. Multiple files can also be
specified. Posting data from a file named 'foobar' would thus be done with
--data @foobar.







share|improve this answer


























  • Sorry, I didn't copy the exact output. I ran it with the word test but tried to modify it to reflect the question. I've fixed my answer.

    – user26112
    Jul 22 '13 at 4:31













  • Yeah I could tell you were refining the answer, just pointing that stuff out. I liked your idea in using nc to test this. I always forget about little nc.

    – slm
    Jul 22 '13 at 4:33













  • It's in my man page. Look for -d. I hope you don't mind, I didn't understand what the "sprunge=<-" was until I saw your answer and realized it was data being sent in the POST.

    – slm
    Jul 22 '13 at 4:36













  • @slm: Thanks for pointing things out. I appreciate it.

    – user26112
    Jul 22 '13 at 4:38











  • Sorry, wrong command.

    – Jürgen Paul
    Jul 22 '13 at 4:40



















0














Spying on curl with socat



The updated question regarding this command:



$ cat file | curl -F 'sprunge=<-' http://sprunge.us


Is doing several things. Using socat we can spy on the request like so in one terminal:



$ socat - TCP4-LISTEN:2222,fork | grep -E 'Content-Disp|msg'


Now in a second terminal we'll use your curl command to connect to our socat daemon. For the cat file we're going to use this as our sample file:



$ cat hello.txt
msg: hello curl


And when we curl:



$ cat ~/hello.txt | curl -Fblah=<- localhost:2222


We see this in the socat output:



Content-Disposition: form-data; name="blah"
msg: hello curl


If we change the string from blah to a - we'll see the following:



$ cat ~/hello.txt | curl -F-=<- localhost:2222


Result:



Content-Disposition: form-data; name="-"


So as we can see, the argument after the initial -F is the name of the form we want to submit against. The man page for curl mentions that-F` is for submitting a HTTP form where we want to specify the name:



 -F, --form <name=content>
(HTTP) This lets curl emulate a filled-in form in which a user
has pressed the submit button. This causes curl to POST data using
the Content-Type multipart/form-data according to RFC 2388.
This enables uploading of binary files etc. To force the 'content'
part to be a file, prefix the file name with an @ sign.
To just get the content part from a file, prefix the file
name with the symbol <. The difference between @ and < is then
that @ makes a file get attached in the post as a file upload,
while the < makes a text field and just get the contents for that
text field from a file.


The rest of the switches to the -F-= switch are connecting the STDIN input to this argument. <-. STDIN will contain a stream of the content coming in via the cat file |.



Comparing args - '-F-=<-' vs. -F-=<-



These 2 notations are identical. Again we can use additional verbosity to see what's happening.



$ set -x; cat ~/hello.txt | curl '-F-=<-' localhost:2222; set +x
...
+ cat /Users/smingolelli/hello.txt
+ curl '-F-=<-' localhost:2222


Whereas the other method:



$ set -x; cat ~/hello.txt | curl -F-=<- localhost:2222; set +x
...
+ cat /Users/smingolelli/hello.txt
+ curl '-F-=<-' localhost:2222


People like to use the first method because it saves them an extra character in typing it. But from curl's perspective, they're identical. All that -F-=<- is doing is escaping the redirect so that curl gets to see it instead of the shell processing it.





Original Quesiton



The original question asked about this:



$ echo foo | curl -d 'sprunge=<-' http://sprunge.us


To which I answered:



When you use the switch -d to curl you're implying a POST, from the curl man page.



-d/--data <data>
(HTTP) Sends the specified data in a POST request to the HTTP server,
in the same way that a browser does when a user has filled in an
HTML form and presses the submit button. This will cause curl to pass
the data to the server using the content-type
application/x-www-form-urlencoded. Compare to -F/--form.





share|improve this answer

























    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "106"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f83911%2fcurl-feature%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    6














    - is commonly used to represent standard input and < is commonly used to
    represent redirection from a file. I believe those syntaxes come from early
    shells. Together, they imply taking in standard input and sending/redirecting
    it elsewhere. The syntax is almost natural.



    Looking at the cURL revision history,
    the < syntax was added to cURL in mid-2000. The revision that added this
    feature is available as Git commit 5b7a5046e6.



    From the changelog,



    Torsten Foertsch <torsten.foertsch at gmx.net> brought a set of fixes for
    the rfc1867 form posts. He introduced 'name=<file' which brings a means to
    suuply very large text chunks read from the given file name. It differs from
    'name=@file' in the way that this latter thing is marked in the uploaded
    contents as a file upload, while the first is just text (as in a input or
    textarea field). Torsten also corrected a bug that would happen if you used
    %s or similar in a -F file name.


    There is no mention of the inspiration or origin of this feature.



    The @- syntax was present in cURL in the earliest version of the source I
    could find. From the first revision in late 1999,



    /* postfield data */
    if('@' == *nextarg) {
    /* the data begins with a '@' letter, it means that a file name
    or - (stdin) follows */
    FILE *file;
    nextarg++; /* pass the @ */


    It's difficult to determine if it is cURL-specific. The syntax is common and
    natural. The cURL feature with which it is associated is a base feature of
    cURL. Tools similar to cURL are likely to implement some form if it.





    The original question asked about



    $ echo foo | curl -d 'sprunge=<-' http://sprunge.us


    Here was my answer:



    I do not believe that is a feature of cURL.



    $ # Terminal A
    $ curl --version
    curl 7.31.0 (x86_64-unknown-linux-gnu) libcurl/7.31.0 OpenSSL/1.0.1e zlib/1.2.8 libssh2/1.4.3
    Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
    Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
    $
    $ echo foo | curl -d 'sprunge=<-' localhost:2222

    $ # Terminal B
    $ nc -l 2222
    POST / HTTP/1.1
    User-Agent: curl/7.31.0
    Host: localhost:2222
    Accept: */*
    Content-Length: 7
    Content-Type: application/x-www-form-urlencoded

    sprunge=<-


    I couldn't find any mention of this feature in the cURL documentation. There is a similar feature though.




    If you start the data with the letter @, the rest should be a file name to
    read the data from, or - if you want curl to read the data from stdin. The
    contents of the file must already be URL-encoded. Multiple files can also be
    specified. Posting data from a file named 'foobar' would thus be done with
    --data @foobar.







    share|improve this answer


























    • Sorry, I didn't copy the exact output. I ran it with the word test but tried to modify it to reflect the question. I've fixed my answer.

      – user26112
      Jul 22 '13 at 4:31













    • Yeah I could tell you were refining the answer, just pointing that stuff out. I liked your idea in using nc to test this. I always forget about little nc.

      – slm
      Jul 22 '13 at 4:33













    • It's in my man page. Look for -d. I hope you don't mind, I didn't understand what the "sprunge=<-" was until I saw your answer and realized it was data being sent in the POST.

      – slm
      Jul 22 '13 at 4:36













    • @slm: Thanks for pointing things out. I appreciate it.

      – user26112
      Jul 22 '13 at 4:38











    • Sorry, wrong command.

      – Jürgen Paul
      Jul 22 '13 at 4:40
















    6














    - is commonly used to represent standard input and < is commonly used to
    represent redirection from a file. I believe those syntaxes come from early
    shells. Together, they imply taking in standard input and sending/redirecting
    it elsewhere. The syntax is almost natural.



    Looking at the cURL revision history,
    the < syntax was added to cURL in mid-2000. The revision that added this
    feature is available as Git commit 5b7a5046e6.



    From the changelog,



    Torsten Foertsch <torsten.foertsch at gmx.net> brought a set of fixes for
    the rfc1867 form posts. He introduced 'name=<file' which brings a means to
    suuply very large text chunks read from the given file name. It differs from
    'name=@file' in the way that this latter thing is marked in the uploaded
    contents as a file upload, while the first is just text (as in a input or
    textarea field). Torsten also corrected a bug that would happen if you used
    %s or similar in a -F file name.


    There is no mention of the inspiration or origin of this feature.



    The @- syntax was present in cURL in the earliest version of the source I
    could find. From the first revision in late 1999,



    /* postfield data */
    if('@' == *nextarg) {
    /* the data begins with a '@' letter, it means that a file name
    or - (stdin) follows */
    FILE *file;
    nextarg++; /* pass the @ */


    It's difficult to determine if it is cURL-specific. The syntax is common and
    natural. The cURL feature with which it is associated is a base feature of
    cURL. Tools similar to cURL are likely to implement some form if it.





    The original question asked about



    $ echo foo | curl -d 'sprunge=<-' http://sprunge.us


    Here was my answer:



    I do not believe that is a feature of cURL.



    $ # Terminal A
    $ curl --version
    curl 7.31.0 (x86_64-unknown-linux-gnu) libcurl/7.31.0 OpenSSL/1.0.1e zlib/1.2.8 libssh2/1.4.3
    Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
    Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
    $
    $ echo foo | curl -d 'sprunge=<-' localhost:2222

    $ # Terminal B
    $ nc -l 2222
    POST / HTTP/1.1
    User-Agent: curl/7.31.0
    Host: localhost:2222
    Accept: */*
    Content-Length: 7
    Content-Type: application/x-www-form-urlencoded

    sprunge=<-


    I couldn't find any mention of this feature in the cURL documentation. There is a similar feature though.




    If you start the data with the letter @, the rest should be a file name to
    read the data from, or - if you want curl to read the data from stdin. The
    contents of the file must already be URL-encoded. Multiple files can also be
    specified. Posting data from a file named 'foobar' would thus be done with
    --data @foobar.







    share|improve this answer


























    • Sorry, I didn't copy the exact output. I ran it with the word test but tried to modify it to reflect the question. I've fixed my answer.

      – user26112
      Jul 22 '13 at 4:31













    • Yeah I could tell you were refining the answer, just pointing that stuff out. I liked your idea in using nc to test this. I always forget about little nc.

      – slm
      Jul 22 '13 at 4:33













    • It's in my man page. Look for -d. I hope you don't mind, I didn't understand what the "sprunge=<-" was until I saw your answer and realized it was data being sent in the POST.

      – slm
      Jul 22 '13 at 4:36













    • @slm: Thanks for pointing things out. I appreciate it.

      – user26112
      Jul 22 '13 at 4:38











    • Sorry, wrong command.

      – Jürgen Paul
      Jul 22 '13 at 4:40














    6












    6








    6







    - is commonly used to represent standard input and < is commonly used to
    represent redirection from a file. I believe those syntaxes come from early
    shells. Together, they imply taking in standard input and sending/redirecting
    it elsewhere. The syntax is almost natural.



    Looking at the cURL revision history,
    the < syntax was added to cURL in mid-2000. The revision that added this
    feature is available as Git commit 5b7a5046e6.



    From the changelog,



    Torsten Foertsch <torsten.foertsch at gmx.net> brought a set of fixes for
    the rfc1867 form posts. He introduced 'name=<file' which brings a means to
    suuply very large text chunks read from the given file name. It differs from
    'name=@file' in the way that this latter thing is marked in the uploaded
    contents as a file upload, while the first is just text (as in a input or
    textarea field). Torsten also corrected a bug that would happen if you used
    %s or similar in a -F file name.


    There is no mention of the inspiration or origin of this feature.



    The @- syntax was present in cURL in the earliest version of the source I
    could find. From the first revision in late 1999,



    /* postfield data */
    if('@' == *nextarg) {
    /* the data begins with a '@' letter, it means that a file name
    or - (stdin) follows */
    FILE *file;
    nextarg++; /* pass the @ */


    It's difficult to determine if it is cURL-specific. The syntax is common and
    natural. The cURL feature with which it is associated is a base feature of
    cURL. Tools similar to cURL are likely to implement some form if it.





    The original question asked about



    $ echo foo | curl -d 'sprunge=<-' http://sprunge.us


    Here was my answer:



    I do not believe that is a feature of cURL.



    $ # Terminal A
    $ curl --version
    curl 7.31.0 (x86_64-unknown-linux-gnu) libcurl/7.31.0 OpenSSL/1.0.1e zlib/1.2.8 libssh2/1.4.3
    Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
    Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
    $
    $ echo foo | curl -d 'sprunge=<-' localhost:2222

    $ # Terminal B
    $ nc -l 2222
    POST / HTTP/1.1
    User-Agent: curl/7.31.0
    Host: localhost:2222
    Accept: */*
    Content-Length: 7
    Content-Type: application/x-www-form-urlencoded

    sprunge=<-


    I couldn't find any mention of this feature in the cURL documentation. There is a similar feature though.




    If you start the data with the letter @, the rest should be a file name to
    read the data from, or - if you want curl to read the data from stdin. The
    contents of the file must already be URL-encoded. Multiple files can also be
    specified. Posting data from a file named 'foobar' would thus be done with
    --data @foobar.







    share|improve this answer















    - is commonly used to represent standard input and < is commonly used to
    represent redirection from a file. I believe those syntaxes come from early
    shells. Together, they imply taking in standard input and sending/redirecting
    it elsewhere. The syntax is almost natural.



    Looking at the cURL revision history,
    the < syntax was added to cURL in mid-2000. The revision that added this
    feature is available as Git commit 5b7a5046e6.



    From the changelog,



    Torsten Foertsch <torsten.foertsch at gmx.net> brought a set of fixes for
    the rfc1867 form posts. He introduced 'name=<file' which brings a means to
    suuply very large text chunks read from the given file name. It differs from
    'name=@file' in the way that this latter thing is marked in the uploaded
    contents as a file upload, while the first is just text (as in a input or
    textarea field). Torsten also corrected a bug that would happen if you used
    %s or similar in a -F file name.


    There is no mention of the inspiration or origin of this feature.



    The @- syntax was present in cURL in the earliest version of the source I
    could find. From the first revision in late 1999,



    /* postfield data */
    if('@' == *nextarg) {
    /* the data begins with a '@' letter, it means that a file name
    or - (stdin) follows */
    FILE *file;
    nextarg++; /* pass the @ */


    It's difficult to determine if it is cURL-specific. The syntax is common and
    natural. The cURL feature with which it is associated is a base feature of
    cURL. Tools similar to cURL are likely to implement some form if it.





    The original question asked about



    $ echo foo | curl -d 'sprunge=<-' http://sprunge.us


    Here was my answer:



    I do not believe that is a feature of cURL.



    $ # Terminal A
    $ curl --version
    curl 7.31.0 (x86_64-unknown-linux-gnu) libcurl/7.31.0 OpenSSL/1.0.1e zlib/1.2.8 libssh2/1.4.3
    Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
    Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
    $
    $ echo foo | curl -d 'sprunge=<-' localhost:2222

    $ # Terminal B
    $ nc -l 2222
    POST / HTTP/1.1
    User-Agent: curl/7.31.0
    Host: localhost:2222
    Accept: */*
    Content-Length: 7
    Content-Type: application/x-www-form-urlencoded

    sprunge=<-


    I couldn't find any mention of this feature in the cURL documentation. There is a similar feature though.




    If you start the data with the letter @, the rest should be a file name to
    read the data from, or - if you want curl to read the data from stdin. The
    contents of the file must already be URL-encoded. Multiple files can also be
    specified. Posting data from a file named 'foobar' would thus be done with
    --data @foobar.








    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Oct 28 '13 at 22:00

























    answered Jul 22 '13 at 4:27







    user26112




















    • Sorry, I didn't copy the exact output. I ran it with the word test but tried to modify it to reflect the question. I've fixed my answer.

      – user26112
      Jul 22 '13 at 4:31













    • Yeah I could tell you were refining the answer, just pointing that stuff out. I liked your idea in using nc to test this. I always forget about little nc.

      – slm
      Jul 22 '13 at 4:33













    • It's in my man page. Look for -d. I hope you don't mind, I didn't understand what the "sprunge=<-" was until I saw your answer and realized it was data being sent in the POST.

      – slm
      Jul 22 '13 at 4:36













    • @slm: Thanks for pointing things out. I appreciate it.

      – user26112
      Jul 22 '13 at 4:38











    • Sorry, wrong command.

      – Jürgen Paul
      Jul 22 '13 at 4:40



















    • Sorry, I didn't copy the exact output. I ran it with the word test but tried to modify it to reflect the question. I've fixed my answer.

      – user26112
      Jul 22 '13 at 4:31













    • Yeah I could tell you were refining the answer, just pointing that stuff out. I liked your idea in using nc to test this. I always forget about little nc.

      – slm
      Jul 22 '13 at 4:33













    • It's in my man page. Look for -d. I hope you don't mind, I didn't understand what the "sprunge=<-" was until I saw your answer and realized it was data being sent in the POST.

      – slm
      Jul 22 '13 at 4:36













    • @slm: Thanks for pointing things out. I appreciate it.

      – user26112
      Jul 22 '13 at 4:38











    • Sorry, wrong command.

      – Jürgen Paul
      Jul 22 '13 at 4:40

















    Sorry, I didn't copy the exact output. I ran it with the word test but tried to modify it to reflect the question. I've fixed my answer.

    – user26112
    Jul 22 '13 at 4:31







    Sorry, I didn't copy the exact output. I ran it with the word test but tried to modify it to reflect the question. I've fixed my answer.

    – user26112
    Jul 22 '13 at 4:31















    Yeah I could tell you were refining the answer, just pointing that stuff out. I liked your idea in using nc to test this. I always forget about little nc.

    – slm
    Jul 22 '13 at 4:33







    Yeah I could tell you were refining the answer, just pointing that stuff out. I liked your idea in using nc to test this. I always forget about little nc.

    – slm
    Jul 22 '13 at 4:33















    It's in my man page. Look for -d. I hope you don't mind, I didn't understand what the "sprunge=<-" was until I saw your answer and realized it was data being sent in the POST.

    – slm
    Jul 22 '13 at 4:36







    It's in my man page. Look for -d. I hope you don't mind, I didn't understand what the "sprunge=<-" was until I saw your answer and realized it was data being sent in the POST.

    – slm
    Jul 22 '13 at 4:36















    @slm: Thanks for pointing things out. I appreciate it.

    – user26112
    Jul 22 '13 at 4:38





    @slm: Thanks for pointing things out. I appreciate it.

    – user26112
    Jul 22 '13 at 4:38













    Sorry, wrong command.

    – Jürgen Paul
    Jul 22 '13 at 4:40





    Sorry, wrong command.

    – Jürgen Paul
    Jul 22 '13 at 4:40













    0














    Spying on curl with socat



    The updated question regarding this command:



    $ cat file | curl -F 'sprunge=<-' http://sprunge.us


    Is doing several things. Using socat we can spy on the request like so in one terminal:



    $ socat - TCP4-LISTEN:2222,fork | grep -E 'Content-Disp|msg'


    Now in a second terminal we'll use your curl command to connect to our socat daemon. For the cat file we're going to use this as our sample file:



    $ cat hello.txt
    msg: hello curl


    And when we curl:



    $ cat ~/hello.txt | curl -Fblah=<- localhost:2222


    We see this in the socat output:



    Content-Disposition: form-data; name="blah"
    msg: hello curl


    If we change the string from blah to a - we'll see the following:



    $ cat ~/hello.txt | curl -F-=<- localhost:2222


    Result:



    Content-Disposition: form-data; name="-"


    So as we can see, the argument after the initial -F is the name of the form we want to submit against. The man page for curl mentions that-F` is for submitting a HTTP form where we want to specify the name:



     -F, --form <name=content>
    (HTTP) This lets curl emulate a filled-in form in which a user
    has pressed the submit button. This causes curl to POST data using
    the Content-Type multipart/form-data according to RFC 2388.
    This enables uploading of binary files etc. To force the 'content'
    part to be a file, prefix the file name with an @ sign.
    To just get the content part from a file, prefix the file
    name with the symbol <. The difference between @ and < is then
    that @ makes a file get attached in the post as a file upload,
    while the < makes a text field and just get the contents for that
    text field from a file.


    The rest of the switches to the -F-= switch are connecting the STDIN input to this argument. <-. STDIN will contain a stream of the content coming in via the cat file |.



    Comparing args - '-F-=<-' vs. -F-=<-



    These 2 notations are identical. Again we can use additional verbosity to see what's happening.



    $ set -x; cat ~/hello.txt | curl '-F-=<-' localhost:2222; set +x
    ...
    + cat /Users/smingolelli/hello.txt
    + curl '-F-=<-' localhost:2222


    Whereas the other method:



    $ set -x; cat ~/hello.txt | curl -F-=<- localhost:2222; set +x
    ...
    + cat /Users/smingolelli/hello.txt
    + curl '-F-=<-' localhost:2222


    People like to use the first method because it saves them an extra character in typing it. But from curl's perspective, they're identical. All that -F-=<- is doing is escaping the redirect so that curl gets to see it instead of the shell processing it.





    Original Quesiton



    The original question asked about this:



    $ echo foo | curl -d 'sprunge=<-' http://sprunge.us


    To which I answered:



    When you use the switch -d to curl you're implying a POST, from the curl man page.



    -d/--data <data>
    (HTTP) Sends the specified data in a POST request to the HTTP server,
    in the same way that a browser does when a user has filled in an
    HTML form and presses the submit button. This will cause curl to pass
    the data to the server using the content-type
    application/x-www-form-urlencoded. Compare to -F/--form.





    share|improve this answer






























      0














      Spying on curl with socat



      The updated question regarding this command:



      $ cat file | curl -F 'sprunge=<-' http://sprunge.us


      Is doing several things. Using socat we can spy on the request like so in one terminal:



      $ socat - TCP4-LISTEN:2222,fork | grep -E 'Content-Disp|msg'


      Now in a second terminal we'll use your curl command to connect to our socat daemon. For the cat file we're going to use this as our sample file:



      $ cat hello.txt
      msg: hello curl


      And when we curl:



      $ cat ~/hello.txt | curl -Fblah=<- localhost:2222


      We see this in the socat output:



      Content-Disposition: form-data; name="blah"
      msg: hello curl


      If we change the string from blah to a - we'll see the following:



      $ cat ~/hello.txt | curl -F-=<- localhost:2222


      Result:



      Content-Disposition: form-data; name="-"


      So as we can see, the argument after the initial -F is the name of the form we want to submit against. The man page for curl mentions that-F` is for submitting a HTTP form where we want to specify the name:



       -F, --form <name=content>
      (HTTP) This lets curl emulate a filled-in form in which a user
      has pressed the submit button. This causes curl to POST data using
      the Content-Type multipart/form-data according to RFC 2388.
      This enables uploading of binary files etc. To force the 'content'
      part to be a file, prefix the file name with an @ sign.
      To just get the content part from a file, prefix the file
      name with the symbol <. The difference between @ and < is then
      that @ makes a file get attached in the post as a file upload,
      while the < makes a text field and just get the contents for that
      text field from a file.


      The rest of the switches to the -F-= switch are connecting the STDIN input to this argument. <-. STDIN will contain a stream of the content coming in via the cat file |.



      Comparing args - '-F-=<-' vs. -F-=<-



      These 2 notations are identical. Again we can use additional verbosity to see what's happening.



      $ set -x; cat ~/hello.txt | curl '-F-=<-' localhost:2222; set +x
      ...
      + cat /Users/smingolelli/hello.txt
      + curl '-F-=<-' localhost:2222


      Whereas the other method:



      $ set -x; cat ~/hello.txt | curl -F-=<- localhost:2222; set +x
      ...
      + cat /Users/smingolelli/hello.txt
      + curl '-F-=<-' localhost:2222


      People like to use the first method because it saves them an extra character in typing it. But from curl's perspective, they're identical. All that -F-=<- is doing is escaping the redirect so that curl gets to see it instead of the shell processing it.





      Original Quesiton



      The original question asked about this:



      $ echo foo | curl -d 'sprunge=<-' http://sprunge.us


      To which I answered:



      When you use the switch -d to curl you're implying a POST, from the curl man page.



      -d/--data <data>
      (HTTP) Sends the specified data in a POST request to the HTTP server,
      in the same way that a browser does when a user has filled in an
      HTML form and presses the submit button. This will cause curl to pass
      the data to the server using the content-type
      application/x-www-form-urlencoded. Compare to -F/--form.





      share|improve this answer




























        0












        0








        0







        Spying on curl with socat



        The updated question regarding this command:



        $ cat file | curl -F 'sprunge=<-' http://sprunge.us


        Is doing several things. Using socat we can spy on the request like so in one terminal:



        $ socat - TCP4-LISTEN:2222,fork | grep -E 'Content-Disp|msg'


        Now in a second terminal we'll use your curl command to connect to our socat daemon. For the cat file we're going to use this as our sample file:



        $ cat hello.txt
        msg: hello curl


        And when we curl:



        $ cat ~/hello.txt | curl -Fblah=<- localhost:2222


        We see this in the socat output:



        Content-Disposition: form-data; name="blah"
        msg: hello curl


        If we change the string from blah to a - we'll see the following:



        $ cat ~/hello.txt | curl -F-=<- localhost:2222


        Result:



        Content-Disposition: form-data; name="-"


        So as we can see, the argument after the initial -F is the name of the form we want to submit against. The man page for curl mentions that-F` is for submitting a HTTP form where we want to specify the name:



         -F, --form <name=content>
        (HTTP) This lets curl emulate a filled-in form in which a user
        has pressed the submit button. This causes curl to POST data using
        the Content-Type multipart/form-data according to RFC 2388.
        This enables uploading of binary files etc. To force the 'content'
        part to be a file, prefix the file name with an @ sign.
        To just get the content part from a file, prefix the file
        name with the symbol <. The difference between @ and < is then
        that @ makes a file get attached in the post as a file upload,
        while the < makes a text field and just get the contents for that
        text field from a file.


        The rest of the switches to the -F-= switch are connecting the STDIN input to this argument. <-. STDIN will contain a stream of the content coming in via the cat file |.



        Comparing args - '-F-=<-' vs. -F-=<-



        These 2 notations are identical. Again we can use additional verbosity to see what's happening.



        $ set -x; cat ~/hello.txt | curl '-F-=<-' localhost:2222; set +x
        ...
        + cat /Users/smingolelli/hello.txt
        + curl '-F-=<-' localhost:2222


        Whereas the other method:



        $ set -x; cat ~/hello.txt | curl -F-=<- localhost:2222; set +x
        ...
        + cat /Users/smingolelli/hello.txt
        + curl '-F-=<-' localhost:2222


        People like to use the first method because it saves them an extra character in typing it. But from curl's perspective, they're identical. All that -F-=<- is doing is escaping the redirect so that curl gets to see it instead of the shell processing it.





        Original Quesiton



        The original question asked about this:



        $ echo foo | curl -d 'sprunge=<-' http://sprunge.us


        To which I answered:



        When you use the switch -d to curl you're implying a POST, from the curl man page.



        -d/--data <data>
        (HTTP) Sends the specified data in a POST request to the HTTP server,
        in the same way that a browser does when a user has filled in an
        HTML form and presses the submit button. This will cause curl to pass
        the data to the server using the content-type
        application/x-www-form-urlencoded. Compare to -F/--form.





        share|improve this answer















        Spying on curl with socat



        The updated question regarding this command:



        $ cat file | curl -F 'sprunge=<-' http://sprunge.us


        Is doing several things. Using socat we can spy on the request like so in one terminal:



        $ socat - TCP4-LISTEN:2222,fork | grep -E 'Content-Disp|msg'


        Now in a second terminal we'll use your curl command to connect to our socat daemon. For the cat file we're going to use this as our sample file:



        $ cat hello.txt
        msg: hello curl


        And when we curl:



        $ cat ~/hello.txt | curl -Fblah=<- localhost:2222


        We see this in the socat output:



        Content-Disposition: form-data; name="blah"
        msg: hello curl


        If we change the string from blah to a - we'll see the following:



        $ cat ~/hello.txt | curl -F-=<- localhost:2222


        Result:



        Content-Disposition: form-data; name="-"


        So as we can see, the argument after the initial -F is the name of the form we want to submit against. The man page for curl mentions that-F` is for submitting a HTTP form where we want to specify the name:



         -F, --form <name=content>
        (HTTP) This lets curl emulate a filled-in form in which a user
        has pressed the submit button. This causes curl to POST data using
        the Content-Type multipart/form-data according to RFC 2388.
        This enables uploading of binary files etc. To force the 'content'
        part to be a file, prefix the file name with an @ sign.
        To just get the content part from a file, prefix the file
        name with the symbol <. The difference between @ and < is then
        that @ makes a file get attached in the post as a file upload,
        while the < makes a text field and just get the contents for that
        text field from a file.


        The rest of the switches to the -F-= switch are connecting the STDIN input to this argument. <-. STDIN will contain a stream of the content coming in via the cat file |.



        Comparing args - '-F-=<-' vs. -F-=<-



        These 2 notations are identical. Again we can use additional verbosity to see what's happening.



        $ set -x; cat ~/hello.txt | curl '-F-=<-' localhost:2222; set +x
        ...
        + cat /Users/smingolelli/hello.txt
        + curl '-F-=<-' localhost:2222


        Whereas the other method:



        $ set -x; cat ~/hello.txt | curl -F-=<- localhost:2222; set +x
        ...
        + cat /Users/smingolelli/hello.txt
        + curl '-F-=<-' localhost:2222


        People like to use the first method because it saves them an extra character in typing it. But from curl's perspective, they're identical. All that -F-=<- is doing is escaping the redirect so that curl gets to see it instead of the shell processing it.





        Original Quesiton



        The original question asked about this:



        $ echo foo | curl -d 'sprunge=<-' http://sprunge.us


        To which I answered:



        When you use the switch -d to curl you're implying a POST, from the curl man page.



        -d/--data <data>
        (HTTP) Sends the specified data in a POST request to the HTTP server,
        in the same way that a browser does when a user has filled in an
        HTML form and presses the submit button. This will cause curl to pass
        the data to the server using the content-type
        application/x-www-form-urlencoded. Compare to -F/--form.






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Feb 6 at 4:11

























        answered Jul 22 '13 at 4:36









        slmslm

        251k69529685




        251k69529685






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Unix & Linux Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f83911%2fcurl-feature%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            How to make a Squid Proxy server?

            Is this a new Fibonacci Identity?

            19世紀