http://www.perlmonks.org?node_id=248748

jerryodom has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to reproduce headers to submit to a form using HTTP::Request::Common. My problem is that I can't generate a proper Content-Type: multipart/form-data; boundary= header which is like the one Explorer gives. I haven't even come close. Can you help?

Note: I don't necessarily have to use HTTP::Request::Common I just need to generate the proper "boundary". If there is some other way then I'd appreciate hearing about that as well.

Here is the code, followed by my output, followed by the proper output. Many thanks in advance:

#the code #!/usr/bin/perl -w use HTTP::Request::Common; $request = HTTP::Request->new(); $request = POST '/database/some.php3', Referer => 'http://www.mydomain.com/some.php3', Accept_Language => 'en-us', Content_Type => 'multipart/form-data', Accept_Encoding => 'gzip, deflate', User_Agent => 'Mozilla/4.0', Host => 'www.mydomain.com', Connection => 'Keep-Alive', Content => { abc => 'dog', cde => '100', }; print $request->as_string; #my output POST /some.php3 Connection: Keep-Alive Accept-Encoding: gzip, deflate Accept-Language: en-us Host: www.mydomain.com Referer: http://www.mydomain.com/some.php3 User-Agent: Mozilla/4.0 Content-Length: 224 Content-Type: multipart/form-data; boundary=xYzZY --xYzZY Content-Disposition: form-data; name="nosresponses" 100 --xYzZY Content-Disposition: form-data; name="userkeyword" dog --xYzZY-- #proper output POST /some.php3 HTTP/1.1 Referer: http://www.mydomain.com/some.php3 Accept-Language: en-us Content-Type: multipart/form-data; boundary=-------------------------- +-7d32542f104c8 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 Host: www.mydomain.com Content-Length: 362 Connection: Keep-Alive Cache-Control: no-cache

Replies are listed 'Best First'.
Re: HTTP::Request::Common and multipart/form-data
by bbfu (Curate) on Apr 07, 2003 at 23:42 UTC

    Um, the boundary in your output is technically correct, according to the appropriate RFC's. Perhaps you could clarify exactly what needs to be different?

    bbfu
    Black flowers blossom
    Fearless on my breath

      What needs to be different is that my browser and my program produce 2 very different outputs:

      Broswer gives:

      Content-Type: multipart/form-data; boundary=-------------------------- +7d32542f104c8

      And program gives

      Content-Type: multipart/form-data; boundary=xYzZY

      See how the boundary field is so different. I want them to be the same. How can I do that in code?

      Also.....the "xYzZY" boundary I'm getting. Wouldn't that imply that not a thing just happened? So something is wrong with the way I'm using this?

      I'm confusing my little brain. Help a brother out!

        According to RFC1341, "xYzZY" is technically a legal boundary. The purpose of the boundary is to separate the parts of the message. Therefore, the only real requirement is that the boundary string does not appear anywhere in the message. That's why you usually see long strings of mixed alpha-numeric characters. The RFC even recommends using a string containing a string such as "=_" that can never appear in the message for the particular encoding. But as long as the message doesn't contain the boundary, however, everything will work fine.

        It just so happens that HTTP::Request::Common uses the following code specifically to ensure that the boundary does not appear anywhere in any of the form parts. It does this by actually checking to see if the boundary is in the part, and making a new boundary if it is.

        CHECK_BOUNDARY: { for (@parts) { if (index($_, $boundary) >= 0) { # must have a better boundary $boundary = boundary(++$bno); redo CHECK_BOUNDARY; } } last; }

        So, my long-winded point is, don't worry that the boundary string is different. It will work just fine the way it is. :)

        Update: It is also important to note that the boundary string sent by your browser will almost certainly be different every time it posts the form. This is because the boundary is usually a randomly generated string, often containing elements such as the current date and time to ensure uniqueness. So it would probably be next to impossible to get your code to give the exact same boundary as your browser, every time.

        bbfu
        Black flowers blossom
        Fearless on my breath