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  }