Source File
multipart.go
Belonging Package
mime/multipart
package multipart
import (
)
var emptyParams = make(map[string]string)
const peekBufferSize = 4096
if .dispositionParams == nil {
.parseContentDisposition()
}
if .disposition != "form-data" {
return ""
}
return .dispositionParams["name"]
}
func ( *Part) () string {
if .dispositionParams == nil {
.parseContentDisposition()
}
return .dispositionParams["filename"]
}
func ( *Part) () {
:= .Header.Get("Content-Disposition")
var error
.disposition, .dispositionParams, = mime.ParseMediaType()
if != nil {
.dispositionParams = emptyParams
}
}
func ( io.Reader, string) *Reader {
:= []byte("\r\n--" + + "--")
return &Reader{
bufReader: bufio.NewReaderSize(&stickyErrorReader{r: }, peekBufferSize),
nl: [:2],
nlDashBoundary: [:len()-2],
dashBoundaryDash: [2:],
dashBoundary: [2 : len()-2],
}
}
type stickyErrorReader struct {
r io.Reader
err error
}
func ( *stickyErrorReader) ( []byte) ( int, error) {
if .err != nil {
return 0, .err
}
, .err = .r.Read()
return , .err
}
func ( *Reader, bool) (*Part, error) {
:= &Part{
Header: make(map[string][]string),
mr: ,
}
if := .populateHeaders(); != nil {
return nil,
}
.r = partReader{}
type partReader struct {
p *Part
}
func ( partReader) ( []byte) (int, error) {
:= .p
:= .mr.bufReader
for .n == 0 && .err == nil {
, := .Peek(.Buffered())
.n, .err = scanUntilBoundary(, .mr.dashBoundary, .mr.nlDashBoundary, .total, .readErr)
type Reader struct {
bufReader *bufio.Reader
currentPart *Part
partsRead int
nl []byte // "\r\n" or "\n" (set after seeing first boundary line)
nlDashBoundary []byte // nl + "--boundary"
dashBoundaryDash []byte // "--boundary--"
dashBoundary []byte // "--boundary"
}
continue
}
func ( *Reader) ( []byte) bool {
if !bytes.HasPrefix(, .dashBoundaryDash) {
return false
}
:= [len(.dashBoundaryDash):]
= skipLWSPChar()
return len() == 0 || bytes.Equal(, .nl)
}
if !bytes.HasPrefix(, .dashBoundary) {
return false
}
:= [len(.dashBoundary):]
= skipLWSPChar()
if .partsRead == 0 && len() == 1 && [0] == '\n' {
.nl = .nl[1:]
.nlDashBoundary = .nlDashBoundary[1:]
}
return bytes.Equal(, .nl)
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |