What rules apply to MIME boundary?

Septagram picture Septagram · Jan 11, 2011 · Viewed 31.9k times · Source

When you are writing MIME, you separate different chunks of your message with a certain boundary. I failed for some reason to find any documentation explaining this boundary, but here's what I gathered from examples:

  1. Boundary can be any string of letters and numbers, i. e. "d29a0c638b540b23e9a29a3a9aebc900aeeb6a82".

  2. There are no rules for generating the boundary, you can just md5sum the name of your beloved, and here you go, you've got your boundary.

  3. If you are sending MIME over HTTP, you must add a header "Content-Type" specifying that you do, and your boundary, contents of a header may look like this:

    multipart/form-data; boundary=d29a0c638b540b23e9a29a3a9aebc900aeeb6a82

  4. In the body of your message, the boundary should be preceded with "--", like:

    --d29a0c638b540b23e9a29a3a9aebc900aeeb6a82

But following these rules (and this helpful answer) I failed to generate POST query that server would accept. Am I missing something? Did I get something wrong?

Answer

Gumbo picture Gumbo · Jan 11, 2011

The syntax of a boundary is:

 boundary := 0*69<bchars> bcharsnospace
 bchars := bcharsnospace / " "
 bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" /
                  "+" / "_" / "," / "-" / "." /
                  "/" / ":" / "=" / "?"

And the body of a multipart entity has the syntax (only the important parts):

 multipart-body := [preamble CRLF]
                   dash-boundary transport-padding CRLF
                   body-part *encapsulation
                   close-delimiter transport-padding
                   [CRLF epilogue]
 dash-boundary := "--" boundary
 encapsulation := delimiter transport-padding
                  CRLF body-part
 delimiter := CRLF dash-boundary
 close-delimiter := delimiter "--"

The preceeding -- is mandatory for every boundary used in the message and the trailing -- is mandatory for the closing boundary (close-delimiter). So a multipart body with three body-parts with boundary as boundary can look like this:

--boundary
1. body-part
--boundary
2. body-part
--boundary
3. body-part
--boundary--