github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/gmhttp/clone.go (about) 1 // Copyright 2019 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 package gmhttp 6 7 import ( 8 "mime/multipart" 9 "net/textproto" 10 "net/url" 11 ) 12 13 func cloneURLValues(v url.Values) url.Values { 14 if v == nil { 15 return nil 16 } 17 // http.Header and url.Values have the same representation, so temporarily 18 // treat it like http.Header, which does have a clone: 19 return url.Values(Header(v).Clone()) 20 } 21 22 func cloneURL(u *url.URL) *url.URL { 23 if u == nil { 24 return nil 25 } 26 u2 := new(url.URL) 27 *u2 = *u 28 if u.User != nil { 29 u2.User = new(url.Userinfo) 30 *u2.User = *u.User 31 } 32 return u2 33 } 34 35 func cloneMultipartForm(f *multipart.Form) *multipart.Form { 36 if f == nil { 37 return nil 38 } 39 f2 := &multipart.Form{ 40 Value: (map[string][]string)(Header(f.Value).Clone()), 41 } 42 if f.File != nil { 43 m := make(map[string][]*multipart.FileHeader) 44 for k, vv := range f.File { 45 vv2 := make([]*multipart.FileHeader, len(vv)) 46 for i, v := range vv { 47 vv2[i] = cloneMultipartFileHeader(v) 48 } 49 m[k] = vv2 50 } 51 f2.File = m 52 } 53 return f2 54 } 55 56 func cloneMultipartFileHeader(fh *multipart.FileHeader) *multipart.FileHeader { 57 if fh == nil { 58 return nil 59 } 60 fh2 := new(multipart.FileHeader) 61 *fh2 = *fh 62 fh2.Header = textproto.MIMEHeader(Header(fh.Header).Clone()) 63 return fh2 64 } 65 66 // cloneOrMakeHeader invokes Header.Clone but if the 67 // result is nil, it'll instead make and return a non-nil Header. 68 func cloneOrMakeHeader(hdr Header) Header { 69 clone := hdr.Clone() 70 if clone == nil { 71 clone = make(Header) 72 } 73 return clone 74 }