github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/mime/multipart/multipart.go (about)

     1  // Copyright 2010 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  //
     5  
     6  /*
     7  パッケージmultipartは、RFC 2046で定義されているMIMEマルチパートの解析を実装します。
     8  
     9  この実装は、HTTP(RFC 2388)と一般的なブラウザが生成するマルチパートボディに対して十分です。
    10  
    11  # 制限
    12  
    13  悪意のある入力に対する保護として、このパッケージは処理するMIMEデータのサイズに制限を設けています。
    14  
    15  [Reader.NextPart] と [Reader.NextRawPart] は、パート内のヘッダーの数を10000に制限し、[Reader.ReadForm] はすべての
    16  FileHeaders内のヘッダーの合計数を10000に制限します。
    17  これらの制限は、GODEBUG=multipartmaxheaders=<values>の設定で調整できます。
    18  
    19  さらに、Reader.ReadFormはフォーム内のパートの数を1000に制限します。
    20  この制限は、GODEBUG=multipartmaxparts=<value>の設定で調整できます。
    21  */
    22  package multipart
    23  
    24  import (
    25  	"github.com/shogo82148/std/bufio"
    26  	"github.com/shogo82148/std/io"
    27  	"github.com/shogo82148/std/net/textproto"
    28  )
    29  
    30  // Partは、マルチパートボディの単一の部分を表します。
    31  type Part struct {
    32  	// ボディのヘッダー(存在する場合)は、Goのhttp.Requestヘッダーと同様に
    33  	// キーが正規化されています。例えば、"foo-bar"は"Foo-Bar"に変更されます。
    34  	Header textproto.MIMEHeader
    35  
    36  	mr *Reader
    37  
    38  	disposition       string
    39  	dispositionParams map[string]string
    40  
    41  	// r is either a reader directly reading from mr, or it's a
    42  	// wrapper around such a reader, decoding the
    43  	// Content-Transfer-Encoding
    44  	r io.Reader
    45  
    46  	n       int
    47  	total   int64
    48  	err     error
    49  	readErr error
    50  }
    51  
    52  // FormNameは、pのContent-Dispositionが"type"の"form-data"である場合、
    53  // nameパラメータを返します。それ以外の場合は空文字列を返します。
    54  func (p *Part) FormName() string
    55  
    56  // FileNameは、[Part] のContent-Dispositionヘッダーのfilenameパラメータを返します。
    57  // 空でない場合、filenameはfilepath.Base(プラットフォーム依存)を通過してから返されます。
    58  func (p *Part) FileName() string
    59  
    60  // NewReaderは、指定されたMIME境界を使用してrから読み取る新しいマルチパート [Reader] を作成します。
    61  //
    62  // 境界は通常、メッセージの"Content-Type"ヘッダーの"boundary"パラメータから取得します。
    63  // そのようなヘッダーを解析するには、[mime.ParseMediaType] を使用します。
    64  func NewReader(r io.Reader, boundary string) *Reader
    65  
    66  // Readは、ヘッダーの後と次のパート(存在する場合)が始まる前の、パートのボディを読み取ります。
    67  func (p *Part) Read(d []byte) (n int, err error)
    68  
    69  func (p *Part) Close() error
    70  
    71  // Readerは、MIMEマルチパートボディ内のパートを反復処理するためのものです。
    72  // Readerの基礎となるパーサーは、必要に応じて入力を消費します。シークはサポートされていません。
    73  type Reader struct {
    74  	bufReader *bufio.Reader
    75  	tempDir   string
    76  
    77  	currentPart *Part
    78  	partsRead   int
    79  
    80  	nl               []byte
    81  	nlDashBoundary   []byte
    82  	dashBoundaryDash []byte
    83  	dashBoundary     []byte
    84  }
    85  
    86  // NextPartは、マルチパートの次のパートまたはエラーを返します。
    87  // パートがこれ以上ない場合、エラー [io.EOF] が返されます。
    88  //
    89  // 特別なケースとして、"Content-Transfer-Encoding"ヘッダーの値が
    90  // "quoted-printable"である場合、そのヘッダーは代わりに隠され、
    91  // ボディはRead呼び出し中に透明にデコードされます。
    92  func (r *Reader) NextPart() (*Part, error)
    93  
    94  // NextRawPartは、マルチパートの次のパートまたはエラーを返します。
    95  // パートがこれ以上ない場合、エラー [io.EOF] が返されます。
    96  //
    97  // [Reader.NextPart] とは異なり、"Content-Transfer-Encoding: quoted-printable"に対する特別な処理はありません。
    98  func (r *Reader) NextRawPart() (*Part, error)