Trying to submit multipart/form-data HTTP POST using PHP script

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Boldgeek

    Trying to submit multipart/form-data HTTP POST using PHP script

    I am trying to develop an app that will allow automatic updating of a
    web form which uses multipart/form-data enctype (as it MIGHT be sending
    an image)

    I have an example form, which when submitted displays the results as
    you would expect.
    However when I send the same data using the PHP script I get a 400
    error:

    Bad Request
    Your browser sent a request that this server could not understand.
    Request header field is missing colon separator.
    ( it then displays the boundary string.)

    After examining the HTTP headers for the submitted form, it appears
    EXACTLY the same as the post I make via the PHP script. I've tried
    copying EVERYTHING exactly and it still comes up with the error.

    If I remove the actual content, ie end the request like:

    Content-Type: multipart/form-data;
    boundary=---------------------------265001916915724
    Content-Length: 0

    It works fine. However as soon as we start adding boundary strings and
    form parts, I get the error. Everything is formatted correctly. I can
    provide examples if required.

    I'm using fsockopen in the PHP script to connect to the target server &
    page

    I'm at my wits end trying to see what is wrong with the PHP script -
    anyone got any ideas?
    Thanks in advance...

  • Rik

    #2
    Re: Trying to submit multipart/form-data HTTP POST using PHP script

    Boldgeek wrote:
    I am trying to develop an app that will allow automatic updating of a
    web form which uses multipart/form-data enctype (as it MIGHT be
    sending an image)
    >
    I have an example form, which when submitted displays the results as
    you would expect.
    However when I send the same data using the PHP script I get a 400
    error:
    >
    Bad Request
    Your browser sent a request that this server could not understand.
    Request header field is missing colon separator.
    ( it then displays the boundary string.)
    >
    After examining the HTTP headers for the submitted form, it appears
    EXACTLY the same as the post I make via the PHP script. I've tried
    copying EVERYTHING exactly and it still comes up with the error.
    >
    If I remove the actual content, ie end the request like:
    >
    Content-Type: multipart/form-data;
    boundary=---------------------------265001916915724
    Content-Length: 0
    >
    It works fine. However as soon as we start adding boundary strings and
    form parts, I get the error. Everything is formatted correctly. I
    can provide examples if required.
    >
    I'm using fsockopen in the PHP script to connect to the target server
    & page
    >
    I'm at my wits end trying to see what is wrong with the PHP script -
    anyone got any ideas?
    As my crystal ball is broken, I cannot see what is wrong with either the
    request you send, or with the PHP code that builds it. If you really want
    to know what's wrong, post an example of the request that breaks (offcourse
    strip out the actual file-data, and possibily security stuff), not the
    request that's OK :-)

    What I can advise you though, is perhaps to use curl instead of fsockopen
    if you have it available. It saves a lot of handcoding requests.
    --
    Rik Wasmus


    Comment

    • Tim Roberts

      #3
      Re: Trying to submit multipart/form-data HTTP POST using PHP script

      "Boldgeek" <ap@mardona.com wrote:
      >I am trying to develop an app that will allow automatic updating of a
      >web form which uses multipart/form-data enctype (as it MIGHT be sending
      >an image)
      >
      >I have an example form, which when submitted displays the results as
      >you would expect.
      >However when I send the same data using the PHP script I get a 400
      >error:
      >
      >Bad Request
      >Your browser sent a request that this server could not understand.
      >Request header field is missing colon separator.
      >( it then displays the boundary string.)
      >
      >After examining the HTTP headers for the submitted form, it appears
      >EXACTLY the same as the post I make via the PHP script. I've tried
      >copying EVERYTHING exactly and it still comes up with the error.
      >
      >If I remove the actual content, ie end the request like:
      >
      >Content-Type: multipart/form-data;
      >boundary=---------------------------265001916915724
      >Content-Length: 0
      Is the "boundary" parameter on the same line as the Content-Type, or at
      least indented on the next line?
      >It works fine. However as soon as we start adding boundary strings and
      >form parts, I get the error. Everything is formatted correctly. I can
      >provide examples if required.
      >
      >I'm using fsockopen in the PHP script to connect to the target server &
      >page
      >
      >I'm at my wits end trying to see what is wrong with the PHP script -
      >anyone got any ideas?
      You haven't given us enough information to know what the problem is. Here's
      an example of a correct POST:

      POST /cgi-bin/xxxx HTTP/1.0
      Content-Type: multipart/form-data; boundary=----xxxx----

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

      Tim Roberts
      ------xxxx----
      Content-Disposition: form-data; name="email"

      timr@nonono.com

      Is that what you are sending?
      --
      Tim Roberts, timr@probo.com
      Providenza & Boekelheide, Inc.

      Comment

      • Rik

        #4
        Re: Trying to submit multipart/form-data HTTP POST using PHP script

        Rik wrote:
        As my crystal ball is broken
        (c) some other dude offcourse... :P
        --
        Rik Wasmus


        Comment

        • Boldgeek

          #5
          Re: Trying to submit multipart/form-data HTTP POST using PHP script

          Here is the HTTP request sent by the app:

          POST testresults.php HTTP/1.1
          Host: www.(mydomain).org
          User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1)
          Gecko/20061204 Firefox/2.0.0.1
          Accept:
          text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,ima ge/png,*/*;q=0.5
          Accept-Language: en-gb,en-us;q=0.7,en;q=0 .3
          Accept-Encoding: gzip,deflate
          Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
          Keep-Alive: 300
          Connection: keep-alive
          Content-Type: multipart/form-data;
          boundary=---------------------------265001916915724
          Content-Length: 364
          -----------------------------265001916915724
          Content-Disposition: form-data; name="name"

          test2
          -----------------------------265001916915724
          Content-Disposition: form-data; name="descripti on"

          This is a test
          -----------------------------265001916915724
          Content-Disposition: form-data; name="cmd"

          Submit
          -----------------------------265001916915724--



          I've copied this as exactly as possible from the HTTP request sent by
          the forms version (I used a Firefox plugin called Live HTTP Headers to
          capture the headers) Note: There is a blank line at the end after the
          final boundary.

          The server response is :
          Bad Request
          Your browser sent a request that this server could not understand.
          Request header field is missing colon separator.


          -----------------------------265001916915724


          Below is the HTTP request submitted by the form (copied from Live HTTP
          Headers) which works fine.

          POST /testresults.php HTTP/1.1
          Host: www.(mydomain).org
          User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1)
          Gecko/20061204 Firefox/2.0.0.1
          Accept:
          text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,ima ge/png,*/*;q=0.5
          Accept-Language: en-gb,en-us;q=0.7,en;q=0 .3
          Accept-Encoding: gzip,deflate
          Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
          Keep-Alive: 300
          Connection: keep-alive
          Referer: http://www.(mydomain).org/testform.php
          Content-Type: multipart/form-data;
          boundary=---------------------------77877924991
          Content-Length: 364
          -----------------------------77877924991
          Content-Disposition: form-data; name="name"

          form test
          -----------------------------77877924991
          Content-Disposition: form-data; name="descripti on"

          this is a test of the form
          -----------------------------77877924991
          Content-Disposition: form-data; name="cmd"

          Submit
          -----------------------------77877924991--


          Now the only differences I can detect are the referrer (which has no
          relevance to this particular application) and the boundary string. As a
          test previously I've copied the same boundary string just to be certain
          and there are no differences. Each line is terminated by "\r\n" as it
          should be.

          Thanks guys, your help is much appreciated.

          Comment

          • Rik

            #6
            Re: Trying to submit multipart/form-data HTTP POST using PHP script

            Boldgeek wrote:
            Here is the HTTP request sent by the app:
            >
            POST testresults.php HTTP/1.1
            Host: www.(mydomain).org
            User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
            rv:1.8.1.1)
            Gecko/20061204 Firefox/2.0.0.1
            Accept:
            >
            text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q
            =0.8,image/png,*/*;q=0.5
            Accept-Language: en-gb,en-us;q=0.7,en;q=0 .3
            Accept-Encoding: gzip,deflate
            Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
            Keep-Alive: 300
            Connection: keep-alive
            Content-Type: multipart/form-data;
            boundary=---------------------------265001916915724
            Content-Length: 364
            And here there should be a blank line..........
            -----------------------------265001916915724
            Content-Disposition: form-data; name="name"
            >
            test2
            -----------------------------265001916915724
            Content-Disposition: form-data; name="descripti on"
            >
            This is a test
            -----------------------------265001916915724
            Content-Disposition: form-data; name="cmd"
            >
            Submit
            -----------------------------265001916915724--

            Hope that's it.
            --
            Rik Wasmus


            Comment

            • Boldgeek

              #7
              Re: Trying to submit multipart/form-data HTTP POST using PHP script


              Rik wrote:
              Boldgeek wrote:
              Here is the HTTP request sent by the app:

              POST testresults.php HTTP/1.1
              Host: www.(mydomain).org
              User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
              rv:1.8.1.1)
              Gecko/20061204 Firefox/2.0.0.1
              Accept:
              text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q
              =0.8,image/png,*/*;q=0.5
              Accept-Language: en-gb,en-us;q=0.7,en;q=0 .3
              Accept-Encoding: gzip,deflate
              Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
              Keep-Alive: 300
              Connection: keep-alive
              Content-Type: multipart/form-data;
              boundary=---------------------------265001916915724
              Content-Length: 364
              >
              And here there should be a blank line..........
              >
              -----------------------------265001916915724
              Content-Disposition: form-data; name="name"

              test2
              -----------------------------265001916915724
              Content-Disposition: form-data; name="descripti on"

              This is a test
              -----------------------------265001916915724
              Content-Disposition: form-data; name="cmd"

              Submit
              -----------------------------265001916915724--
              >
              >
              Hope that's it.
              --
              Rik Wasmus
              Dear God! That was exactly the problem... I completely forgot the blank
              line (which has been filtered out of the Live HTTP Header output as
              well)

              Thank you for that - I've been tearing my hair out for a couple of days
              because of that!

              Comment

              Working...