mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-05 05:09:57 +08:00
75 lines
1.6 KiB
Go
75 lines
1.6 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package http
|
|
|
|
import (
|
|
"mime/multipart"
|
|
"net/textproto"
|
|
"net/url"
|
|
)
|
|
|
|
func cloneURLValues(v url.Values) url.Values {
|
|
if v == nil {
|
|
return nil
|
|
}
|
|
// http.Header and url.Values have the same representation, so temporarily
|
|
// treat it like http.Header, which does have a clone:
|
|
return url.Values(Header(v).Clone())
|
|
}
|
|
|
|
func cloneURL(u *url.URL) *url.URL {
|
|
if u == nil {
|
|
return nil
|
|
}
|
|
u2 := new(url.URL)
|
|
*u2 = *u
|
|
if u.User != nil {
|
|
u2.User = new(url.Userinfo)
|
|
*u2.User = *u.User
|
|
}
|
|
return u2
|
|
}
|
|
|
|
func cloneMultipartForm(f *multipart.Form) *multipart.Form {
|
|
if f == nil {
|
|
return nil
|
|
}
|
|
f2 := &multipart.Form{
|
|
Value: (map[string][]string)(Header(f.Value).Clone()),
|
|
}
|
|
if f.File != nil {
|
|
m := make(map[string][]*multipart.FileHeader)
|
|
for k, vv := range f.File {
|
|
vv2 := make([]*multipart.FileHeader, len(vv))
|
|
for i, v := range vv {
|
|
vv2[i] = cloneMultipartFileHeader(v)
|
|
}
|
|
m[k] = vv2
|
|
}
|
|
f2.File = m
|
|
}
|
|
return f2
|
|
}
|
|
|
|
func cloneMultipartFileHeader(fh *multipart.FileHeader) *multipart.FileHeader {
|
|
if fh == nil {
|
|
return nil
|
|
}
|
|
fh2 := new(multipart.FileHeader)
|
|
*fh2 = *fh
|
|
fh2.Header = textproto.MIMEHeader(Header(fh.Header).Clone())
|
|
return fh2
|
|
}
|
|
|
|
// cloneOrMakeHeader invokes Header.Clone but if the
|
|
// result is nil, it'll instead make and return a non-nil Header.
|
|
func cloneOrMakeHeader(hdr Header) Header {
|
|
clone := hdr.Clone()
|
|
if clone == nil {
|
|
clone = make(Header)
|
|
}
|
|
return clone
|
|
}
|