module MIME::Multipart

Overview

TheMIME::Multipart module contains utilities for parsing MIME multipart messages, which contain multiple body parts, each containing a header section and binary body. Themultipart/form-data content-type has a separate set of utilities in theHTTP::FormData module.

Defined in:

mime/multipart.cr
mime/multipart/builder.cr
mime/multipart/parser.cr
mime/multipart/state.cr

Class Method Summary

Class Method Detail

def self.build(io : IO, boundary : String = Multipart.generate_boundary, &) #

Yields aMultipart::Builder to the given block, writing toio and usingboundary.#finish is automatically called on the builder.


def self.build(boundary : String = Multipart.generate_boundary, &) #

Yields aMultipart::Builder to the given block, returning the generated message as aString.


def self.generate_boundary : String #

Returns a unique string suitable for use as a multipart boundary.

require "mime/multipart"

MIME::Multipart.generate_boundary # => "---------------------------dQu6bXHYb4m5zrRC3xPTGwV"

def self.parse(io, boundary, &) #

Parses a MIME multipart message, yieldingHTTP::Headers and anIO for each body part.

Please note that the IO object yielded to the block is only valid while the block is executing. The IO is closed as soon as the supplied block returns.

require "mime/multipart"

multipart = "--aA40\r\nContent-Type: text/plain\r\n\r\nbody\r\n--aA40--"
MIME::Multipart.parse(IO::Memory.new(multipart), "aA40") do |headers, io|
  headers["Content-Type"] # => "text/plain"
  io.gets_to_end          # => "body"
end

See:Multipart::Parser


def self.parse(request : HTTP::Request, &) #

Parses a MIME multipart message, yieldingHTTP::Headers and anIO for each body part.

Please note that the IO object yielded to the block is only valid while the block is executing. The IO is closed as soon as the supplied block returns.

require "http"
require "mime/multipart"

headers = HTTP::Headers{"Content-Type" => "multipart/mixed; boundary=aA40"}
body = "--aA40\r\nContent-Type: text/plain\r\n\r\nbody\r\n--aA40--"
request = HTTP::Request.new("POST", "/", headers, body)

MIME::Multipart.parse(request) do |headers, io|
  headers["Content-Type"] # => "text/plain"
  io.gets_to_end          # => "body"
end

See:Multipart::Parser


def self.parse(response : HTTP::Client::Response, &) #

Parses a MIME multipart message, yieldingHTTP::Headers and anIO for each body part.

Please note that the IO object yielded to the block is only valid while the block is executing. The IO is closed as soon as the supplied block returns.

require "http"
require "mime/multipart"

headers = HTTP::Headers{"Content-Type" => "multipart/byteranges; boundary=aA40"}
body = "--aA40\r\nContent-Type: text/plain\r\n\r\nbody\r\n--aA40--"
response = HTTP::Client::Response.new(
  status: :ok,
  headers: headers,
  body: body,
)

MIME::Multipart.parse(response) do |headers, io|
  headers["Content-Type"] # => "text/plain"
  io.gets_to_end          # => "body"
end

See:Multipart::Parser


def self.parse_boundary(content_type : String) : String | Nil #

Extracts the multipart boundary from the Content-Type header. May return nil is the boundary was not found.

require "mime/multipart"

MIME::Multipart.parse_boundary("multipart/mixed; boundary=\"abcde\"") # => "abcde"