]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: use slices to simplify the code
authorapocelipes <seve3r@outlook.com>
Thu, 21 Mar 2024 20:39:28 +0000 (20:39 +0000)
committerGopher Robot <gobot@golang.org>
Thu, 21 Mar 2024 22:14:00 +0000 (22:14 +0000)
"strSliceContains" is replaced by "slices.Contains".

Replace "sort.Strings" with "slices.Sort" since it becomes a wrapper
of "slices.Sort" from Go 1.22.

"headerSorter" no longer has to implement "sort.Interface".
We use "slice.SortFunc" to sort kvs.

Change-Id: Ic29b4c3db147c16079575eca7ad6ff6c0f581188
GitHub-Last-Rev: 78221d5aa223a259a89860b672f39a34897df253
GitHub-Pull-Request: golang/go#66440
Reviewed-on: https://go-review.googlesource.com/c/go/+/573275
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: qiulaidongfeng <2645477756@qq.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Emmanuel Odeke <emmanuel@orijtech.com>

src/net/http/client.go
src/net/http/export_test.go
src/net/http/header.go
src/net/http/main_test.go
src/net/http/routing_index_test.go
src/net/http/routing_tree_test.go
src/net/http/server.go
src/net/http/transfer.go

index 0f29dbb2c5e4d6b68b4d810ca7cbad61885a4699..b29910ca43a11c9ad238f9e16147a09fe7cdef8a 100644 (file)
@@ -20,7 +20,7 @@ import (
        "net/http/internal/ascii"
        "net/url"
        "reflect"
-       "sort"
+       "slices"
        "strings"
        "sync"
        "sync/atomic"
@@ -787,7 +787,7 @@ func (c *Client) makeHeadersCopier(ireq *Request) func(*Request) {
                                                ss = append(ss, c.Name+"="+c.Value)
                                        }
                                }
-                               sort.Strings(ss) // Ensure deterministic headers
+                               slices.Sort(ss) // Ensure deterministic headers
                                ireqhdr.Set("Cookie", strings.Join(ss, "; "))
                        }
                }
index 7e6d3d8e304495aa075adf5b698ad4d0cce6ff7f..8a6f4f192fb2df4b5d324a0c886f26820a90a690 100644 (file)
@@ -12,7 +12,7 @@ import (
        "fmt"
        "net"
        "net/url"
-       "sort"
+       "slices"
        "sync"
        "testing"
        "time"
@@ -111,7 +111,7 @@ func (t *Transport) IdleConnKeysForTesting() (keys []string) {
        for key := range t.idleConn {
                keys = append(keys, key.String())
        }
-       sort.Strings(keys)
+       slices.Sort(keys)
        return
 }
 
@@ -130,7 +130,7 @@ func (t *Transport) IdleConnStrsForTesting() []string {
                        ret = append(ret, pc.conn.LocalAddr().String()+"/"+pc.conn.RemoteAddr().String())
                }
        }
-       sort.Strings(ret)
+       slices.Sort(ret)
        return ret
 }
 
@@ -150,7 +150,7 @@ func (t *Transport) IdleConnStrsForTesting_h2() []string {
                }
        }
 
-       sort.Strings(ret)
+       slices.Sort(ret)
        return ret
 }
 
index 9d0f3a125d645922b4983d0a3803c2be154d3258..b8b080bece92b73bca93bddc16868220fd7c380b 100644 (file)
@@ -9,7 +9,7 @@ import (
        "net/http/httptrace"
        "net/http/internal/ascii"
        "net/textproto"
-       "sort"
+       "slices"
        "strings"
        "sync"
        "time"
@@ -152,17 +152,11 @@ type keyValues struct {
        values []string
 }
 
-// A headerSorter implements sort.Interface by sorting a []keyValues
-// by key. It's used as a pointer, so it can fit in a sort.Interface
-// interface value without allocation.
+// headerSorter contains a slice of keyValues sorted by keyValues.key.
 type headerSorter struct {
        kvs []keyValues
 }
 
-func (s *headerSorter) Len() int           { return len(s.kvs) }
-func (s *headerSorter) Swap(i, j int)      { s.kvs[i], s.kvs[j] = s.kvs[j], s.kvs[i] }
-func (s *headerSorter) Less(i, j int) bool { return s.kvs[i].key < s.kvs[j].key }
-
 var headerSorterPool = sync.Pool{
        New: func() any { return new(headerSorter) },
 }
@@ -182,7 +176,7 @@ func (h Header) sortedKeyValues(exclude map[string]bool) (kvs []keyValues, hs *h
                }
        }
        hs.kvs = kvs
-       sort.Sort(hs)
+       slices.SortFunc(hs.kvs, func(a, b keyValues) int { return strings.Compare(a.key, b.key) })
        return kvs, hs
 }
 
index ff56ef883d834cd27d22e7372e8a9747a25cc72a..9022d4f124827b8bb1d82ecca072dffd40cf1d8c 100644 (file)
@@ -11,7 +11,7 @@ import (
        "net/http"
        "os"
        "runtime"
-       "sort"
+       "slices"
        "strings"
        "testing"
        "time"
@@ -50,7 +50,7 @@ func interestingGoroutines() (gs []string) {
                }
                gs = append(gs, stack)
        }
-       sort.Strings(gs)
+       slices.Sort(gs)
        return
 }
 
index 1ffb9272c63a38ce713ab555fa6cacbed26e32fd..d480cba021832159858a9227cb6871173006d71d 100644 (file)
@@ -7,7 +7,6 @@ package http
 import (
        "fmt"
        "slices"
-       "sort"
        "strings"
        "testing"
 )
@@ -35,7 +34,7 @@ func trueConflicts(pat *pattern, pats []*pattern) []string {
                        s = append(s, p.String())
                }
        }
-       sort.Strings(s)
+       slices.Sort(s)
        return s
 }
 
@@ -47,7 +46,7 @@ func indexConflicts(pat *pattern, idx *routingIndex) []string {
                }
                return nil
        })
-       sort.Strings(s)
+       slices.Sort(s)
        return slices.Compact(s)
 }
 
index 2aac8b6cdf12898e0c67a307bfb1391760c1d89f..3c27308a633e010dc7f4e82e04350a1ad6cc46e4 100644 (file)
@@ -7,7 +7,6 @@ package http
 import (
        "fmt"
        "io"
-       "sort"
        "strings"
        "testing"
 
@@ -261,7 +260,7 @@ func TestMatchingMethods(t *testing.T) {
                        ms := map[string]bool{}
                        test.tree.matchingMethods(test.host, test.path, ms)
                        keys := mapKeys(ms)
-                       sort.Strings(keys)
+                       slices.Sort(keys)
                        got := strings.Join(keys, ",")
                        if got != test.want {
                                t.Errorf("got %s, want %s", got, test.want)
@@ -285,7 +284,7 @@ func (n *routingNode) print(w io.Writer, level int) {
                keys = append(keys, k)
                return true
        })
-       sort.Strings(keys)
+       slices.Sort(keys)
 
        for _, k := range keys {
                fmt.Fprintf(w, "%s%q:\n", indent, k)
index 31b43606f5f9299386de22d04b51201e8d644daf..18efbb2ce120112d8fb2b86d250c8667a3d5197b 100644 (file)
@@ -23,7 +23,7 @@ import (
        urlpkg "net/url"
        "path"
        "runtime"
-       "sort"
+       "slices"
        "strconv"
        "strings"
        "sync"
@@ -2652,7 +2652,7 @@ func (mux *ServeMux) matchingMethods(host, path string) []string {
        // matchOrRedirect will try appending a trailing slash if there is no match.
        mux.tree.matchingMethods(host, path+"/", ms)
        methods := mapKeys(ms)
-       sort.Strings(methods)
+       slices.Sort(methods)
        return methods
 }
 
@@ -3206,7 +3206,7 @@ func (srv *Server) shouldConfigureHTTP2ForServe() bool {
        // passed this tls.Config to tls.NewListener. And if they did,
        // it's too late anyway to fix it. It would only be potentially racy.
        // See Issue 15908.
-       return strSliceContains(srv.TLSConfig.NextProtos, http2NextProtoTLS)
+       return slices.Contains(srv.TLSConfig.NextProtos, http2NextProtoTLS)
 }
 
 // ErrServerClosed is returned by the [Server.Serve], [ServeTLS], [ListenAndServe],
@@ -3308,7 +3308,7 @@ func (srv *Server) ServeTLS(l net.Listener, certFile, keyFile string) error {
        }
 
        config := cloneTLSConfig(srv.TLSConfig)
-       if !strSliceContains(config.NextProtos, "http/1.1") {
+       if !slices.Contains(config.NextProtos, "http/1.1") {
                config.NextProtos = append(config.NextProtos, "http/1.1")
        }
 
@@ -3815,15 +3815,6 @@ func numLeadingCRorLF(v []byte) (n int) {
        return
 }
 
-func strSliceContains(ss []string, s string) bool {
-       for _, v := range ss {
-               if v == s {
-                       return true
-               }
-       }
-       return false
-}
-
 // tlsRecordHeaderLooksLikeHTTP reports whether a TLS record header
 // looks like it might've been a misdirected plaintext HTTP request.
 func tlsRecordHeaderLooksLikeHTTP(hdr [5]byte) bool {
index ee2107c418fbb720a54836a01b7182cd840edbb7..5a3c6ceff5780832728f214b4caed10241e4cfb7 100644 (file)
@@ -16,7 +16,7 @@ import (
        "net/http/internal/ascii"
        "net/textproto"
        "reflect"
-       "sort"
+       "slices"
        "strconv"
        "strings"
        "sync"
@@ -318,7 +318,7 @@ func (t *transferWriter) writeHeader(w io.Writer, trace *httptrace.ClientTrace)
                        keys = append(keys, k)
                }
                if len(keys) > 0 {
-                       sort.Strings(keys)
+                       slices.Sort(keys)
                        // TODO: could do better allocation-wise here, but trailers are rare,
                        // so being lazy for now.
                        if _, err := io.WriteString(w, "Trailer: "+strings.Join(keys, ",")+"\r\n"); err != nil {