multipart

package
v1.23.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2024 License: MIT Imports: 4 Imported by: 0

Documentation

Overview

multipartパッケージは、RFC 2046で定義されているMIMEマルチパートの解析を実装します。

この実装は、HTTP(RFC 2388)と一般的なブラウザが生成するマルチパートボディに対して十分です。

制限

悪意のある入力に対する保護として、このパッケージは処理するMIMEデータのサイズに制限を設けています。

Reader.NextPartReader.NextRawPart は、パート内のヘッダーの数を10000に制限し、Reader.ReadForm はすべての FileHeaders内のヘッダーの合計数を10000に制限します。 これらの制限は、GODEBUG=multipartmaxheaders=<values>の設定で調整できます。

さらに、Reader.ReadFormはフォーム内のパートの数を1000に制限します。 この制限は、GODEBUG=multipartmaxparts=<value>の設定で調整できます。

Index

Examples

Constants

This section is empty.

Variables

View Source
var ErrMessageTooLarge = errors.New("multipart: message too large")

ErrMessageTooLargeは、メッセージフォームデータが処理するには大きすぎる場合、ReadFormによって返されます。

Functions

This section is empty.

Types

type File

type File interface {
	io.Reader
	io.ReaderAt
	io.Seeker
	io.Closer
}

Fileは、マルチパートメッセージのファイル部分にアクセスするためのインターフェースです。 その内容はメモリに保存されるか、またはディスクに保存されます。 ディスクに保存されている場合、Fileの基礎となる具体的な型は*os.Fileになります。

type FileHeader

type FileHeader struct {
	Filename string
	Header   textproto.MIMEHeader
	Size     int64
	// contains filtered or unexported fields
}

FileHeaderは、マルチパートリクエストのファイル部分を記述します。

func (*FileHeader) Open

func (fh *FileHeader) Open() (File, error)

Openは、FileHeader に関連付けられたFileを開き、それを返します。

type Form

type Form struct {
	Value map[string][]string
	File  map[string][]*FileHeader
}

Formは解析されたマルチパートフォームです。 ファイルパートはメモリまたはディスクに保存され、 *FileHeader のOpenメソッドを通じてアクセス可能です。 Valueパートは文字列として保存されます。 両方ともフィールド名でキー化されます。

func (*Form) RemoveAll

func (f *Form) RemoveAll() error

RemoveAllは、Form に関連付けられた一時ファイルをすべて削除します。

type Part

type Part struct {
	// ボディのヘッダー(存在する場合)は、Goのhttp.Requestヘッダーと同様に
	// キーが正規化されています。例えば、"foo-bar"は"Foo-Bar"に変更されます。
	Header textproto.MIMEHeader
	// contains filtered or unexported fields
}

Partは、マルチパートボディの単一の部分を表します。

func (*Part) Close

func (p *Part) Close() error

func (*Part) FileName

func (p *Part) FileName() string

FileNameは、Part のContent-Dispositionヘッダーのfilenameパラメータを返します。 空でない場合、filenameはfilepath.Base(プラットフォーム依存)を通過してから返されます。

func (*Part) FormName

func (p *Part) FormName() string

FormNameは、pのContent-Dispositionが"type"の"form-data"である場合、 nameパラメータを返します。それ以外の場合は空文字列を返します。

func (*Part) Read

func (p *Part) Read(d []byte) (n int, err error)

Readは、ヘッダーの後と次のパート(存在する場合)が始まる前の、パートのボディを読み取ります。

type Reader

type Reader struct {
	// contains filtered or unexported fields
}

Readerは、MIMEマルチパートボディ内のパートを反復処理するためのものです。 Readerの基礎となるパーサーは、必要に応じて入力を消費します。シークはサポートされていません。

func NewReader

func NewReader(r io.Reader, boundary string) *Reader

NewReaderは、指定されたMIME境界を使用してrから読み取る新しいマルチパート Reader を作成します。

境界は通常、メッセージの"Content-Type"ヘッダーの"boundary"パラメータから取得します。 そのようなヘッダーを解析するには、mime.ParseMediaType を使用します。

Example
package main

import (
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/io"
	"github.com/shogo82148/std/log"
	"github.com/shogo82148/std/mime"
	"github.com/shogo82148/std/mime/multipart"
	"github.com/shogo82148/std/net/mail"
	"github.com/shogo82148/std/strings"
)

func main() {
	msg := &mail.Message{
		Header: map[string][]string{
			"Content-Type": {"multipart/mixed; boundary=foo"},
		},
		Body: strings.NewReader(
			"--foo\r\nFoo: one\r\n\r\nA section\r\n" +
				"--foo\r\nFoo: two\r\n\r\nAnd another\r\n" +
				"--foo--\r\n"),
	}
	mediaType, params, err := mime.ParseMediaType(msg.Header.Get("Content-Type"))
	if err != nil {
		log.Fatal(err)
	}
	if strings.HasPrefix(mediaType, "multipart/") {
		mr := multipart.NewReader(msg.Body, params["boundary"])
		for {
			p, err := mr.NextPart()
			if err == io.EOF {
				return
			}
			if err != nil {
				log.Fatal(err)
			}
			slurp, err := io.ReadAll(p)
			if err != nil {
				log.Fatal(err)
			}
			fmt.Printf("Part %q: %q\n", p.Header.Get("Foo"), slurp)
		}
	}

}
Output:

Part "one": "A section"
Part "two": "And another"

func (*Reader) NextPart

func (r *Reader) NextPart() (*Part, error)

NextPartは、マルチパートの次のパートまたはエラーを返します。 パートがこれ以上ない場合、エラー io.EOF が返されます。

特別なケースとして、"Content-Transfer-Encoding"ヘッダーの値が "quoted-printable"である場合、そのヘッダーは代わりに隠され、 ボディはRead呼び出し中に透明にデコードされます。

func (*Reader) NextRawPart added in v1.14.0

func (r *Reader) NextRawPart() (*Part, error)

NextRawPartは、マルチパートの次のパートまたはエラーを返します。 パートがこれ以上ない場合、エラー io.EOF が返されます。

Reader.NextPart とは異なり、"Content-Transfer-Encoding: quoted-printable"に対する特別な処理はありません。

func (*Reader) ReadForm

func (r *Reader) ReadForm(maxMemory int64) (*Form, error)

ReadFormは、パートのContent-Dispositionが"form-data"であるマルチパートメッセージ全体を解析します。 メモリには最大でmaxMemoryバイト + 10MB(非ファイルパート用に予約)を格納します。 メモリに格納できないファイルパートは、一時ファイルとしてディスクに格納されます。 すべての非ファイルパートをメモリに格納できない場合、ErrMessageTooLarge を返します。

type Writer

type Writer struct {
	// contains filtered or unexported fields
}

Writerはマルチパートメッセージを生成します。

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriterは、ランダムな境界を持つ新しいマルチパート Writer を返し、wに書き込みます。

func (*Writer) Boundary

func (w *Writer) Boundary() string

Boundaryは Writer の境界を返します。

func (*Writer) Close

func (w *Writer) Close() error

Closeはマルチパートメッセージを終了し、終了境界線を出力に書き込みます。

func (*Writer) CreateFormField

func (w *Writer) CreateFormField(fieldname string) (io.Writer, error)

CreateFormFieldは、与えられたフィールド名を使用してヘッダーを作成し、 Writer.CreatePart を呼び出します。

func (*Writer) CreateFormFile

func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)

CreateFormFileは、Writer.CreatePart の便利なラッパーです。これは、 提供されたフィールド名とファイル名で新しいform-dataヘッダーを作成します。

func (*Writer) CreatePart

func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)

CreatePartは、提供されたヘッダーを持つ新しいマルチパートセクションを作成します。 パートのボディは、返された Writer に書き込むべきです。 CreatePartを呼び出した後、以前のパートにはもう書き込むことができません。

func (*Writer) FormDataContentType

func (w *Writer) FormDataContentType() string

FormDataContentTypeは、この Writer のBoundaryを持つHTTP multipart/form-dataのContent-Typeを返します。

func (*Writer) SetBoundary added in v1.1.0

func (w *Writer) SetBoundary(boundary string) error

SetBoundaryは、Writer のデフォルトのランダムに生成された 境界セパレータを明示的な値で上書きします。

SetBoundaryはパートが作成される前に呼び出す必要があり、特定のASCII文字のみを 含むことができ、非空であり、最大で70バイトの長さでなければなりません。

func (*Writer) WriteField

func (w *Writer) WriteField(fieldname, value string) error

WriteFieldは Writer.CreateFormField を呼び出し、その後で与えられた値を書き込みます。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL