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)