...

Source file src/net/http/h2_bundle.go

     1	// Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT.
     2	//go:generate bundle -o h2_bundle.go -prefix http2 golang.org/x/net/http2
     3	
     4	// Package http2 implements the HTTP/2 protocol.
     5	//
     6	// This package is low-level and intended to be used directly by very
     7	// few people. Most users will use it indirectly through the automatic
     8	// use by the net/http package (from Go 1.6 and later).
     9	// For use in earlier Go versions see ConfigureServer. (Transport support
    10	// requires Go 1.6 or later)
    11	//
    12	// See https://http2.github.io/ for more information on HTTP/2.
    13	//
    14	// See https://http2.golang.org/ for a test server running this code.
    15	//
    16	
    17	package http
    18	
    19	import (
    20		"bufio"
    21		"bytes"
    22		"compress/gzip"
    23		"context"
    24		"crypto/rand"
    25		"crypto/tls"
    26		"encoding/binary"
    27		"errors"
    28		"fmt"
    29		"io"
    30		"io/ioutil"
    31		"log"
    32		"math"
    33		mathrand "math/rand"
    34		"net"
    35		"net/http/httptrace"
    36		"net/textproto"
    37		"net/url"
    38		"os"
    39		"reflect"
    40		"runtime"
    41		"sort"
    42		"strconv"
    43		"strings"
    44		"sync"
    45		"sync/atomic"
    46		"time"
    47	
    48		"golang.org/x/net/http/httpguts"
    49		"golang.org/x/net/http2/hpack"
    50		"golang.org/x/net/idna"
    51	)
    52	
    53	// A list of the possible cipher suite ids. Taken from
    54	// https://www.iana.org/assignments/tls-parameters/tls-parameters.txt
    55	
    56	const (
    57		http2cipher_TLS_NULL_WITH_NULL_NULL               uint16 = 0x0000
    58		http2cipher_TLS_RSA_WITH_NULL_MD5                 uint16 = 0x0001
    59		http2cipher_TLS_RSA_WITH_NULL_SHA                 uint16 = 0x0002
    60		http2cipher_TLS_RSA_EXPORT_WITH_RC4_40_MD5        uint16 = 0x0003
    61		http2cipher_TLS_RSA_WITH_RC4_128_MD5              uint16 = 0x0004
    62		http2cipher_TLS_RSA_WITH_RC4_128_SHA              uint16 = 0x0005
    63		http2cipher_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5    uint16 = 0x0006
    64		http2cipher_TLS_RSA_WITH_IDEA_CBC_SHA             uint16 = 0x0007
    65		http2cipher_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA     uint16 = 0x0008
    66		http2cipher_TLS_RSA_WITH_DES_CBC_SHA              uint16 = 0x0009
    67		http2cipher_TLS_RSA_WITH_3DES_EDE_CBC_SHA         uint16 = 0x000A
    68		http2cipher_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA  uint16 = 0x000B
    69		http2cipher_TLS_DH_DSS_WITH_DES_CBC_SHA           uint16 = 0x000C
    70		http2cipher_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA      uint16 = 0x000D
    71		http2cipher_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA  uint16 = 0x000E
    72		http2cipher_TLS_DH_RSA_WITH_DES_CBC_SHA           uint16 = 0x000F
    73		http2cipher_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA      uint16 = 0x0010
    74		http2cipher_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0011
    75		http2cipher_TLS_DHE_DSS_WITH_DES_CBC_SHA          uint16 = 0x0012
    76		http2cipher_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA     uint16 = 0x0013
    77		http2cipher_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0014
    78		http2cipher_TLS_DHE_RSA_WITH_DES_CBC_SHA          uint16 = 0x0015
    79		http2cipher_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA     uint16 = 0x0016
    80		http2cipher_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5    uint16 = 0x0017
    81		http2cipher_TLS_DH_anon_WITH_RC4_128_MD5          uint16 = 0x0018
    82		http2cipher_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0019
    83		http2cipher_TLS_DH_anon_WITH_DES_CBC_SHA          uint16 = 0x001A
    84		http2cipher_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA     uint16 = 0x001B
    85		// Reserved uint16 =  0x001C-1D
    86		http2cipher_TLS_KRB5_WITH_DES_CBC_SHA             uint16 = 0x001E
    87		http2cipher_TLS_KRB5_WITH_3DES_EDE_CBC_SHA        uint16 = 0x001F
    88		http2cipher_TLS_KRB5_WITH_RC4_128_SHA             uint16 = 0x0020
    89		http2cipher_TLS_KRB5_WITH_IDEA_CBC_SHA            uint16 = 0x0021
    90		http2cipher_TLS_KRB5_WITH_DES_CBC_MD5             uint16 = 0x0022
    91		http2cipher_TLS_KRB5_WITH_3DES_EDE_CBC_MD5        uint16 = 0x0023
    92		http2cipher_TLS_KRB5_WITH_RC4_128_MD5             uint16 = 0x0024
    93		http2cipher_TLS_KRB5_WITH_IDEA_CBC_MD5            uint16 = 0x0025
    94		http2cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA   uint16 = 0x0026
    95		http2cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA   uint16 = 0x0027
    96		http2cipher_TLS_KRB5_EXPORT_WITH_RC4_40_SHA       uint16 = 0x0028
    97		http2cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5   uint16 = 0x0029
    98		http2cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5   uint16 = 0x002A
    99		http2cipher_TLS_KRB5_EXPORT_WITH_RC4_40_MD5       uint16 = 0x002B
   100		http2cipher_TLS_PSK_WITH_NULL_SHA                 uint16 = 0x002C
   101		http2cipher_TLS_DHE_PSK_WITH_NULL_SHA             uint16 = 0x002D
   102		http2cipher_TLS_RSA_PSK_WITH_NULL_SHA             uint16 = 0x002E
   103		http2cipher_TLS_RSA_WITH_AES_128_CBC_SHA          uint16 = 0x002F
   104		http2cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA       uint16 = 0x0030
   105		http2cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA       uint16 = 0x0031
   106		http2cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA      uint16 = 0x0032
   107		http2cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA      uint16 = 0x0033
   108		http2cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA      uint16 = 0x0034
   109		http2cipher_TLS_RSA_WITH_AES_256_CBC_SHA          uint16 = 0x0035
   110		http2cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA       uint16 = 0x0036
   111		http2cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA       uint16 = 0x0037
   112		http2cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA      uint16 = 0x0038
   113		http2cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA      uint16 = 0x0039
   114		http2cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA      uint16 = 0x003A
   115		http2cipher_TLS_RSA_WITH_NULL_SHA256              uint16 = 0x003B
   116		http2cipher_TLS_RSA_WITH_AES_128_CBC_SHA256       uint16 = 0x003C
   117		http2cipher_TLS_RSA_WITH_AES_256_CBC_SHA256       uint16 = 0x003D
   118		http2cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA256    uint16 = 0x003E
   119		http2cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA256    uint16 = 0x003F
   120		http2cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256   uint16 = 0x0040
   121		http2cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA     uint16 = 0x0041
   122		http2cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA  uint16 = 0x0042
   123		http2cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA  uint16 = 0x0043
   124		http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0044
   125		http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0045
   126		http2cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0046
   127		// Reserved uint16 =  0x0047-4F
   128		// Reserved uint16 =  0x0050-58
   129		// Reserved uint16 =  0x0059-5C
   130		// Unassigned uint16 =  0x005D-5F
   131		// Reserved uint16 =  0x0060-66
   132		http2cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x0067
   133		http2cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA256  uint16 = 0x0068
   134		http2cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA256  uint16 = 0x0069
   135		http2cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 uint16 = 0x006A
   136		http2cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x006B
   137		http2cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA256 uint16 = 0x006C
   138		http2cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA256 uint16 = 0x006D
   139		// Unassigned uint16 =  0x006E-83
   140		http2cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA        uint16 = 0x0084
   141		http2cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA     uint16 = 0x0085
   142		http2cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA     uint16 = 0x0086
   143		http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA    uint16 = 0x0087
   144		http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA    uint16 = 0x0088
   145		http2cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA    uint16 = 0x0089
   146		http2cipher_TLS_PSK_WITH_RC4_128_SHA                 uint16 = 0x008A
   147		http2cipher_TLS_PSK_WITH_3DES_EDE_CBC_SHA            uint16 = 0x008B
   148		http2cipher_TLS_PSK_WITH_AES_128_CBC_SHA             uint16 = 0x008C
   149		http2cipher_TLS_PSK_WITH_AES_256_CBC_SHA             uint16 = 0x008D
   150		http2cipher_TLS_DHE_PSK_WITH_RC4_128_SHA             uint16 = 0x008E
   151		http2cipher_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA        uint16 = 0x008F
   152		http2cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA         uint16 = 0x0090
   153		http2cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA         uint16 = 0x0091
   154		http2cipher_TLS_RSA_PSK_WITH_RC4_128_SHA             uint16 = 0x0092
   155		http2cipher_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA        uint16 = 0x0093
   156		http2cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA         uint16 = 0x0094
   157		http2cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA         uint16 = 0x0095
   158		http2cipher_TLS_RSA_WITH_SEED_CBC_SHA                uint16 = 0x0096
   159		http2cipher_TLS_DH_DSS_WITH_SEED_CBC_SHA             uint16 = 0x0097
   160		http2cipher_TLS_DH_RSA_WITH_SEED_CBC_SHA             uint16 = 0x0098
   161		http2cipher_TLS_DHE_DSS_WITH_SEED_CBC_SHA            uint16 = 0x0099
   162		http2cipher_TLS_DHE_RSA_WITH_SEED_CBC_SHA            uint16 = 0x009A
   163		http2cipher_TLS_DH_anon_WITH_SEED_CBC_SHA            uint16 = 0x009B
   164		http2cipher_TLS_RSA_WITH_AES_128_GCM_SHA256          uint16 = 0x009C
   165		http2cipher_TLS_RSA_WITH_AES_256_GCM_SHA384          uint16 = 0x009D
   166		http2cipher_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256      uint16 = 0x009E
   167		http2cipher_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384      uint16 = 0x009F
   168		http2cipher_TLS_DH_RSA_WITH_AES_128_GCM_SHA256       uint16 = 0x00A0
   169		http2cipher_TLS_DH_RSA_WITH_AES_256_GCM_SHA384       uint16 = 0x00A1
   170		http2cipher_TLS_DHE_DSS_WITH_AES_128_GCM_SHA256      uint16 = 0x00A2
   171		http2cipher_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384      uint16 = 0x00A3
   172		http2cipher_TLS_DH_DSS_WITH_AES_128_GCM_SHA256       uint16 = 0x00A4
   173		http2cipher_TLS_DH_DSS_WITH_AES_256_GCM_SHA384       uint16 = 0x00A5
   174		http2cipher_TLS_DH_anon_WITH_AES_128_GCM_SHA256      uint16 = 0x00A6
   175		http2cipher_TLS_DH_anon_WITH_AES_256_GCM_SHA384      uint16 = 0x00A7
   176		http2cipher_TLS_PSK_WITH_AES_128_GCM_SHA256          uint16 = 0x00A8
   177		http2cipher_TLS_PSK_WITH_AES_256_GCM_SHA384          uint16 = 0x00A9
   178		http2cipher_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256      uint16 = 0x00AA
   179		http2cipher_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384      uint16 = 0x00AB
   180		http2cipher_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256      uint16 = 0x00AC
   181		http2cipher_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384      uint16 = 0x00AD
   182		http2cipher_TLS_PSK_WITH_AES_128_CBC_SHA256          uint16 = 0x00AE
   183		http2cipher_TLS_PSK_WITH_AES_256_CBC_SHA384          uint16 = 0x00AF
   184		http2cipher_TLS_PSK_WITH_NULL_SHA256                 uint16 = 0x00B0
   185		http2cipher_TLS_PSK_WITH_NULL_SHA384                 uint16 = 0x00B1
   186		http2cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256      uint16 = 0x00B2
   187		http2cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384      uint16 = 0x00B3
   188		http2cipher_TLS_DHE_PSK_WITH_NULL_SHA256             uint16 = 0x00B4
   189		http2cipher_TLS_DHE_PSK_WITH_NULL_SHA384             uint16 = 0x00B5
   190		http2cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256      uint16 = 0x00B6
   191		http2cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384      uint16 = 0x00B7
   192		http2cipher_TLS_RSA_PSK_WITH_NULL_SHA256             uint16 = 0x00B8
   193		http2cipher_TLS_RSA_PSK_WITH_NULL_SHA384             uint16 = 0x00B9
   194		http2cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256     uint16 = 0x00BA
   195		http2cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256  uint16 = 0x00BB
   196		http2cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256  uint16 = 0x00BC
   197		http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BD
   198		http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BE
   199		http2cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BF
   200		http2cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256     uint16 = 0x00C0
   201		http2cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256  uint16 = 0x00C1
   202		http2cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256  uint16 = 0x00C2
   203		http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C3
   204		http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C4
   205		http2cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C5
   206		// Unassigned uint16 =  0x00C6-FE
   207		http2cipher_TLS_EMPTY_RENEGOTIATION_INFO_SCSV uint16 = 0x00FF
   208		// Unassigned uint16 =  0x01-55,*
   209		http2cipher_TLS_FALLBACK_SCSV uint16 = 0x5600
   210		// Unassigned                                   uint16 = 0x5601 - 0xC000
   211		http2cipher_TLS_ECDH_ECDSA_WITH_NULL_SHA                 uint16 = 0xC001
   212		http2cipher_TLS_ECDH_ECDSA_WITH_RC4_128_SHA              uint16 = 0xC002
   213		http2cipher_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA         uint16 = 0xC003
   214		http2cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA          uint16 = 0xC004
   215		http2cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA          uint16 = 0xC005
   216		http2cipher_TLS_ECDHE_ECDSA_WITH_NULL_SHA                uint16 = 0xC006
   217		http2cipher_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA             uint16 = 0xC007
   218		http2cipher_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA        uint16 = 0xC008
   219		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA         uint16 = 0xC009
   220		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA         uint16 = 0xC00A
   221		http2cipher_TLS_ECDH_RSA_WITH_NULL_SHA                   uint16 = 0xC00B
   222		http2cipher_TLS_ECDH_RSA_WITH_RC4_128_SHA                uint16 = 0xC00C
   223		http2cipher_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA           uint16 = 0xC00D
   224		http2cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA            uint16 = 0xC00E
   225		http2cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA            uint16 = 0xC00F
   226		http2cipher_TLS_ECDHE_RSA_WITH_NULL_SHA                  uint16 = 0xC010
   227		http2cipher_TLS_ECDHE_RSA_WITH_RC4_128_SHA               uint16 = 0xC011
   228		http2cipher_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA          uint16 = 0xC012
   229		http2cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA           uint16 = 0xC013
   230		http2cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA           uint16 = 0xC014
   231		http2cipher_TLS_ECDH_anon_WITH_NULL_SHA                  uint16 = 0xC015
   232		http2cipher_TLS_ECDH_anon_WITH_RC4_128_SHA               uint16 = 0xC016
   233		http2cipher_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA          uint16 = 0xC017
   234		http2cipher_TLS_ECDH_anon_WITH_AES_128_CBC_SHA           uint16 = 0xC018
   235		http2cipher_TLS_ECDH_anon_WITH_AES_256_CBC_SHA           uint16 = 0xC019
   236		http2cipher_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA            uint16 = 0xC01A
   237		http2cipher_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA        uint16 = 0xC01B
   238		http2cipher_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA        uint16 = 0xC01C
   239		http2cipher_TLS_SRP_SHA_WITH_AES_128_CBC_SHA             uint16 = 0xC01D
   240		http2cipher_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA         uint16 = 0xC01E
   241		http2cipher_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA         uint16 = 0xC01F
   242		http2cipher_TLS_SRP_SHA_WITH_AES_256_CBC_SHA             uint16 = 0xC020
   243		http2cipher_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA         uint16 = 0xC021
   244		http2cipher_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA         uint16 = 0xC022
   245		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256      uint16 = 0xC023
   246		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384      uint16 = 0xC024
   247		http2cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256       uint16 = 0xC025
   248		http2cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384       uint16 = 0xC026
   249		http2cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256        uint16 = 0xC027
   250		http2cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384        uint16 = 0xC028
   251		http2cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256         uint16 = 0xC029
   252		http2cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384         uint16 = 0xC02A
   253		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256      uint16 = 0xC02B
   254		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384      uint16 = 0xC02C
   255		http2cipher_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256       uint16 = 0xC02D
   256		http2cipher_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384       uint16 = 0xC02E
   257		http2cipher_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256        uint16 = 0xC02F
   258		http2cipher_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384        uint16 = 0xC030
   259		http2cipher_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256         uint16 = 0xC031
   260		http2cipher_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384         uint16 = 0xC032
   261		http2cipher_TLS_ECDHE_PSK_WITH_RC4_128_SHA               uint16 = 0xC033
   262		http2cipher_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA          uint16 = 0xC034
   263		http2cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA           uint16 = 0xC035
   264		http2cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA           uint16 = 0xC036
   265		http2cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256        uint16 = 0xC037
   266		http2cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384        uint16 = 0xC038
   267		http2cipher_TLS_ECDHE_PSK_WITH_NULL_SHA                  uint16 = 0xC039
   268		http2cipher_TLS_ECDHE_PSK_WITH_NULL_SHA256               uint16 = 0xC03A
   269		http2cipher_TLS_ECDHE_PSK_WITH_NULL_SHA384               uint16 = 0xC03B
   270		http2cipher_TLS_RSA_WITH_ARIA_128_CBC_SHA256             uint16 = 0xC03C
   271		http2cipher_TLS_RSA_WITH_ARIA_256_CBC_SHA384             uint16 = 0xC03D
   272		http2cipher_TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256          uint16 = 0xC03E
   273		http2cipher_TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384          uint16 = 0xC03F
   274		http2cipher_TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256          uint16 = 0xC040
   275		http2cipher_TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384          uint16 = 0xC041
   276		http2cipher_TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256         uint16 = 0xC042
   277		http2cipher_TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384         uint16 = 0xC043
   278		http2cipher_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256         uint16 = 0xC044
   279		http2cipher_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384         uint16 = 0xC045
   280		http2cipher_TLS_DH_anon_WITH_ARIA_128_CBC_SHA256         uint16 = 0xC046
   281		http2cipher_TLS_DH_anon_WITH_ARIA_256_CBC_SHA384         uint16 = 0xC047
   282		http2cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256     uint16 = 0xC048
   283		http2cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384     uint16 = 0xC049
   284		http2cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256      uint16 = 0xC04A
   285		http2cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384      uint16 = 0xC04B
   286		http2cipher_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256       uint16 = 0xC04C
   287		http2cipher_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384       uint16 = 0xC04D
   288		http2cipher_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256        uint16 = 0xC04E
   289		http2cipher_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384        uint16 = 0xC04F
   290		http2cipher_TLS_RSA_WITH_ARIA_128_GCM_SHA256             uint16 = 0xC050
   291		http2cipher_TLS_RSA_WITH_ARIA_256_GCM_SHA384             uint16 = 0xC051
   292		http2cipher_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256         uint16 = 0xC052
   293		http2cipher_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384         uint16 = 0xC053
   294		http2cipher_TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256          uint16 = 0xC054
   295		http2cipher_TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384          uint16 = 0xC055
   296		http2cipher_TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256         uint16 = 0xC056
   297		http2cipher_TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384         uint16 = 0xC057
   298		http2cipher_TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256          uint16 = 0xC058
   299		http2cipher_TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384          uint16 = 0xC059
   300		http2cipher_TLS_DH_anon_WITH_ARIA_128_GCM_SHA256         uint16 = 0xC05A
   301		http2cipher_TLS_DH_anon_WITH_ARIA_256_GCM_SHA384         uint16 = 0xC05B
   302		http2cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256     uint16 = 0xC05C
   303		http2cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384     uint16 = 0xC05D
   304		http2cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256      uint16 = 0xC05E
   305		http2cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384      uint16 = 0xC05F
   306		http2cipher_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256       uint16 = 0xC060
   307		http2cipher_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384       uint16 = 0xC061
   308		http2cipher_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256        uint16 = 0xC062
   309		http2cipher_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384        uint16 = 0xC063
   310		http2cipher_TLS_PSK_WITH_ARIA_128_CBC_SHA256             uint16 = 0xC064
   311		http2cipher_TLS_PSK_WITH_ARIA_256_CBC_SHA384             uint16 = 0xC065
   312		http2cipher_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256         uint16 = 0xC066
   313		http2cipher_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384         uint16 = 0xC067
   314		http2cipher_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256         uint16 = 0xC068
   315		http2cipher_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384         uint16 = 0xC069
   316		http2cipher_TLS_PSK_WITH_ARIA_128_GCM_SHA256             uint16 = 0xC06A
   317		http2cipher_TLS_PSK_WITH_ARIA_256_GCM_SHA384             uint16 = 0xC06B
   318		http2cipher_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256         uint16 = 0xC06C
   319		http2cipher_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384         uint16 = 0xC06D
   320		http2cipher_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256         uint16 = 0xC06E
   321		http2cipher_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384         uint16 = 0xC06F
   322		http2cipher_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256       uint16 = 0xC070
   323		http2cipher_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384       uint16 = 0xC071
   324		http2cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC072
   325		http2cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC073
   326		http2cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256  uint16 = 0xC074
   327		http2cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384  uint16 = 0xC075
   328		http2cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256   uint16 = 0xC076
   329		http2cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384   uint16 = 0xC077
   330		http2cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256    uint16 = 0xC078
   331		http2cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384    uint16 = 0xC079
   332		http2cipher_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256         uint16 = 0xC07A
   333		http2cipher_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384         uint16 = 0xC07B
   334		http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256     uint16 = 0xC07C
   335		http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384     uint16 = 0xC07D
   336		http2cipher_TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256      uint16 = 0xC07E
   337		http2cipher_TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384      uint16 = 0xC07F
   338		http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256     uint16 = 0xC080
   339		http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384     uint16 = 0xC081
   340		http2cipher_TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256      uint16 = 0xC082
   341		http2cipher_TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384      uint16 = 0xC083
   342		http2cipher_TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256     uint16 = 0xC084
   343		http2cipher_TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384     uint16 = 0xC085
   344		http2cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC086
   345		http2cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC087
   346		http2cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256  uint16 = 0xC088
   347		http2cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384  uint16 = 0xC089
   348		http2cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256   uint16 = 0xC08A
   349		http2cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384   uint16 = 0xC08B
   350		http2cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256    uint16 = 0xC08C
   351		http2cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384    uint16 = 0xC08D
   352		http2cipher_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256         uint16 = 0xC08E
   353		http2cipher_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384         uint16 = 0xC08F
   354		http2cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256     uint16 = 0xC090
   355		http2cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384     uint16 = 0xC091
   356		http2cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256     uint16 = 0xC092
   357		http2cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384     uint16 = 0xC093
   358		http2cipher_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256         uint16 = 0xC094
   359		http2cipher_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384         uint16 = 0xC095
   360		http2cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256     uint16 = 0xC096
   361		http2cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384     uint16 = 0xC097
   362		http2cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256     uint16 = 0xC098
   363		http2cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384     uint16 = 0xC099
   364		http2cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256   uint16 = 0xC09A
   365		http2cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384   uint16 = 0xC09B
   366		http2cipher_TLS_RSA_WITH_AES_128_CCM                     uint16 = 0xC09C
   367		http2cipher_TLS_RSA_WITH_AES_256_CCM                     uint16 = 0xC09D
   368		http2cipher_TLS_DHE_RSA_WITH_AES_128_CCM                 uint16 = 0xC09E
   369		http2cipher_TLS_DHE_RSA_WITH_AES_256_CCM                 uint16 = 0xC09F
   370		http2cipher_TLS_RSA_WITH_AES_128_CCM_8                   uint16 = 0xC0A0
   371		http2cipher_TLS_RSA_WITH_AES_256_CCM_8                   uint16 = 0xC0A1
   372		http2cipher_TLS_DHE_RSA_WITH_AES_128_CCM_8               uint16 = 0xC0A2
   373		http2cipher_TLS_DHE_RSA_WITH_AES_256_CCM_8               uint16 = 0xC0A3
   374		http2cipher_TLS_PSK_WITH_AES_128_CCM                     uint16 = 0xC0A4
   375		http2cipher_TLS_PSK_WITH_AES_256_CCM                     uint16 = 0xC0A5
   376		http2cipher_TLS_DHE_PSK_WITH_AES_128_CCM                 uint16 = 0xC0A6
   377		http2cipher_TLS_DHE_PSK_WITH_AES_256_CCM                 uint16 = 0xC0A7
   378		http2cipher_TLS_PSK_WITH_AES_128_CCM_8                   uint16 = 0xC0A8
   379		http2cipher_TLS_PSK_WITH_AES_256_CCM_8                   uint16 = 0xC0A9
   380		http2cipher_TLS_PSK_DHE_WITH_AES_128_CCM_8               uint16 = 0xC0AA
   381		http2cipher_TLS_PSK_DHE_WITH_AES_256_CCM_8               uint16 = 0xC0AB
   382		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CCM             uint16 = 0xC0AC
   383		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CCM             uint16 = 0xC0AD
   384		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8           uint16 = 0xC0AE
   385		http2cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8           uint16 = 0xC0AF
   386		// Unassigned uint16 =  0xC0B0-FF
   387		// Unassigned uint16 =  0xC1-CB,*
   388		// Unassigned uint16 =  0xCC00-A7
   389		http2cipher_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256   uint16 = 0xCCA8
   390		http2cipher_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCA9
   391		http2cipher_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256     uint16 = 0xCCAA
   392		http2cipher_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256         uint16 = 0xCCAB
   393		http2cipher_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256   uint16 = 0xCCAC
   394		http2cipher_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256     uint16 = 0xCCAD
   395		http2cipher_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256     uint16 = 0xCCAE
   396	)
   397	
   398	// isBadCipher reports whether the cipher is blacklisted by the HTTP/2 spec.
   399	// References:
   400	// https://tools.ietf.org/html/rfc7540#appendix-A
   401	// Reject cipher suites from Appendix A.
   402	// "This list includes those cipher suites that do not
   403	// offer an ephemeral key exchange and those that are
   404	// based on the TLS null, stream or block cipher type"
   405	func http2isBadCipher(cipher uint16) bool {
   406		switch cipher {
   407		case http2cipher_TLS_NULL_WITH_NULL_NULL,
   408			http2cipher_TLS_RSA_WITH_NULL_MD5,
   409			http2cipher_TLS_RSA_WITH_NULL_SHA,
   410			http2cipher_TLS_RSA_EXPORT_WITH_RC4_40_MD5,
   411			http2cipher_TLS_RSA_WITH_RC4_128_MD5,
   412			http2cipher_TLS_RSA_WITH_RC4_128_SHA,
   413			http2cipher_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5,
   414			http2cipher_TLS_RSA_WITH_IDEA_CBC_SHA,
   415			http2cipher_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA,
   416			http2cipher_TLS_RSA_WITH_DES_CBC_SHA,
   417			http2cipher_TLS_RSA_WITH_3DES_EDE_CBC_SHA,
   418			http2cipher_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA,
   419			http2cipher_TLS_DH_DSS_WITH_DES_CBC_SHA,
   420			http2cipher_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA,
   421			http2cipher_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA,
   422			http2cipher_TLS_DH_RSA_WITH_DES_CBC_SHA,
   423			http2cipher_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA,
   424			http2cipher_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,
   425			http2cipher_TLS_DHE_DSS_WITH_DES_CBC_SHA,
   426			http2cipher_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
   427			http2cipher_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
   428			http2cipher_TLS_DHE_RSA_WITH_DES_CBC_SHA,
   429			http2cipher_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
   430			http2cipher_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5,
   431			http2cipher_TLS_DH_anon_WITH_RC4_128_MD5,
   432			http2cipher_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA,
   433			http2cipher_TLS_DH_anon_WITH_DES_CBC_SHA,
   434			http2cipher_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA,
   435			http2cipher_TLS_KRB5_WITH_DES_CBC_SHA,
   436			http2cipher_TLS_KRB5_WITH_3DES_EDE_CBC_SHA,
   437			http2cipher_TLS_KRB5_WITH_RC4_128_SHA,
   438			http2cipher_TLS_KRB5_WITH_IDEA_CBC_SHA,
   439			http2cipher_TLS_KRB5_WITH_DES_CBC_MD5,
   440			http2cipher_TLS_KRB5_WITH_3DES_EDE_CBC_MD5,
   441			http2cipher_TLS_KRB5_WITH_RC4_128_MD5,
   442			http2cipher_TLS_KRB5_WITH_IDEA_CBC_MD5,
   443			http2cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA,
   444			http2cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA,
   445			http2cipher_TLS_KRB5_EXPORT_WITH_RC4_40_SHA,
   446			http2cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5,
   447			http2cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5,
   448			http2cipher_TLS_KRB5_EXPORT_WITH_RC4_40_MD5,
   449			http2cipher_TLS_PSK_WITH_NULL_SHA,
   450			http2cipher_TLS_DHE_PSK_WITH_NULL_SHA,
   451			http2cipher_TLS_RSA_PSK_WITH_NULL_SHA,
   452			http2cipher_TLS_RSA_WITH_AES_128_CBC_SHA,
   453			http2cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA,
   454			http2cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA,
   455			http2cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
   456			http2cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
   457			http2cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA,
   458			http2cipher_TLS_RSA_WITH_AES_256_CBC_SHA,
   459			http2cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA,
   460			http2cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA,
   461			http2cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
   462			http2cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
   463			http2cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA,
   464			http2cipher_TLS_RSA_WITH_NULL_SHA256,
   465			http2cipher_TLS_RSA_WITH_AES_128_CBC_SHA256,
   466			http2cipher_TLS_RSA_WITH_AES_256_CBC_SHA256,
   467			http2cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA256,
   468			http2cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA256,
   469			http2cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
   470			http2cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,
   471			http2cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA,
   472			http2cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA,
   473			http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA,
   474			http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
   475			http2cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA,
   476			http2cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
   477			http2cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA256,
   478			http2cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA256,
   479			http2cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
   480			http2cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
   481			http2cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA256,
   482			http2cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA256,
   483			http2cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,
   484			http2cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA,
   485			http2cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA,
   486			http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA,
   487			http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
   488			http2cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA,
   489			http2cipher_TLS_PSK_WITH_RC4_128_SHA,
   490			http2cipher_TLS_PSK_WITH_3DES_EDE_CBC_SHA,
   491			http2cipher_TLS_PSK_WITH_AES_128_CBC_SHA,
   492			http2cipher_TLS_PSK_WITH_AES_256_CBC_SHA,
   493			http2cipher_TLS_DHE_PSK_WITH_RC4_128_SHA,
   494			http2cipher_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,
   495			http2cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA,
   496			http2cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA,
   497			http2cipher_TLS_RSA_PSK_WITH_RC4_128_SHA,
   498			http2cipher_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA,
   499			http2cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA,
   500			http2cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA,
   501			http2cipher_TLS_RSA_WITH_SEED_CBC_SHA,
   502			http2cipher_TLS_DH_DSS_WITH_SEED_CBC_SHA,
   503			http2cipher_TLS_DH_RSA_WITH_SEED_CBC_SHA,
   504			http2cipher_TLS_DHE_DSS_WITH_SEED_CBC_SHA,
   505			http2cipher_TLS_DHE_RSA_WITH_SEED_CBC_SHA,
   506			http2cipher_TLS_DH_anon_WITH_SEED_CBC_SHA,
   507			http2cipher_TLS_RSA_WITH_AES_128_GCM_SHA256,
   508			http2cipher_TLS_RSA_WITH_AES_256_GCM_SHA384,
   509			http2cipher_TLS_DH_RSA_WITH_AES_128_GCM_SHA256,
   510			http2cipher_TLS_DH_RSA_WITH_AES_256_GCM_SHA384,
   511			http2cipher_TLS_DH_DSS_WITH_AES_128_GCM_SHA256,
   512			http2cipher_TLS_DH_DSS_WITH_AES_256_GCM_SHA384,
   513			http2cipher_TLS_DH_anon_WITH_AES_128_GCM_SHA256,
   514			http2cipher_TLS_DH_anon_WITH_AES_256_GCM_SHA384,
   515			http2cipher_TLS_PSK_WITH_AES_128_GCM_SHA256,
   516			http2cipher_TLS_PSK_WITH_AES_256_GCM_SHA384,
   517			http2cipher_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256,
   518			http2cipher_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384,
   519			http2cipher_TLS_PSK_WITH_AES_128_CBC_SHA256,
   520			http2cipher_TLS_PSK_WITH_AES_256_CBC_SHA384,
   521			http2cipher_TLS_PSK_WITH_NULL_SHA256,
   522			http2cipher_TLS_PSK_WITH_NULL_SHA384,
   523			http2cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
   524			http2cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,
   525			http2cipher_TLS_DHE_PSK_WITH_NULL_SHA256,
   526			http2cipher_TLS_DHE_PSK_WITH_NULL_SHA384,
   527			http2cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256,
   528			http2cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384,
   529			http2cipher_TLS_RSA_PSK_WITH_NULL_SHA256,
   530			http2cipher_TLS_RSA_PSK_WITH_NULL_SHA384,
   531			http2cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,
   532			http2cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256,
   533			http2cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256,
   534			http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256,
   535			http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
   536			http2cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256,
   537			http2cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,
   538			http2cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256,
   539			http2cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256,
   540			http2cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256,
   541			http2cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,
   542			http2cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256,
   543			http2cipher_TLS_EMPTY_RENEGOTIATION_INFO_SCSV,
   544			http2cipher_TLS_ECDH_ECDSA_WITH_NULL_SHA,
   545			http2cipher_TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
   546			http2cipher_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
   547			http2cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
   548			http2cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
   549			http2cipher_TLS_ECDHE_ECDSA_WITH_NULL_SHA,
   550			http2cipher_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
   551			http2cipher_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
   552			http2cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
   553			http2cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
   554			http2cipher_TLS_ECDH_RSA_WITH_NULL_SHA,
   555			http2cipher_TLS_ECDH_RSA_WITH_RC4_128_SHA,
   556			http2cipher_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
   557			http2cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
   558			http2cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
   559			http2cipher_TLS_ECDHE_RSA_WITH_NULL_SHA,
   560			http2cipher_TLS_ECDHE_RSA_WITH_RC4_128_SHA,
   561			http2cipher_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
   562			http2cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
   563			http2cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
   564			http2cipher_TLS_ECDH_anon_WITH_NULL_SHA,
   565			http2cipher_TLS_ECDH_anon_WITH_RC4_128_SHA,
   566			http2cipher_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,
   567			http2cipher_TLS_ECDH_anon_WITH_AES_128_CBC_SHA,
   568			http2cipher_TLS_ECDH_anon_WITH_AES_256_CBC_SHA,
   569			http2cipher_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA,
   570			http2cipher_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA,
   571			http2cipher_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA,
   572			http2cipher_TLS_SRP_SHA_WITH_AES_128_CBC_SHA,
   573			http2cipher_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA,
   574			http2cipher_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA,
   575			http2cipher_TLS_SRP_SHA_WITH_AES_256_CBC_SHA,
   576			http2cipher_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA,
   577			http2cipher_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA,
   578			http2cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
   579			http2cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
   580			http2cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
   581			http2cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
   582			http2cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
   583			http2cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
   584			http2cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,
   585			http2cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,
   586			http2cipher_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
   587			http2cipher_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
   588			http2cipher_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,
   589			http2cipher_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,
   590			http2cipher_TLS_ECDHE_PSK_WITH_RC4_128_SHA,
   591			http2cipher_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,
   592			http2cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
   593			http2cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA,
   594			http2cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
   595			http2cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384,
   596			http2cipher_TLS_ECDHE_PSK_WITH_NULL_SHA,
   597			http2cipher_TLS_ECDHE_PSK_WITH_NULL_SHA256,
   598			http2cipher_TLS_ECDHE_PSK_WITH_NULL_SHA384,
   599			http2cipher_TLS_RSA_WITH_ARIA_128_CBC_SHA256,
   600			http2cipher_TLS_RSA_WITH_ARIA_256_CBC_SHA384,
   601			http2cipher_TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256,
   602			http2cipher_TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384,
   603			http2cipher_TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256,
   604			http2cipher_TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384,
   605			http2cipher_TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256,
   606			http2cipher_TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384,
   607			http2cipher_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256,
   608			http2cipher_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384,
   609			http2cipher_TLS_DH_anon_WITH_ARIA_128_CBC_SHA256,
   610			http2cipher_TLS_DH_anon_WITH_ARIA_256_CBC_SHA384,
   611			http2cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256,
   612			http2cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384,
   613			http2cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256,
   614			http2cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384,
   615			http2cipher_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256,
   616			http2cipher_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384,
   617			http2cipher_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256,
   618			http2cipher_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384,
   619			http2cipher_TLS_RSA_WITH_ARIA_128_GCM_SHA256,
   620			http2cipher_TLS_RSA_WITH_ARIA_256_GCM_SHA384,
   621			http2cipher_TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256,
   622			http2cipher_TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384,
   623			http2cipher_TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256,
   624			http2cipher_TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384,
   625			http2cipher_TLS_DH_anon_WITH_ARIA_128_GCM_SHA256,
   626			http2cipher_TLS_DH_anon_WITH_ARIA_256_GCM_SHA384,
   627			http2cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256,
   628			http2cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384,
   629			http2cipher_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256,
   630			http2cipher_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384,
   631			http2cipher_TLS_PSK_WITH_ARIA_128_CBC_SHA256,
   632			http2cipher_TLS_PSK_WITH_ARIA_256_CBC_SHA384,
   633			http2cipher_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256,
   634			http2cipher_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384,
   635			http2cipher_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256,
   636			http2cipher_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384,
   637			http2cipher_TLS_PSK_WITH_ARIA_128_GCM_SHA256,
   638			http2cipher_TLS_PSK_WITH_ARIA_256_GCM_SHA384,
   639			http2cipher_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256,
   640			http2cipher_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384,
   641			http2cipher_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256,
   642			http2cipher_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384,
   643			http2cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
   644			http2cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
   645			http2cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
   646			http2cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
   647			http2cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
   648			http2cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384,
   649			http2cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256,
   650			http2cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384,
   651			http2cipher_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256,
   652			http2cipher_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384,
   653			http2cipher_TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256,
   654			http2cipher_TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384,
   655			http2cipher_TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256,
   656			http2cipher_TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384,
   657			http2cipher_TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256,
   658			http2cipher_TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384,
   659			http2cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256,
   660			http2cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384,
   661			http2cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256,
   662			http2cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384,
   663			http2cipher_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256,
   664			http2cipher_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384,
   665			http2cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256,
   666			http2cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384,
   667			http2cipher_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256,
   668			http2cipher_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384,
   669			http2cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,
   670			http2cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,
   671			http2cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256,
   672			http2cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384,
   673			http2cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,
   674			http2cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,
   675			http2cipher_TLS_RSA_WITH_AES_128_CCM,
   676			http2cipher_TLS_RSA_WITH_AES_256_CCM,
   677			http2cipher_TLS_RSA_WITH_AES_128_CCM_8,
   678			http2cipher_TLS_RSA_WITH_AES_256_CCM_8,
   679			http2cipher_TLS_PSK_WITH_AES_128_CCM,
   680			http2cipher_TLS_PSK_WITH_AES_256_CCM,
   681			http2cipher_TLS_PSK_WITH_AES_128_CCM_8,
   682			http2cipher_TLS_PSK_WITH_AES_256_CCM_8:
   683			return true
   684		default:
   685			return false
   686		}
   687	}
   688	
   689	// ClientConnPool manages a pool of HTTP/2 client connections.
   690	type http2ClientConnPool interface {
   691		GetClientConn(req *Request, addr string) (*http2ClientConn, error)
   692		MarkDead(*http2ClientConn)
   693	}
   694	
   695	// clientConnPoolIdleCloser is the interface implemented by ClientConnPool
   696	// implementations which can close their idle connections.
   697	type http2clientConnPoolIdleCloser interface {
   698		http2ClientConnPool
   699		closeIdleConnections()
   700	}
   701	
   702	var (
   703		_ http2clientConnPoolIdleCloser = (*http2clientConnPool)(nil)
   704		_ http2clientConnPoolIdleCloser = http2noDialClientConnPool{}
   705	)
   706	
   707	// TODO: use singleflight for dialing and addConnCalls?
   708	type http2clientConnPool struct {
   709		t *http2Transport
   710	
   711		mu sync.Mutex // TODO: maybe switch to RWMutex
   712		// TODO: add support for sharing conns based on cert names
   713		// (e.g. share conn for googleapis.com and appspot.com)
   714		conns        map[string][]*http2ClientConn // key is host:port
   715		dialing      map[string]*http2dialCall     // currently in-flight dials
   716		keys         map[*http2ClientConn][]string
   717		addConnCalls map[string]*http2addConnCall // in-flight addConnIfNeede calls
   718	}
   719	
   720	func (p *http2clientConnPool) GetClientConn(req *Request, addr string) (*http2ClientConn, error) {
   721		return p.getClientConn(req, addr, http2dialOnMiss)
   722	}
   723	
   724	const (
   725		http2dialOnMiss   = true
   726		http2noDialOnMiss = false
   727	)
   728	
   729	// shouldTraceGetConn reports whether getClientConn should call any
   730	// ClientTrace.GetConn hook associated with the http.Request.
   731	//
   732	// This complexity is needed to avoid double calls of the GetConn hook
   733	// during the back-and-forth between net/http and x/net/http2 (when the
   734	// net/http.Transport is upgraded to also speak http2), as well as support
   735	// the case where x/net/http2 is being used directly.
   736	func (p *http2clientConnPool) shouldTraceGetConn(st http2clientConnIdleState) bool {
   737		// If our Transport wasn't made via ConfigureTransport, always
   738		// trace the GetConn hook if provided, because that means the
   739		// http2 package is being used directly and it's the one
   740		// dialing, as opposed to net/http.
   741		if _, ok := p.t.ConnPool.(http2noDialClientConnPool); !ok {
   742			return true
   743		}
   744		// Otherwise, only use the GetConn hook if this connection has
   745		// been used previously for other requests. For fresh
   746		// connections, the net/http package does the dialing.
   747		return !st.freshConn
   748	}
   749	
   750	func (p *http2clientConnPool) getClientConn(req *Request, addr string, dialOnMiss bool) (*http2ClientConn, error) {
   751		if http2isConnectionCloseRequest(req) && dialOnMiss {
   752			// It gets its own connection.
   753			http2traceGetConn(req, addr)
   754			const singleUse = true
   755			cc, err := p.t.dialClientConn(addr, singleUse)
   756			if err != nil {
   757				return nil, err
   758			}
   759			return cc, nil
   760		}
   761		p.mu.Lock()
   762		for _, cc := range p.conns[addr] {
   763			if st := cc.idleState(); st.canTakeNewRequest {
   764				if p.shouldTraceGetConn(st) {
   765					http2traceGetConn(req, addr)
   766				}
   767				p.mu.Unlock()
   768				return cc, nil
   769			}
   770		}
   771		if !dialOnMiss {
   772			p.mu.Unlock()
   773			return nil, http2ErrNoCachedConn
   774		}
   775		http2traceGetConn(req, addr)
   776		call := p.getStartDialLocked(addr)
   777		p.mu.Unlock()
   778		<-call.done
   779		return call.res, call.err
   780	}
   781	
   782	// dialCall is an in-flight Transport dial call to a host.
   783	type http2dialCall struct {
   784		p    *http2clientConnPool
   785		done chan struct{}    // closed when done
   786		res  *http2ClientConn // valid after done is closed
   787		err  error            // valid after done is closed
   788	}
   789	
   790	// requires p.mu is held.
   791	func (p *http2clientConnPool) getStartDialLocked(addr string) *http2dialCall {
   792		if call, ok := p.dialing[addr]; ok {
   793			// A dial is already in-flight. Don't start another.
   794			return call
   795		}
   796		call := &http2dialCall{p: p, done: make(chan struct{})}
   797		if p.dialing == nil {
   798			p.dialing = make(map[string]*http2dialCall)
   799		}
   800		p.dialing[addr] = call
   801		go call.dial(addr)
   802		return call
   803	}
   804	
   805	// run in its own goroutine.
   806	func (c *http2dialCall) dial(addr string) {
   807		const singleUse = false // shared conn
   808		c.res, c.err = c.p.t.dialClientConn(addr, singleUse)
   809		close(c.done)
   810	
   811		c.p.mu.Lock()
   812		delete(c.p.dialing, addr)
   813		if c.err == nil {
   814			c.p.addConnLocked(addr, c.res)
   815		}
   816		c.p.mu.Unlock()
   817	}
   818	
   819	// addConnIfNeeded makes a NewClientConn out of c if a connection for key doesn't
   820	// already exist. It coalesces concurrent calls with the same key.
   821	// This is used by the http1 Transport code when it creates a new connection. Because
   822	// the http1 Transport doesn't de-dup TCP dials to outbound hosts (because it doesn't know
   823	// the protocol), it can get into a situation where it has multiple TLS connections.
   824	// This code decides which ones live or die.
   825	// The return value used is whether c was used.
   826	// c is never closed.
   827	func (p *http2clientConnPool) addConnIfNeeded(key string, t *http2Transport, c *tls.Conn) (used bool, err error) {
   828		p.mu.Lock()
   829		for _, cc := range p.conns[key] {
   830			if cc.CanTakeNewRequest() {
   831				p.mu.Unlock()
   832				return false, nil
   833			}
   834		}
   835		call, dup := p.addConnCalls[key]
   836		if !dup {
   837			if p.addConnCalls == nil {
   838				p.addConnCalls = make(map[string]*http2addConnCall)
   839			}
   840			call = &http2addConnCall{
   841				p:    p,
   842				done: make(chan struct{}),
   843			}
   844			p.addConnCalls[key] = call
   845			go call.run(t, key, c)
   846		}
   847		p.mu.Unlock()
   848	
   849		<-call.done
   850		if call.err != nil {
   851			return false, call.err
   852		}
   853		return !dup, nil
   854	}
   855	
   856	type http2addConnCall struct {
   857		p    *http2clientConnPool
   858		done chan struct{} // closed when done
   859		err  error
   860	}
   861	
   862	func (c *http2addConnCall) run(t *http2Transport, key string, tc *tls.Conn) {
   863		cc, err := t.NewClientConn(tc)
   864	
   865		p := c.p
   866		p.mu.Lock()
   867		if err != nil {
   868			c.err = err
   869		} else {
   870			p.addConnLocked(key, cc)
   871		}
   872		delete(p.addConnCalls, key)
   873		p.mu.Unlock()
   874		close(c.done)
   875	}
   876	
   877	func (p *http2clientConnPool) addConn(key string, cc *http2ClientConn) {
   878		p.mu.Lock()
   879		p.addConnLocked(key, cc)
   880		p.mu.Unlock()
   881	}
   882	
   883	// p.mu must be held
   884	func (p *http2clientConnPool) addConnLocked(key string, cc *http2ClientConn) {
   885		for _, v := range p.conns[key] {
   886			if v == cc {
   887				return
   888			}
   889		}
   890		if p.conns == nil {
   891			p.conns = make(map[string][]*http2ClientConn)
   892		}
   893		if p.keys == nil {
   894			p.keys = make(map[*http2ClientConn][]string)
   895		}
   896		p.conns[key] = append(p.conns[key], cc)
   897		p.keys[cc] = append(p.keys[cc], key)
   898	}
   899	
   900	func (p *http2clientConnPool) MarkDead(cc *http2ClientConn) {
   901		p.mu.Lock()
   902		defer p.mu.Unlock()
   903		for _, key := range p.keys[cc] {
   904			vv, ok := p.conns[key]
   905			if !ok {
   906				continue
   907			}
   908			newList := http2filterOutClientConn(vv, cc)
   909			if len(newList) > 0 {
   910				p.conns[key] = newList
   911			} else {
   912				delete(p.conns, key)
   913			}
   914		}
   915		delete(p.keys, cc)
   916	}
   917	
   918	func (p *http2clientConnPool) closeIdleConnections() {
   919		p.mu.Lock()
   920		defer p.mu.Unlock()
   921		// TODO: don't close a cc if it was just added to the pool
   922		// milliseconds ago and has never been used. There's currently
   923		// a small race window with the HTTP/1 Transport's integration
   924		// where it can add an idle conn just before using it, and
   925		// somebody else can concurrently call CloseIdleConns and
   926		// break some caller's RoundTrip.
   927		for _, vv := range p.conns {
   928			for _, cc := range vv {
   929				cc.closeIfIdle()
   930			}
   931		}
   932	}
   933	
   934	func http2filterOutClientConn(in []*http2ClientConn, exclude *http2ClientConn) []*http2ClientConn {
   935		out := in[:0]
   936		for _, v := range in {
   937			if v != exclude {
   938				out = append(out, v)
   939			}
   940		}
   941		// If we filtered it out, zero out the last item to prevent
   942		// the GC from seeing it.
   943		if len(in) != len(out) {
   944			in[len(in)-1] = nil
   945		}
   946		return out
   947	}
   948	
   949	// noDialClientConnPool is an implementation of http2.ClientConnPool
   950	// which never dials. We let the HTTP/1.1 client dial and use its TLS
   951	// connection instead.
   952	type http2noDialClientConnPool struct{ *http2clientConnPool }
   953	
   954	func (p http2noDialClientConnPool) GetClientConn(req *Request, addr string) (*http2ClientConn, error) {
   955		return p.getClientConn(req, addr, http2noDialOnMiss)
   956	}
   957	
   958	// Buffer chunks are allocated from a pool to reduce pressure on GC.
   959	// The maximum wasted space per dataBuffer is 2x the largest size class,
   960	// which happens when the dataBuffer has multiple chunks and there is
   961	// one unread byte in both the first and last chunks. We use a few size
   962	// classes to minimize overheads for servers that typically receive very
   963	// small request bodies.
   964	//
   965	// TODO: Benchmark to determine if the pools are necessary. The GC may have
   966	// improved enough that we can instead allocate chunks like this:
   967	// make([]byte, max(16<<10, expectedBytesRemaining))
   968	var (
   969		http2dataChunkSizeClasses = []int{
   970			1 << 10,
   971			2 << 10,
   972			4 << 10,
   973			8 << 10,
   974			16 << 10,
   975		}
   976		http2dataChunkPools = [...]sync.Pool{
   977			{New: func() interface{} { return make([]byte, 1<<10) }},
   978			{New: func() interface{} { return make([]byte, 2<<10) }},
   979			{New: func() interface{} { return make([]byte, 4<<10) }},
   980			{New: func() interface{} { return make([]byte, 8<<10) }},
   981			{New: func() interface{} { return make([]byte, 16<<10) }},
   982		}
   983	)
   984	
   985	func http2getDataBufferChunk(size int64) []byte {
   986		i := 0
   987		for ; i < len(http2dataChunkSizeClasses)-1; i++ {
   988			if size <= int64(http2dataChunkSizeClasses[i]) {
   989				break
   990			}
   991		}
   992		return http2dataChunkPools[i].Get().([]byte)
   993	}
   994	
   995	func http2putDataBufferChunk(p []byte) {
   996		for i, n := range http2dataChunkSizeClasses {
   997			if len(p) == n {
   998				http2dataChunkPools[i].Put(p)
   999				return
  1000			}
  1001		}
  1002		panic(fmt.Sprintf("unexpected buffer len=%v", len(p)))
  1003	}
  1004	
  1005	// dataBuffer is an io.ReadWriter backed by a list of data chunks.
  1006	// Each dataBuffer is used to read DATA frames on a single stream.
  1007	// The buffer is divided into chunks so the server can limit the
  1008	// total memory used by a single connection without limiting the
  1009	// request body size on any single stream.
  1010	type http2dataBuffer struct {
  1011		chunks   [][]byte
  1012		r        int   // next byte to read is chunks[0][r]
  1013		w        int   // next byte to write is chunks[len(chunks)-1][w]
  1014		size     int   // total buffered bytes
  1015		expected int64 // we expect at least this many bytes in future Write calls (ignored if <= 0)
  1016	}
  1017	
  1018	var http2errReadEmpty = errors.New("read from empty dataBuffer")
  1019	
  1020	// Read copies bytes from the buffer into p.
  1021	// It is an error to read when no data is available.
  1022	func (b *http2dataBuffer) Read(p []byte) (int, error) {
  1023		if b.size == 0 {
  1024			return 0, http2errReadEmpty
  1025		}
  1026		var ntotal int
  1027		for len(p) > 0 && b.size > 0 {
  1028			readFrom := b.bytesFromFirstChunk()
  1029			n := copy(p, readFrom)
  1030			p = p[n:]
  1031			ntotal += n
  1032			b.r += n
  1033			b.size -= n
  1034			// If the first chunk has been consumed, advance to the next chunk.
  1035			if b.r == len(b.chunks[0]) {
  1036				http2putDataBufferChunk(b.chunks[0])
  1037				end := len(b.chunks) - 1
  1038				copy(b.chunks[:end], b.chunks[1:])
  1039				b.chunks[end] = nil
  1040				b.chunks = b.chunks[:end]
  1041				b.r = 0
  1042			}
  1043		}
  1044		return ntotal, nil
  1045	}
  1046	
  1047	func (b *http2dataBuffer) bytesFromFirstChunk() []byte {
  1048		if len(b.chunks) == 1 {
  1049			return b.chunks[0][b.r:b.w]
  1050		}
  1051		return b.chunks[0][b.r:]
  1052	}
  1053	
  1054	// Len returns the number of bytes of the unread portion of the buffer.
  1055	func (b *http2dataBuffer) Len() int {
  1056		return b.size
  1057	}
  1058	
  1059	// Write appends p to the buffer.
  1060	func (b *http2dataBuffer) Write(p []byte) (int, error) {
  1061		ntotal := len(p)
  1062		for len(p) > 0 {
  1063			// If the last chunk is empty, allocate a new chunk. Try to allocate
  1064			// enough to fully copy p plus any additional bytes we expect to
  1065			// receive. However, this may allocate less than len(p).
  1066			want := int64(len(p))
  1067			if b.expected > want {
  1068				want = b.expected
  1069			}
  1070			chunk := b.lastChunkOrAlloc(want)
  1071			n := copy(chunk[b.w:], p)
  1072			p = p[n:]
  1073			b.w += n
  1074			b.size += n
  1075			b.expected -= int64(n)
  1076		}
  1077		return ntotal, nil
  1078	}
  1079	
  1080	func (b *http2dataBuffer) lastChunkOrAlloc(want int64) []byte {
  1081		if len(b.chunks) != 0 {
  1082			last := b.chunks[len(b.chunks)-1]
  1083			if b.w < len(last) {
  1084				return last
  1085			}
  1086		}
  1087		chunk := http2getDataBufferChunk(want)
  1088		b.chunks = append(b.chunks, chunk)
  1089		b.w = 0
  1090		return chunk
  1091	}
  1092	
  1093	// An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec.
  1094	type http2ErrCode uint32
  1095	
  1096	const (
  1097		http2ErrCodeNo                 http2ErrCode = 0x0
  1098		http2ErrCodeProtocol           http2ErrCode = 0x1
  1099		http2ErrCodeInternal           http2ErrCode = 0x2
  1100		http2ErrCodeFlowControl        http2ErrCode = 0x3
  1101		http2ErrCodeSettingsTimeout    http2ErrCode = 0x4
  1102		http2ErrCodeStreamClosed       http2ErrCode = 0x5
  1103		http2ErrCodeFrameSize          http2ErrCode = 0x6
  1104		http2ErrCodeRefusedStream      http2ErrCode = 0x7
  1105		http2ErrCodeCancel             http2ErrCode = 0x8
  1106		http2ErrCodeCompression        http2ErrCode = 0x9
  1107		http2ErrCodeConnect            http2ErrCode = 0xa
  1108		http2ErrCodeEnhanceYourCalm    http2ErrCode = 0xb
  1109		http2ErrCodeInadequateSecurity http2ErrCode = 0xc
  1110		http2ErrCodeHTTP11Required     http2ErrCode = 0xd
  1111	)
  1112	
  1113	var http2errCodeName = map[http2ErrCode]string{
  1114		http2ErrCodeNo:                 "NO_ERROR",
  1115		http2ErrCodeProtocol:           "PROTOCOL_ERROR",
  1116		http2ErrCodeInternal:           "INTERNAL_ERROR",
  1117		http2ErrCodeFlowControl:        "FLOW_CONTROL_ERROR",
  1118		http2ErrCodeSettingsTimeout:    "SETTINGS_TIMEOUT",
  1119		http2ErrCodeStreamClosed:       "STREAM_CLOSED",
  1120		http2ErrCodeFrameSize:          "FRAME_SIZE_ERROR",
  1121		http2ErrCodeRefusedStream:      "REFUSED_STREAM",
  1122		http2ErrCodeCancel:             "CANCEL",
  1123		http2ErrCodeCompression:        "COMPRESSION_ERROR",
  1124		http2ErrCodeConnect:            "CONNECT_ERROR",
  1125		http2ErrCodeEnhanceYourCalm:    "ENHANCE_YOUR_CALM",
  1126		http2ErrCodeInadequateSecurity: "INADEQUATE_SECURITY",
  1127		http2ErrCodeHTTP11Required:     "HTTP_1_1_REQUIRED",
  1128	}
  1129	
  1130	func (e http2ErrCode) String() string {
  1131		if s, ok := http2errCodeName[e]; ok {
  1132			return s
  1133		}
  1134		return fmt.Sprintf("unknown error code 0x%x", uint32(e))
  1135	}
  1136	
  1137	// ConnectionError is an error that results in the termination of the
  1138	// entire connection.
  1139	type http2ConnectionError http2ErrCode
  1140	
  1141	func (e http2ConnectionError) Error() string {
  1142		return fmt.Sprintf("connection error: %s", http2ErrCode(e))
  1143	}
  1144	
  1145	// StreamError is an error that only affects one stream within an
  1146	// HTTP/2 connection.
  1147	type http2StreamError struct {
  1148		StreamID uint32
  1149		Code     http2ErrCode
  1150		Cause    error // optional additional detail
  1151	}
  1152	
  1153	func http2streamError(id uint32, code http2ErrCode) http2StreamError {
  1154		return http2StreamError{StreamID: id, Code: code}
  1155	}
  1156	
  1157	func (e http2StreamError) Error() string {
  1158		if e.Cause != nil {
  1159			return fmt.Sprintf("stream error: stream ID %d; %v; %v", e.StreamID, e.Code, e.Cause)
  1160		}
  1161		return fmt.Sprintf("stream error: stream ID %d; %v", e.StreamID, e.Code)
  1162	}
  1163	
  1164	// 6.9.1 The Flow Control Window
  1165	// "If a sender receives a WINDOW_UPDATE that causes a flow control
  1166	// window to exceed this maximum it MUST terminate either the stream
  1167	// or the connection, as appropriate. For streams, [...]; for the
  1168	// connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code."
  1169	type http2goAwayFlowError struct{}
  1170	
  1171	func (http2goAwayFlowError) Error() string { return "connection exceeded flow control window size" }
  1172	
  1173	// connError represents an HTTP/2 ConnectionError error code, along
  1174	// with a string (for debugging) explaining why.
  1175	//
  1176	// Errors of this type are only returned by the frame parser functions
  1177	// and converted into ConnectionError(Code), after stashing away
  1178	// the Reason into the Framer's errDetail field, accessible via
  1179	// the (*Framer).ErrorDetail method.
  1180	type http2connError struct {
  1181		Code   http2ErrCode // the ConnectionError error code
  1182		Reason string       // additional reason
  1183	}
  1184	
  1185	func (e http2connError) Error() string {
  1186		return fmt.Sprintf("http2: connection error: %v: %v", e.Code, e.Reason)
  1187	}
  1188	
  1189	type http2pseudoHeaderError string
  1190	
  1191	func (e http2pseudoHeaderError) Error() string {
  1192		return fmt.Sprintf("invalid pseudo-header %q", string(e))
  1193	}
  1194	
  1195	type http2duplicatePseudoHeaderError string
  1196	
  1197	func (e http2duplicatePseudoHeaderError) Error() string {
  1198		return fmt.Sprintf("duplicate pseudo-header %q", string(e))
  1199	}
  1200	
  1201	type http2headerFieldNameError string
  1202	
  1203	func (e http2headerFieldNameError) Error() string {
  1204		return fmt.Sprintf("invalid header field name %q", string(e))
  1205	}
  1206	
  1207	type http2headerFieldValueError string
  1208	
  1209	func (e http2headerFieldValueError) Error() string {
  1210		return fmt.Sprintf("invalid header field value %q", string(e))
  1211	}
  1212	
  1213	var (
  1214		http2errMixPseudoHeaderTypes = errors.New("mix of request and response pseudo headers")
  1215		http2errPseudoAfterRegular   = errors.New("pseudo header field after regular")
  1216	)
  1217	
  1218	// flow is the flow control window's size.
  1219	type http2flow struct {
  1220		// n is the number of DATA bytes we're allowed to send.
  1221		// A flow is kept both on a conn and a per-stream.
  1222		n int32
  1223	
  1224		// conn points to the shared connection-level flow that is
  1225		// shared by all streams on that conn. It is nil for the flow
  1226		// that's on the conn directly.
  1227		conn *http2flow
  1228	}
  1229	
  1230	func (f *http2flow) setConnFlow(cf *http2flow) { f.conn = cf }
  1231	
  1232	func (f *http2flow) available() int32 {
  1233		n := f.n
  1234		if f.conn != nil && f.conn.n < n {
  1235			n = f.conn.n
  1236		}
  1237		return n
  1238	}
  1239	
  1240	func (f *http2flow) take(n int32) {
  1241		if n > f.available() {
  1242			panic("internal error: took too much")
  1243		}
  1244		f.n -= n
  1245		if f.conn != nil {
  1246			f.conn.n -= n
  1247		}
  1248	}
  1249	
  1250	// add adds n bytes (positive or negative) to the flow control window.
  1251	// It returns false if the sum would exceed 2^31-1.
  1252	func (f *http2flow) add(n int32) bool {
  1253		sum := f.n + n
  1254		if (sum > n) == (f.n > 0) {
  1255			f.n = sum
  1256			return true
  1257		}
  1258		return false
  1259	}
  1260	
  1261	const http2frameHeaderLen = 9
  1262	
  1263	var http2padZeros = make([]byte, 255) // zeros for padding
  1264	
  1265	// A FrameType is a registered frame type as defined in
  1266	// http://http2.github.io/http2-spec/#rfc.section.11.2
  1267	type http2FrameType uint8
  1268	
  1269	const (
  1270		http2FrameData         http2FrameType = 0x0
  1271		http2FrameHeaders      http2FrameType = 0x1
  1272		http2FramePriority     http2FrameType = 0x2
  1273		http2FrameRSTStream    http2FrameType = 0x3
  1274		http2FrameSettings     http2FrameType = 0x4
  1275		http2FramePushPromise  http2FrameType = 0x5
  1276		http2FramePing         http2FrameType = 0x6
  1277		http2FrameGoAway       http2FrameType = 0x7
  1278		http2FrameWindowUpdate http2FrameType = 0x8
  1279		http2FrameContinuation http2FrameType = 0x9
  1280	)
  1281	
  1282	var http2frameName = map[http2FrameType]string{
  1283		http2FrameData:         "DATA",
  1284		http2FrameHeaders:      "HEADERS",
  1285		http2FramePriority:     "PRIORITY",
  1286		http2FrameRSTStream:    "RST_STREAM",
  1287		http2FrameSettings:     "SETTINGS",
  1288		http2FramePushPromise:  "PUSH_PROMISE",
  1289		http2FramePing:         "PING",
  1290		http2FrameGoAway:       "GOAWAY",
  1291		http2FrameWindowUpdate: "WINDOW_UPDATE",
  1292		http2FrameContinuation: "CONTINUATION",
  1293	}
  1294	
  1295	func (t http2FrameType) String() string {
  1296		if s, ok := http2frameName[t]; ok {
  1297			return s
  1298		}
  1299		return fmt.Sprintf("UNKNOWN_FRAME_TYPE_%d", uint8(t))
  1300	}
  1301	
  1302	// Flags is a bitmask of HTTP/2 flags.
  1303	// The meaning of flags varies depending on the frame type.
  1304	type http2Flags uint8
  1305	
  1306	// Has reports whether f contains all (0 or more) flags in v.
  1307	func (f http2Flags) Has(v http2Flags) bool {
  1308		return (f & v) == v
  1309	}
  1310	
  1311	// Frame-specific FrameHeader flag bits.
  1312	const (
  1313		// Data Frame
  1314		http2FlagDataEndStream http2Flags = 0x1
  1315		http2FlagDataPadded    http2Flags = 0x8
  1316	
  1317		// Headers Frame
  1318		http2FlagHeadersEndStream  http2Flags = 0x1
  1319		http2FlagHeadersEndHeaders http2Flags = 0x4
  1320		http2FlagHeadersPadded     http2Flags = 0x8
  1321		http2FlagHeadersPriority   http2Flags = 0x20
  1322	
  1323		// Settings Frame
  1324		http2FlagSettingsAck http2Flags = 0x1
  1325	
  1326		// Ping Frame
  1327		http2FlagPingAck http2Flags = 0x1
  1328	
  1329		// Continuation Frame
  1330		http2FlagContinuationEndHeaders http2Flags = 0x4
  1331	
  1332		http2FlagPushPromiseEndHeaders http2Flags = 0x4
  1333		http2FlagPushPromisePadded     http2Flags = 0x8
  1334	)
  1335	
  1336	var http2flagName = map[http2FrameType]map[http2Flags]string{
  1337		http2FrameData: {
  1338			http2FlagDataEndStream: "END_STREAM",
  1339			http2FlagDataPadded:    "PADDED",
  1340		},
  1341		http2FrameHeaders: {
  1342			http2FlagHeadersEndStream:  "END_STREAM",
  1343			http2FlagHeadersEndHeaders: "END_HEADERS",
  1344			http2FlagHeadersPadded:     "PADDED",
  1345			http2FlagHeadersPriority:   "PRIORITY",
  1346		},
  1347		http2FrameSettings: {
  1348			http2FlagSettingsAck: "ACK",
  1349		},
  1350		http2FramePing: {
  1351			http2FlagPingAck: "ACK",
  1352		},
  1353		http2FrameContinuation: {
  1354			http2FlagContinuationEndHeaders: "END_HEADERS",
  1355		},
  1356		http2FramePushPromise: {
  1357			http2FlagPushPromiseEndHeaders: "END_HEADERS",
  1358			http2FlagPushPromisePadded:     "PADDED",
  1359		},
  1360	}
  1361	
  1362	// a frameParser parses a frame given its FrameHeader and payload
  1363	// bytes. The length of payload will always equal fh.Length (which
  1364	// might be 0).
  1365	type http2frameParser func(fc *http2frameCache, fh http2FrameHeader, payload []byte) (http2Frame, error)
  1366	
  1367	var http2frameParsers = map[http2FrameType]http2frameParser{
  1368		http2FrameData:         http2parseDataFrame,
  1369		http2FrameHeaders:      http2parseHeadersFrame,
  1370		http2FramePriority:     http2parsePriorityFrame,
  1371		http2FrameRSTStream:    http2parseRSTStreamFrame,
  1372		http2FrameSettings:     http2parseSettingsFrame,
  1373		http2FramePushPromise:  http2parsePushPromise,
  1374		http2FramePing:         http2parsePingFrame,
  1375		http2FrameGoAway:       http2parseGoAwayFrame,
  1376		http2FrameWindowUpdate: http2parseWindowUpdateFrame,
  1377		http2FrameContinuation: http2parseContinuationFrame,
  1378	}
  1379	
  1380	func http2typeFrameParser(t http2FrameType) http2frameParser {
  1381		if f := http2frameParsers[t]; f != nil {
  1382			return f
  1383		}
  1384		return http2parseUnknownFrame
  1385	}
  1386	
  1387	// A FrameHeader is the 9 byte header of all HTTP/2 frames.
  1388	//
  1389	// See http://http2.github.io/http2-spec/#FrameHeader
  1390	type http2FrameHeader struct {
  1391		valid bool // caller can access []byte fields in the Frame
  1392	
  1393		// Type is the 1 byte frame type. There are ten standard frame
  1394		// types, but extension frame types may be written by WriteRawFrame
  1395		// and will be returned by ReadFrame (as UnknownFrame).
  1396		Type http2FrameType
  1397	
  1398		// Flags are the 1 byte of 8 potential bit flags per frame.
  1399		// They are specific to the frame type.
  1400		Flags http2Flags
  1401	
  1402		// Length is the length of the frame, not including the 9 byte header.
  1403		// The maximum size is one byte less than 16MB (uint24), but only
  1404		// frames up to 16KB are allowed without peer agreement.
  1405		Length uint32
  1406	
  1407		// StreamID is which stream this frame is for. Certain frames
  1408		// are not stream-specific, in which case this field is 0.
  1409		StreamID uint32
  1410	}
  1411	
  1412	// Header returns h. It exists so FrameHeaders can be embedded in other
  1413	// specific frame types and implement the Frame interface.
  1414	func (h http2FrameHeader) Header() http2FrameHeader { return h }
  1415	
  1416	func (h http2FrameHeader) String() string {
  1417		var buf bytes.Buffer
  1418		buf.WriteString("[FrameHeader ")
  1419		h.writeDebug(&buf)
  1420		buf.WriteByte(']')
  1421		return buf.String()
  1422	}
  1423	
  1424	func (h http2FrameHeader) writeDebug(buf *bytes.Buffer) {
  1425		buf.WriteString(h.Type.String())
  1426		if h.Flags != 0 {
  1427			buf.WriteString(" flags=")
  1428			set := 0
  1429			for i := uint8(0); i < 8; i++ {
  1430				if h.Flags&(1<<i) == 0 {
  1431					continue
  1432				}
  1433				set++
  1434				if set > 1 {
  1435					buf.WriteByte('|')
  1436				}
  1437				name := http2flagName[h.Type][http2Flags(1<<i)]
  1438				if name != "" {
  1439					buf.WriteString(name)
  1440				} else {
  1441					fmt.Fprintf(buf, "0x%x", 1<<i)
  1442				}
  1443			}
  1444		}
  1445		if h.StreamID != 0 {
  1446			fmt.Fprintf(buf, " stream=%d", h.StreamID)
  1447		}
  1448		fmt.Fprintf(buf, " len=%d", h.Length)
  1449	}
  1450	
  1451	func (h *http2FrameHeader) checkValid() {
  1452		if !h.valid {
  1453			panic("Frame accessor called on non-owned Frame")
  1454		}
  1455	}
  1456	
  1457	func (h *http2FrameHeader) invalidate() { h.valid = false }
  1458	
  1459	// frame header bytes.
  1460	// Used only by ReadFrameHeader.
  1461	var http2fhBytes = sync.Pool{
  1462		New: func() interface{} {
  1463			buf := make([]byte, http2frameHeaderLen)
  1464			return &buf
  1465		},
  1466	}
  1467	
  1468	// ReadFrameHeader reads 9 bytes from r and returns a FrameHeader.
  1469	// Most users should use Framer.ReadFrame instead.
  1470	func http2ReadFrameHeader(r io.Reader) (http2FrameHeader, error) {
  1471		bufp := http2fhBytes.Get().(*[]byte)
  1472		defer http2fhBytes.Put(bufp)
  1473		return http2readFrameHeader(*bufp, r)
  1474	}
  1475	
  1476	func http2readFrameHeader(buf []byte, r io.Reader) (http2FrameHeader, error) {
  1477		_, err := io.ReadFull(r, buf[:http2frameHeaderLen])
  1478		if err != nil {
  1479			return http2FrameHeader{}, err
  1480		}
  1481		return http2FrameHeader{
  1482			Length:   (uint32(buf[0])<<16 | uint32(buf[1])<<8 | uint32(buf[2])),
  1483			Type:     http2FrameType(buf[3]),
  1484			Flags:    http2Flags(buf[4]),
  1485			StreamID: binary.BigEndian.Uint32(buf[5:]) & (1<<31 - 1),
  1486			valid:    true,
  1487		}, nil
  1488	}
  1489	
  1490	// A Frame is the base interface implemented by all frame types.
  1491	// Callers will generally type-assert the specific frame type:
  1492	// *HeadersFrame, *SettingsFrame, *WindowUpdateFrame, etc.
  1493	//
  1494	// Frames are only valid until the next call to Framer.ReadFrame.
  1495	type http2Frame interface {
  1496		Header() http2FrameHeader
  1497	
  1498		// invalidate is called by Framer.ReadFrame to make this
  1499		// frame's buffers as being invalid, since the subsequent
  1500		// frame will reuse them.
  1501		invalidate()
  1502	}
  1503	
  1504	// A Framer reads and writes Frames.
  1505	type http2Framer struct {
  1506		r         io.Reader
  1507		lastFrame http2Frame
  1508		errDetail error
  1509	
  1510		// lastHeaderStream is non-zero if the last frame was an
  1511		// unfinished HEADERS/CONTINUATION.
  1512		lastHeaderStream uint32
  1513	
  1514		maxReadSize uint32
  1515		headerBuf   [http2frameHeaderLen]byte
  1516	
  1517		// TODO: let getReadBuf be configurable, and use a less memory-pinning
  1518		// allocator in server.go to minimize memory pinned for many idle conns.
  1519		// Will probably also need to make frame invalidation have a hook too.
  1520		getReadBuf func(size uint32) []byte
  1521		readBuf    []byte // cache for default getReadBuf
  1522	
  1523		maxWriteSize uint32 // zero means unlimited; TODO: implement
  1524	
  1525		w    io.Writer
  1526		wbuf []byte
  1527	
  1528		// AllowIllegalWrites permits the Framer's Write methods to
  1529		// write frames that do not conform to the HTTP/2 spec. This
  1530		// permits using the Framer to test other HTTP/2
  1531		// implementations' conformance to the spec.
  1532		// If false, the Write methods will prefer to return an error
  1533		// rather than comply.
  1534		AllowIllegalWrites bool
  1535	
  1536		// AllowIllegalReads permits the Framer's ReadFrame method
  1537		// to return non-compliant frames or frame orders.
  1538		// This is for testing and permits using the Framer to test
  1539		// other HTTP/2 implementations' conformance to the spec.
  1540		// It is not compatible with ReadMetaHeaders.
  1541		AllowIllegalReads bool
  1542	
  1543		// ReadMetaHeaders if non-nil causes ReadFrame to merge
  1544		// HEADERS and CONTINUATION frames together and return
  1545		// MetaHeadersFrame instead.
  1546		ReadMetaHeaders *hpack.Decoder
  1547	
  1548		// MaxHeaderListSize is the http2 MAX_HEADER_LIST_SIZE.
  1549		// It's used only if ReadMetaHeaders is set; 0 means a sane default
  1550		// (currently 16MB)
  1551		// If the limit is hit, MetaHeadersFrame.Truncated is set true.
  1552		MaxHeaderListSize uint32
  1553	
  1554		// TODO: track which type of frame & with which flags was sent
  1555		// last. Then return an error (unless AllowIllegalWrites) if
  1556		// we're in the middle of a header block and a
  1557		// non-Continuation or Continuation on a different stream is
  1558		// attempted to be written.
  1559	
  1560		logReads, logWrites bool
  1561	
  1562		debugFramer       *http2Framer // only use for logging written writes
  1563		debugFramerBuf    *bytes.Buffer
  1564		debugReadLoggerf  func(string, ...interface{})
  1565		debugWriteLoggerf func(string, ...interface{})
  1566	
  1567		frameCache *http2frameCache // nil if frames aren't reused (default)
  1568	}
  1569	
  1570	func (fr *http2Framer) maxHeaderListSize() uint32 {
  1571		if fr.MaxHeaderListSize == 0 {
  1572			return 16 << 20 // sane default, per docs
  1573		}
  1574		return fr.MaxHeaderListSize
  1575	}
  1576	
  1577	func (f *http2Framer) startWrite(ftype http2FrameType, flags http2Flags, streamID uint32) {
  1578		// Write the FrameHeader.
  1579		f.wbuf = append(f.wbuf[:0],
  1580			0, // 3 bytes of length, filled in in endWrite
  1581			0,
  1582			0,
  1583			byte(ftype),
  1584			byte(flags),
  1585			byte(streamID>>24),
  1586			byte(streamID>>16),
  1587			byte(streamID>>8),
  1588			byte(streamID))
  1589	}
  1590	
  1591	func (f *http2Framer) endWrite() error {
  1592		// Now that we know the final size, fill in the FrameHeader in
  1593		// the space previously reserved for it. Abuse append.
  1594		length := len(f.wbuf) - http2frameHeaderLen
  1595		if length >= (1 << 24) {
  1596			return http2ErrFrameTooLarge
  1597		}
  1598		_ = append(f.wbuf[:0],
  1599			byte(length>>16),
  1600			byte(length>>8),
  1601			byte(length))
  1602		if f.logWrites {
  1603			f.logWrite()
  1604		}
  1605	
  1606		n, err := f.w.Write(f.wbuf)
  1607		if err == nil && n != len(f.wbuf) {
  1608			err = io.ErrShortWrite
  1609		}
  1610		return err
  1611	}
  1612	
  1613	func (f *http2Framer) logWrite() {
  1614		if f.debugFramer == nil {
  1615			f.debugFramerBuf = new(bytes.Buffer)
  1616			f.debugFramer = http2NewFramer(nil, f.debugFramerBuf)
  1617			f.debugFramer.logReads = false // we log it ourselves, saying "wrote" below
  1618			// Let us read anything, even if we accidentally wrote it
  1619			// in the wrong order:
  1620			f.debugFramer.AllowIllegalReads = true
  1621		}
  1622		f.debugFramerBuf.Write(f.wbuf)
  1623		fr, err := f.debugFramer.ReadFrame()
  1624		if err != nil {
  1625			f.debugWriteLoggerf("http2: Framer %p: failed to decode just-written frame", f)
  1626			return
  1627		}
  1628		f.debugWriteLoggerf("http2: Framer %p: wrote %v", f, http2summarizeFrame(fr))
  1629	}
  1630	
  1631	func (f *http2Framer) writeByte(v byte) { f.wbuf = append(f.wbuf, v) }
  1632	
  1633	func (f *http2Framer) writeBytes(v []byte) { f.wbuf = append(f.wbuf, v...) }
  1634	
  1635	func (f *http2Framer) writeUint16(v uint16) { f.wbuf = append(f.wbuf, byte(v>>8), byte(v)) }
  1636	
  1637	func (f *http2Framer) writeUint32(v uint32) {
  1638		f.wbuf = append(f.wbuf, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
  1639	}
  1640	
  1641	const (
  1642		http2minMaxFrameSize = 1 << 14
  1643		http2maxFrameSize    = 1<<24 - 1
  1644	)
  1645	
  1646	// SetReuseFrames allows the Framer to reuse Frames.
  1647	// If called on a Framer, Frames returned by calls to ReadFrame are only
  1648	// valid until the next call to ReadFrame.
  1649	func (fr *http2Framer) SetReuseFrames() {
  1650		if fr.frameCache != nil {
  1651			return
  1652		}
  1653		fr.frameCache = &http2frameCache{}
  1654	}
  1655	
  1656	type http2frameCache struct {
  1657		dataFrame http2DataFrame
  1658	}
  1659	
  1660	func (fc *http2frameCache) getDataFrame() *http2DataFrame {
  1661		if fc == nil {
  1662			return &http2DataFrame{}
  1663		}
  1664		return &fc.dataFrame
  1665	}
  1666	
  1667	// NewFramer returns a Framer that writes frames to w and reads them from r.
  1668	func http2NewFramer(w io.Writer, r io.Reader) *http2Framer {
  1669		fr := &http2Framer{
  1670			w:                 w,
  1671			r:                 r,
  1672			logReads:          http2logFrameReads,
  1673			logWrites:         http2logFrameWrites,
  1674			debugReadLoggerf:  log.Printf,
  1675			debugWriteLoggerf: log.Printf,
  1676		}
  1677		fr.getReadBuf = func(size uint32) []byte {
  1678			if cap(fr.readBuf) >= int(size) {
  1679				return fr.readBuf[:size]
  1680			}
  1681			fr.readBuf = make([]byte, size)
  1682			return fr.readBuf
  1683		}
  1684		fr.SetMaxReadFrameSize(http2maxFrameSize)
  1685		return fr
  1686	}
  1687	
  1688	// SetMaxReadFrameSize sets the maximum size of a frame
  1689	// that will be read by a subsequent call to ReadFrame.
  1690	// It is the caller's responsibility to advertise this
  1691	// limit with a SETTINGS frame.
  1692	func (fr *http2Framer) SetMaxReadFrameSize(v uint32) {
  1693		if v > http2maxFrameSize {
  1694			v = http2maxFrameSize
  1695		}
  1696		fr.maxReadSize = v
  1697	}
  1698	
  1699	// ErrorDetail returns a more detailed error of the last error
  1700	// returned by Framer.ReadFrame. For instance, if ReadFrame
  1701	// returns a StreamError with code PROTOCOL_ERROR, ErrorDetail
  1702	// will say exactly what was invalid. ErrorDetail is not guaranteed
  1703	// to return a non-nil value and like the rest of the http2 package,
  1704	// its return value is not protected by an API compatibility promise.
  1705	// ErrorDetail is reset after the next call to ReadFrame.
  1706	func (fr *http2Framer) ErrorDetail() error {
  1707		return fr.errDetail
  1708	}
  1709	
  1710	// ErrFrameTooLarge is returned from Framer.ReadFrame when the peer
  1711	// sends a frame that is larger than declared with SetMaxReadFrameSize.
  1712	var http2ErrFrameTooLarge = errors.New("http2: frame too large")
  1713	
  1714	// terminalReadFrameError reports whether err is an unrecoverable
  1715	// error from ReadFrame and no other frames should be read.
  1716	func http2terminalReadFrameError(err error) bool {
  1717		if _, ok := err.(http2StreamError); ok {
  1718			return false
  1719		}
  1720		return err != nil
  1721	}
  1722	
  1723	// ReadFrame reads a single frame. The returned Frame is only valid
  1724	// until the next call to ReadFrame.
  1725	//
  1726	// If the frame is larger than previously set with SetMaxReadFrameSize, the
  1727	// returned error is ErrFrameTooLarge. Other errors may be of type
  1728	// ConnectionError, StreamError, or anything else from the underlying
  1729	// reader.
  1730	func (fr *http2Framer) ReadFrame() (http2Frame, error) {
  1731		fr.errDetail = nil
  1732		if fr.lastFrame != nil {
  1733			fr.lastFrame.invalidate()
  1734		}
  1735		fh, err := http2readFrameHeader(fr.headerBuf[:], fr.r)
  1736		if err != nil {
  1737			return nil, err
  1738		}
  1739		if fh.Length > fr.maxReadSize {
  1740			return nil, http2ErrFrameTooLarge
  1741		}
  1742		payload := fr.getReadBuf(fh.Length)
  1743		if _, err := io.ReadFull(fr.r, payload); err != nil {
  1744			return nil, err
  1745		}
  1746		f, err := http2typeFrameParser(fh.Type)(fr.frameCache, fh, payload)
  1747		if err != nil {
  1748			if ce, ok := err.(http2connError); ok {
  1749				return nil, fr.connError(ce.Code, ce.Reason)
  1750			}
  1751			return nil, err
  1752		}
  1753		if err := fr.checkFrameOrder(f); err != nil {
  1754			return nil, err
  1755		}
  1756		if fr.logReads {
  1757			fr.debugReadLoggerf("http2: Framer %p: read %v", fr, http2summarizeFrame(f))
  1758		}
  1759		if fh.Type == http2FrameHeaders && fr.ReadMetaHeaders != nil {
  1760			return fr.readMetaFrame(f.(*http2HeadersFrame))
  1761		}
  1762		return f, nil
  1763	}
  1764	
  1765	// connError returns ConnectionError(code) but first
  1766	// stashes away a public reason to the caller can optionally relay it
  1767	// to the peer before hanging up on them. This might help others debug
  1768	// their implementations.
  1769	func (fr *http2Framer) connError(code http2ErrCode, reason string) error {
  1770		fr.errDetail = errors.New(reason)
  1771		return http2ConnectionError(code)
  1772	}
  1773	
  1774	// checkFrameOrder reports an error if f is an invalid frame to return
  1775	// next from ReadFrame. Mostly it checks whether HEADERS and
  1776	// CONTINUATION frames are contiguous.
  1777	func (fr *http2Framer) checkFrameOrder(f http2Frame) error {
  1778		last := fr.lastFrame
  1779		fr.lastFrame = f
  1780		if fr.AllowIllegalReads {
  1781			return nil
  1782		}
  1783	
  1784		fh := f.Header()
  1785		if fr.lastHeaderStream != 0 {
  1786			if fh.Type != http2FrameContinuation {
  1787				return fr.connError(http2ErrCodeProtocol,
  1788					fmt.Sprintf("got %s for stream %d; expected CONTINUATION following %s for stream %d",
  1789						fh.Type, fh.StreamID,
  1790						last.Header().Type, fr.lastHeaderStream))
  1791			}
  1792			if fh.StreamID != fr.lastHeaderStream {
  1793				return fr.connError(http2ErrCodeProtocol,
  1794					fmt.Sprintf("got CONTINUATION for stream %d; expected stream %d",
  1795						fh.StreamID, fr.lastHeaderStream))
  1796			}
  1797		} else if fh.Type == http2FrameContinuation {
  1798			return fr.connError(http2ErrCodeProtocol, fmt.Sprintf("unexpected CONTINUATION for stream %d", fh.StreamID))
  1799		}
  1800	
  1801		switch fh.Type {
  1802		case http2FrameHeaders, http2FrameContinuation:
  1803			if fh.Flags.Has(http2FlagHeadersEndHeaders) {
  1804				fr.lastHeaderStream = 0
  1805			} else {
  1806				fr.lastHeaderStream = fh.StreamID
  1807			}
  1808		}
  1809	
  1810		return nil
  1811	}
  1812	
  1813	// A DataFrame conveys arbitrary, variable-length sequences of octets
  1814	// associated with a stream.
  1815	// See http://http2.github.io/http2-spec/#rfc.section.6.1
  1816	type http2DataFrame struct {
  1817		http2FrameHeader
  1818		data []byte
  1819	}
  1820	
  1821	func (f *http2DataFrame) StreamEnded() bool {
  1822		return f.http2FrameHeader.Flags.Has(http2FlagDataEndStream)
  1823	}
  1824	
  1825	// Data returns the frame's data octets, not including any padding
  1826	// size byte or padding suffix bytes.
  1827	// The caller must not retain the returned memory past the next
  1828	// call to ReadFrame.
  1829	func (f *http2DataFrame) Data() []byte {
  1830		f.checkValid()
  1831		return f.data
  1832	}
  1833	
  1834	func http2parseDataFrame(fc *http2frameCache, fh http2FrameHeader, payload []byte) (http2Frame, error) {
  1835		if fh.StreamID == 0 {
  1836			// DATA frames MUST be associated with a stream. If a
  1837			// DATA frame is received whose stream identifier
  1838			// field is 0x0, the recipient MUST respond with a
  1839			// connection error (Section 5.4.1) of type
  1840			// PROTOCOL_ERROR.
  1841			return nil, http2connError{http2ErrCodeProtocol, "DATA frame with stream ID 0"}
  1842		}
  1843		f := fc.getDataFrame()
  1844		f.http2FrameHeader = fh
  1845	
  1846		var padSize byte
  1847		if fh.Flags.Has(http2FlagDataPadded) {
  1848			var err error
  1849			payload, padSize, err = http2readByte(payload)
  1850			if err != nil {
  1851				return nil, err
  1852			}
  1853		}
  1854		if int(padSize) > len(payload) {
  1855			// If the length of the padding is greater than the
  1856			// length of the frame payload, the recipient MUST
  1857			// treat this as a connection error.
  1858			// Filed: https://github.com/http2/http2-spec/issues/610
  1859			return nil, http2connError{http2ErrCodeProtocol, "pad size larger than data payload"}
  1860		}
  1861		f.data = payload[:len(payload)-int(padSize)]
  1862		return f, nil
  1863	}
  1864	
  1865	var (
  1866		http2errStreamID    = errors.New("invalid stream ID")
  1867		http2errDepStreamID = errors.New("invalid dependent stream ID")
  1868		http2errPadLength   = errors.New("pad length too large")
  1869		http2errPadBytes    = errors.New("padding bytes must all be zeros unless AllowIllegalWrites is enabled")
  1870	)
  1871	
  1872	func http2validStreamIDOrZero(streamID uint32) bool {
  1873		return streamID&(1<<31) == 0
  1874	}
  1875	
  1876	func http2validStreamID(streamID uint32) bool {
  1877		return streamID != 0 && streamID&(1<<31) == 0
  1878	}
  1879	
  1880	// WriteData writes a DATA frame.
  1881	//
  1882	// It will perform exactly one Write to the underlying Writer.
  1883	// It is the caller's responsibility not to violate the maximum frame size
  1884	// and to not call other Write methods concurrently.
  1885	func (f *http2Framer) WriteData(streamID uint32, endStream bool, data []byte) error {
  1886		return f.WriteDataPadded(streamID, endStream, data, nil)
  1887	}
  1888	
  1889	// WriteDataPadded writes a DATA frame with optional padding.
  1890	//
  1891	// If pad is nil, the padding bit is not sent.
  1892	// The length of pad must not exceed 255 bytes.
  1893	// The bytes of pad must all be zero, unless f.AllowIllegalWrites is set.
  1894	//
  1895	// It will perform exactly one Write to the underlying Writer.
  1896	// It is the caller's responsibility not to violate the maximum frame size
  1897	// and to not call other Write methods concurrently.
  1898	func (f *http2Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error {
  1899		if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
  1900			return http2errStreamID
  1901		}
  1902		if len(pad) > 0 {
  1903			if len(pad) > 255 {
  1904				return http2errPadLength
  1905			}
  1906			if !f.AllowIllegalWrites {
  1907				for _, b := range pad {
  1908					if b != 0 {
  1909						// "Padding octets MUST be set to zero when sending."
  1910						return http2errPadBytes
  1911					}
  1912				}
  1913			}
  1914		}
  1915		var flags http2Flags
  1916		if endStream {
  1917			flags |= http2FlagDataEndStream
  1918		}
  1919		if pad != nil {
  1920			flags |= http2FlagDataPadded
  1921		}
  1922		f.startWrite(http2FrameData, flags, streamID)
  1923		if pad != nil {
  1924			f.wbuf = append(f.wbuf, byte(len(pad)))
  1925		}
  1926		f.wbuf = append(f.wbuf, data...)
  1927		f.wbuf = append(f.wbuf, pad...)
  1928		return f.endWrite()
  1929	}
  1930	
  1931	// A SettingsFrame conveys configuration parameters that affect how
  1932	// endpoints communicate, such as preferences and constraints on peer
  1933	// behavior.
  1934	//
  1935	// See http://http2.github.io/http2-spec/#SETTINGS
  1936	type http2SettingsFrame struct {
  1937		http2FrameHeader
  1938		p []byte
  1939	}
  1940	
  1941	func http2parseSettingsFrame(_ *http2frameCache, fh http2FrameHeader, p []byte) (http2Frame, error) {
  1942		if fh.Flags.Has(http2FlagSettingsAck) && fh.Length > 0 {
  1943			// When this (ACK 0x1) bit is set, the payload of the
  1944			// SETTINGS frame MUST be empty. Receipt of a
  1945			// SETTINGS frame with the ACK flag set and a length
  1946			// field value other than 0 MUST be treated as a
  1947			// connection error (Section 5.4.1) of type
  1948			// FRAME_SIZE_ERROR.
  1949			return nil, http2ConnectionError(http2ErrCodeFrameSize)
  1950		}
  1951		if fh.StreamID != 0 {
  1952			// SETTINGS frames always apply to a connection,
  1953			// never a single stream. The stream identifier for a
  1954			// SETTINGS frame MUST be zero (0x0).  If an endpoint
  1955			// receives a SETTINGS frame whose stream identifier
  1956			// field is anything other than 0x0, the endpoint MUST
  1957			// respond with a connection error (Section 5.4.1) of
  1958			// type PROTOCOL_ERROR.
  1959			return nil, http2ConnectionError(http2ErrCodeProtocol)
  1960		}
  1961		if len(p)%6 != 0 {
  1962			// Expecting even number of 6 byte settings.
  1963			return nil, http2ConnectionError(http2ErrCodeFrameSize)
  1964		}
  1965		f := &http2SettingsFrame{http2FrameHeader: fh, p: p}
  1966		if v, ok := f.Value(http2SettingInitialWindowSize); ok && v > (1<<31)-1 {
  1967			// Values above the maximum flow control window size of 2^31 - 1 MUST
  1968			// be treated as a connection error (Section 5.4.1) of type
  1969			// FLOW_CONTROL_ERROR.
  1970			return nil, http2ConnectionError(http2ErrCodeFlowControl)
  1971		}
  1972		return f, nil
  1973	}
  1974	
  1975	func (f *http2SettingsFrame) IsAck() bool {
  1976		return f.http2FrameHeader.Flags.Has(http2FlagSettingsAck)
  1977	}
  1978	
  1979	func (f *http2SettingsFrame) Value(id http2SettingID) (v uint32, ok bool) {
  1980		f.checkValid()
  1981		for i := 0; i < f.NumSettings(); i++ {
  1982			if s := f.Setting(i); s.ID == id {
  1983				return s.Val, true
  1984			}
  1985		}
  1986		return 0, false
  1987	}
  1988	
  1989	// Setting returns the setting from the frame at the given 0-based index.
  1990	// The index must be >= 0 and less than f.NumSettings().
  1991	func (f *http2SettingsFrame) Setting(i int) http2Setting {
  1992		buf := f.p
  1993		return http2Setting{
  1994			ID:  http2SettingID(binary.BigEndian.Uint16(buf[i*6 : i*6+2])),
  1995			Val: binary.BigEndian.Uint32(buf[i*6+2 : i*6+6]),
  1996		}
  1997	}
  1998	
  1999	func (f *http2SettingsFrame) NumSettings() int { return len(f.p) / 6 }
  2000	
  2001	// HasDuplicates reports whether f contains any duplicate setting IDs.
  2002	func (f *http2SettingsFrame) HasDuplicates() bool {
  2003		num := f.NumSettings()
  2004		if num == 0 {
  2005			return false
  2006		}
  2007		// If it's small enough (the common case), just do the n^2
  2008		// thing and avoid a map allocation.
  2009		if num < 10 {
  2010			for i := 0; i < num; i++ {
  2011				idi := f.Setting(i).ID
  2012				for j := i + 1; j < num; j++ {
  2013					idj := f.Setting(j).ID
  2014					if idi == idj {
  2015						return true
  2016					}
  2017				}
  2018			}
  2019			return false
  2020		}
  2021		seen := map[http2SettingID]bool{}
  2022		for i := 0; i < num; i++ {
  2023			id := f.Setting(i).ID
  2024			if seen[id] {
  2025				return true
  2026			}
  2027			seen[id] = true
  2028		}
  2029		return false
  2030	}
  2031	
  2032	// ForeachSetting runs fn for each setting.
  2033	// It stops and returns the first error.
  2034	func (f *http2SettingsFrame) ForeachSetting(fn func(http2Setting) error) error {
  2035		f.checkValid()
  2036		for i := 0; i < f.NumSettings(); i++ {
  2037			if err := fn(f.Setting(i)); err != nil {
  2038				return err
  2039			}
  2040		}
  2041		return nil
  2042	}
  2043	
  2044	// WriteSettings writes a SETTINGS frame with zero or more settings
  2045	// specified and the ACK bit not set.
  2046	//
  2047	// It will perform exactly one Write to the underlying Writer.
  2048	// It is the caller's responsibility to not call other Write methods concurrently.
  2049	func (f *http2Framer) WriteSettings(settings ...http2Setting) error {
  2050		f.startWrite(http2FrameSettings, 0, 0)
  2051		for _, s := range settings {
  2052			f.writeUint16(uint16(s.ID))
  2053			f.writeUint32(s.Val)
  2054		}
  2055		return f.endWrite()
  2056	}
  2057	
  2058	// WriteSettingsAck writes an empty SETTINGS frame with the ACK bit set.
  2059	//
  2060	// It will perform exactly one Write to the underlying Writer.
  2061	// It is the caller's responsibility to not call other Write methods concurrently.
  2062	func (f *http2Framer) WriteSettingsAck() error {
  2063		f.startWrite(http2FrameSettings, http2FlagSettingsAck, 0)
  2064		return f.endWrite()
  2065	}
  2066	
  2067	// A PingFrame is a mechanism for measuring a minimal round trip time
  2068	// from the sender, as well as determining whether an idle connection
  2069	// is still functional.
  2070	// See http://http2.github.io/http2-spec/#rfc.section.6.7
  2071	type http2PingFrame struct {
  2072		http2FrameHeader
  2073		Data [8]byte
  2074	}
  2075	
  2076	func (f *http2PingFrame) IsAck() bool { return f.Flags.Has(http2FlagPingAck) }
  2077	
  2078	func http2parsePingFrame(_ *http2frameCache, fh http2FrameHeader, payload []byte) (http2Frame, error) {
  2079		if len(payload) != 8 {
  2080			return nil, http2ConnectionError(http2ErrCodeFrameSize)
  2081		}
  2082		if fh.StreamID != 0 {
  2083			return nil, http2ConnectionError(http2ErrCodeProtocol)
  2084		}
  2085		f := &http2PingFrame{http2FrameHeader: fh}
  2086		copy(f.Data[:], payload)
  2087		return f, nil
  2088	}
  2089	
  2090	func (f *http2Framer) WritePing(ack bool, data [8]byte) error {
  2091		var flags http2Flags
  2092		if ack {
  2093			flags = http2FlagPingAck
  2094		}
  2095		f.startWrite(http2FramePing, flags, 0)
  2096		f.writeBytes(data[:])
  2097		return f.endWrite()
  2098	}
  2099	
  2100	// A GoAwayFrame informs the remote peer to stop creating streams on this connection.
  2101	// See http://http2.github.io/http2-spec/#rfc.section.6.8
  2102	type http2GoAwayFrame struct {
  2103		http2FrameHeader
  2104		LastStreamID uint32
  2105		ErrCode      http2ErrCode
  2106		debugData    []byte
  2107	}
  2108	
  2109	// DebugData returns any debug data in the GOAWAY frame. Its contents
  2110	// are not defined.
  2111	// The caller must not retain the returned memory past the next
  2112	// call to ReadFrame.
  2113	func (f *http2GoAwayFrame) DebugData() []byte {
  2114		f.checkValid()
  2115		return f.debugData
  2116	}
  2117	
  2118	func http2parseGoAwayFrame(_ *http2frameCache, fh http2FrameHeader, p []byte) (http2Frame, error) {
  2119		if fh.StreamID != 0 {
  2120			return nil, http2ConnectionError(http2ErrCodeProtocol)
  2121		}
  2122		if len(p) < 8 {
  2123			return nil, http2ConnectionError(http2ErrCodeFrameSize)
  2124		}
  2125		return &http2GoAwayFrame{
  2126			http2FrameHeader: fh,
  2127			LastStreamID:     binary.BigEndian.Uint32(p[:4]) & (1<<31 - 1),
  2128			ErrCode:          http2ErrCode(binary.BigEndian.Uint32(p[4:8])),
  2129			debugData:        p[8:],
  2130		}, nil
  2131	}
  2132	
  2133	func (f *http2Framer) WriteGoAway(maxStreamID uint32, code http2ErrCode, debugData []byte) error {
  2134		f.startWrite(http2FrameGoAway, 0, 0)
  2135		f.writeUint32(maxStreamID & (1<<31 - 1))
  2136		f.writeUint32(uint32(code))
  2137		f.writeBytes(debugData)
  2138		return f.endWrite()
  2139	}
  2140	
  2141	// An UnknownFrame is the frame type returned when the frame type is unknown
  2142	// or no specific frame type parser exists.
  2143	type http2UnknownFrame struct {
  2144		http2FrameHeader
  2145		p []byte
  2146	}
  2147	
  2148	// Payload returns the frame's payload (after the header).  It is not
  2149	// valid to call this method after a subsequent call to
  2150	// Framer.ReadFrame, nor is it valid to retain the returned slice.
  2151	// The memory is owned by the Framer and is invalidated when the next
  2152	// frame is read.
  2153	func (f *http2UnknownFrame) Payload() []byte {
  2154		f.checkValid()
  2155		return f.p
  2156	}
  2157	
  2158	func http2parseUnknownFrame(_ *http2frameCache, fh http2FrameHeader, p []byte) (http2Frame, error) {
  2159		return &http2UnknownFrame{fh, p}, nil
  2160	}
  2161	
  2162	// A WindowUpdateFrame is used to implement flow control.
  2163	// See http://http2.github.io/http2-spec/#rfc.section.6.9
  2164	type http2WindowUpdateFrame struct {
  2165		http2FrameHeader
  2166		Increment uint32 // never read with high bit set
  2167	}
  2168	
  2169	func http2parseWindowUpdateFrame(_ *http2frameCache, fh http2FrameHeader, p []byte) (http2Frame, error) {
  2170		if len(p) != 4 {
  2171			return nil, http2ConnectionError(http2ErrCodeFrameSize)
  2172		}
  2173		inc := binary.BigEndian.Uint32(p[:4]) & 0x7fffffff // mask off high reserved bit
  2174		if inc == 0 {
  2175			// A receiver MUST treat the receipt of a
  2176			// WINDOW_UPDATE frame with an flow control window
  2177			// increment of 0 as a stream error (Section 5.4.2) of
  2178			// type PROTOCOL_ERROR; errors on the connection flow
  2179			// control window MUST be treated as a connection
  2180			// error (Section 5.4.1).
  2181			if fh.StreamID == 0 {
  2182				return nil, http2ConnectionError(http2ErrCodeProtocol)
  2183			}
  2184			return nil, http2streamError(fh.StreamID, http2ErrCodeProtocol)
  2185		}
  2186		return &http2WindowUpdateFrame{
  2187			http2FrameHeader: fh,
  2188			Increment:        inc,
  2189		}, nil
  2190	}
  2191	
  2192	// WriteWindowUpdate writes a WINDOW_UPDATE frame.
  2193	// The increment value must be between 1 and 2,147,483,647, inclusive.
  2194	// If the Stream ID is zero, the window update applies to the
  2195	// connection as a whole.
  2196	func (f *http2Framer) WriteWindowUpdate(streamID, incr uint32) error {
  2197		// "The legal range for the increment to the flow control window is 1 to 2^31-1 (2,147,483,647) octets."
  2198		if (incr < 1 || incr > 2147483647) && !f.AllowIllegalWrites {
  2199			return errors.New("illegal window increment value")
  2200		}
  2201		f.startWrite(http2FrameWindowUpdate, 0, streamID)
  2202		f.writeUint32(incr)
  2203		return f.endWrite()
  2204	}
  2205	
  2206	// A HeadersFrame is used to open a stream and additionally carries a
  2207	// header block fragment.
  2208	type http2HeadersFrame struct {
  2209		http2FrameHeader
  2210	
  2211		// Priority is set if FlagHeadersPriority is set in the FrameHeader.
  2212		Priority http2PriorityParam
  2213	
  2214		headerFragBuf []byte // not owned
  2215	}
  2216	
  2217	func (f *http2HeadersFrame) HeaderBlockFragment() []byte {
  2218		f.checkValid()
  2219		return f.headerFragBuf
  2220	}
  2221	
  2222	func (f *http2HeadersFrame) HeadersEnded() bool {
  2223		return f.http2FrameHeader.Flags.Has(http2FlagHeadersEndHeaders)
  2224	}
  2225	
  2226	func (f *http2HeadersFrame) StreamEnded() bool {
  2227		return f.http2FrameHeader.Flags.Has(http2FlagHeadersEndStream)
  2228	}
  2229	
  2230	func (f *http2HeadersFrame) HasPriority() bool {
  2231		return f.http2FrameHeader.Flags.Has(http2FlagHeadersPriority)
  2232	}
  2233	
  2234	func http2parseHeadersFrame(_ *http2frameCache, fh http2FrameHeader, p []byte) (_ http2Frame, err error) {
  2235		hf := &http2HeadersFrame{
  2236			http2FrameHeader: fh,
  2237		}
  2238		if fh.StreamID == 0 {
  2239			// HEADERS frames MUST be associated with a stream. If a HEADERS frame
  2240			// is received whose stream identifier field is 0x0, the recipient MUST
  2241			// respond with a connection error (Section 5.4.1) of type
  2242			// PROTOCOL_ERROR.
  2243			return nil, http2connError{http2ErrCodeProtocol, "HEADERS frame with stream ID 0"}
  2244		}
  2245		var padLength uint8
  2246		if fh.Flags.Has(http2FlagHeadersPadded) {
  2247			if p, padLength, err = http2readByte(p); err != nil {
  2248				return
  2249			}
  2250		}
  2251		if fh.Flags.Has(http2FlagHeadersPriority) {
  2252			var v uint32
  2253			p, v, err = http2readUint32(p)
  2254			if err != nil {
  2255				return nil, err
  2256			}
  2257			hf.Priority.StreamDep = v & 0x7fffffff
  2258			hf.Priority.Exclusive = (v != hf.Priority.StreamDep) // high bit was set
  2259			p, hf.Priority.Weight, err = http2readByte(p)
  2260			if err != nil {
  2261				return nil, err
  2262			}
  2263		}
  2264		if len(p)-int(padLength) <= 0 {
  2265			return nil, http2streamError(fh.StreamID, http2ErrCodeProtocol)
  2266		}
  2267		hf.headerFragBuf = p[:len(p)-int(padLength)]
  2268		return hf, nil
  2269	}
  2270	
  2271	// HeadersFrameParam are the parameters for writing a HEADERS frame.
  2272	type http2HeadersFrameParam struct {
  2273		// StreamID is the required Stream ID to initiate.
  2274		StreamID uint32
  2275		// BlockFragment is part (or all) of a Header Block.
  2276		BlockFragment []byte
  2277	
  2278		// EndStream indicates that the header block is the last that
  2279		// the endpoint will send for the identified stream. Setting
  2280		// this flag causes the stream to enter one of "half closed"
  2281		// states.
  2282		EndStream bool
  2283	
  2284		// EndHeaders indicates that this frame contains an entire
  2285		// header block and is not followed by any
  2286		// CONTINUATION frames.
  2287		EndHeaders bool
  2288	
  2289		// PadLength is the optional number of bytes of zeros to add
  2290		// to this frame.
  2291		PadLength uint8
  2292	
  2293		// Priority, if non-zero, includes stream priority information
  2294		// in the HEADER frame.
  2295		Priority http2PriorityParam
  2296	}
  2297	
  2298	// WriteHeaders writes a single HEADERS frame.
  2299	//
  2300	// This is a low-level header writing method. Encoding headers and
  2301	// splitting them into any necessary CONTINUATION frames is handled
  2302	// elsewhere.
  2303	//
  2304	// It will perform exactly one Write to the underlying Writer.
  2305	// It is the caller's responsibility to not call other Write methods concurrently.
  2306	func (f *http2Framer) WriteHeaders(p http2HeadersFrameParam) error {
  2307		if !http2validStreamID(p.StreamID) && !f.AllowIllegalWrites {
  2308			return http2errStreamID
  2309		}
  2310		var flags http2Flags
  2311		if p.PadLength != 0 {
  2312			flags |= http2FlagHeadersPadded
  2313		}
  2314		if p.EndStream {
  2315			flags |= http2FlagHeadersEndStream
  2316		}
  2317		if p.EndHeaders {
  2318			flags |= http2FlagHeadersEndHeaders
  2319		}
  2320		if !p.Priority.IsZero() {
  2321			flags |= http2FlagHeadersPriority
  2322		}
  2323		f.startWrite(http2FrameHeaders, flags, p.StreamID)
  2324		if p.PadLength != 0 {
  2325			f.writeByte(p.PadLength)
  2326		}
  2327		if !p.Priority.IsZero() {
  2328			v := p.Priority.StreamDep
  2329			if !http2validStreamIDOrZero(v) && !f.AllowIllegalWrites {
  2330				return http2errDepStreamID
  2331			}
  2332			if p.Priority.Exclusive {
  2333				v |= 1 << 31
  2334			}
  2335			f.writeUint32(v)
  2336			f.writeByte(p.Priority.Weight)
  2337		}
  2338		f.wbuf = append(f.wbuf, p.BlockFragment...)
  2339		f.wbuf = append(f.wbuf, http2padZeros[:p.PadLength]...)
  2340		return f.endWrite()
  2341	}
  2342	
  2343	// A PriorityFrame specifies the sender-advised priority of a stream.
  2344	// See http://http2.github.io/http2-spec/#rfc.section.6.3
  2345	type http2PriorityFrame struct {
  2346		http2FrameHeader
  2347		http2PriorityParam
  2348	}
  2349	
  2350	// PriorityParam are the stream prioritzation parameters.
  2351	type http2PriorityParam struct {
  2352		// StreamDep is a 31-bit stream identifier for the
  2353		// stream that this stream depends on. Zero means no
  2354		// dependency.
  2355		StreamDep uint32
  2356	
  2357		// Exclusive is whether the dependency is exclusive.
  2358		Exclusive bool
  2359	
  2360		// Weight is the stream's zero-indexed weight. It should be
  2361		// set together with StreamDep, or neither should be set. Per
  2362		// the spec, "Add one to the value to obtain a weight between
  2363		// 1 and 256."
  2364		Weight uint8
  2365	}
  2366	
  2367	func (p http2PriorityParam) IsZero() bool {
  2368		return p == http2PriorityParam{}
  2369	}
  2370	
  2371	func http2parsePriorityFrame(_ *http2frameCache, fh http2FrameHeader, payload []byte) (http2Frame, error) {
  2372		if fh.StreamID == 0 {
  2373			return nil, http2connError{http2ErrCodeProtocol, "PRIORITY frame with stream ID 0"}
  2374		}
  2375		if len(payload) != 5 {
  2376			return nil, http2connError{http2ErrCodeFrameSize, fmt.Sprintf("PRIORITY frame payload size was %d; want 5", len(payload))}
  2377		}
  2378		v := binary.BigEndian.Uint32(payload[:4])
  2379		streamID := v & 0x7fffffff // mask off high bit
  2380		return &http2PriorityFrame{
  2381			http2FrameHeader: fh,
  2382			http2PriorityParam: http2PriorityParam{
  2383				Weight:    payload[4],
  2384				StreamDep: streamID,
  2385				Exclusive: streamID != v, // was high bit set?
  2386			},
  2387		}, nil
  2388	}
  2389	
  2390	// WritePriority writes a PRIORITY frame.
  2391	//
  2392	// It will perform exactly one Write to the underlying Writer.
  2393	// It is the caller's responsibility to not call other Write methods concurrently.
  2394	func (f *http2Framer) WritePriority(streamID uint32, p http2PriorityParam) error {
  2395		if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
  2396			return http2errStreamID
  2397		}
  2398		if !http2validStreamIDOrZero(p.StreamDep) {
  2399			return http2errDepStreamID
  2400		}
  2401		f.startWrite(http2FramePriority, 0, streamID)
  2402		v := p.StreamDep
  2403		if p.Exclusive {
  2404			v |= 1 << 31
  2405		}
  2406		f.writeUint32(v)
  2407		f.writeByte(p.Weight)
  2408		return f.endWrite()
  2409	}
  2410	
  2411	// A RSTStreamFrame allows for abnormal termination of a stream.
  2412	// See http://http2.github.io/http2-spec/#rfc.section.6.4
  2413	type http2RSTStreamFrame struct {
  2414		http2FrameHeader
  2415		ErrCode http2ErrCode
  2416	}
  2417	
  2418	func http2parseRSTStreamFrame(_ *http2frameCache, fh http2FrameHeader, p []byte) (http2Frame, error) {
  2419		if len(p) != 4 {
  2420			return nil, http2ConnectionError(http2ErrCodeFrameSize)
  2421		}
  2422		if fh.StreamID == 0 {
  2423			return nil, http2ConnectionError(http2ErrCodeProtocol)
  2424		}
  2425		return &http2RSTStreamFrame{fh, http2ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil
  2426	}
  2427	
  2428	// WriteRSTStream writes a RST_STREAM frame.
  2429	//
  2430	// It will perform exactly one Write to the underlying Writer.
  2431	// It is the caller's responsibility to not call other Write methods concurrently.
  2432	func (f *http2Framer) WriteRSTStream(streamID uint32, code http2ErrCode) error {
  2433		if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
  2434			return http2errStreamID
  2435		}
  2436		f.startWrite(http2FrameRSTStream, 0, streamID)
  2437		f.writeUint32(uint32(code))
  2438		return f.endWrite()
  2439	}
  2440	
  2441	// A ContinuationFrame is used to continue a sequence of header block fragments.
  2442	// See http://http2.github.io/http2-spec/#rfc.section.6.10
  2443	type http2ContinuationFrame struct {
  2444		http2FrameHeader
  2445		headerFragBuf []byte
  2446	}
  2447	
  2448	func http2parseContinuationFrame(_ *http2frameCache, fh http2FrameHeader, p []byte) (http2Frame, error) {
  2449		if fh.StreamID == 0 {
  2450			return nil, http2connError{http2ErrCodeProtocol, "CONTINUATION frame with stream ID 0"}
  2451		}
  2452		return &http2ContinuationFrame{fh, p}, nil
  2453	}
  2454	
  2455	func (f *http2ContinuationFrame) HeaderBlockFragment() []byte {
  2456		f.checkValid()
  2457		return f.headerFragBuf
  2458	}
  2459	
  2460	func (f *http2ContinuationFrame) HeadersEnded() bool {
  2461		return f.http2FrameHeader.Flags.Has(http2FlagContinuationEndHeaders)
  2462	}
  2463	
  2464	// WriteContinuation writes a CONTINUATION frame.
  2465	//
  2466	// It will perform exactly one Write to the underlying Writer.
  2467	// It is the caller's responsibility to not call other Write methods concurrently.
  2468	func (f *http2Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlockFragment []byte) error {
  2469		if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
  2470			return http2errStreamID
  2471		}
  2472		var flags http2Flags
  2473		if endHeaders {
  2474			flags |= http2FlagContinuationEndHeaders
  2475		}
  2476		f.startWrite(http2FrameContinuation, flags, streamID)
  2477		f.wbuf = append(f.wbuf, headerBlockFragment...)
  2478		return f.endWrite()
  2479	}
  2480	
  2481	// A PushPromiseFrame is used to initiate a server stream.
  2482	// See http://http2.github.io/http2-spec/#rfc.section.6.6
  2483	type http2PushPromiseFrame struct {
  2484		http2FrameHeader
  2485		PromiseID     uint32
  2486		headerFragBuf []byte // not owned
  2487	}
  2488	
  2489	func (f *http2PushPromiseFrame) HeaderBlockFragment() []byte {
  2490		f.checkValid()
  2491		return f.headerFragBuf
  2492	}
  2493	
  2494	func (f *http2PushPromiseFrame) HeadersEnded() bool {
  2495		return f.http2FrameHeader.Flags.Has(http2FlagPushPromiseEndHeaders)
  2496	}
  2497	
  2498	func http2parsePushPromise(_ *http2frameCache, fh http2FrameHeader, p []byte) (_ http2Frame, err error) {
  2499		pp := &http2PushPromiseFrame{
  2500			http2FrameHeader: fh,
  2501		}
  2502		if pp.StreamID == 0 {
  2503			// PUSH_PROMISE frames MUST be associated with an existing,
  2504			// peer-initiated stream. The stream identifier of a
  2505			// PUSH_PROMISE frame indicates the stream it is associated
  2506			// with. If the stream identifier field specifies the value
  2507			// 0x0, a recipient MUST respond with a connection error
  2508			// (Section 5.4.1) of type PROTOCOL_ERROR.
  2509			return nil, http2ConnectionError(http2ErrCodeProtocol)
  2510		}
  2511		// The PUSH_PROMISE frame includes optional padding.
  2512		// Padding fields and flags are identical to those defined for DATA frames
  2513		var padLength uint8
  2514		if fh.Flags.Has(http2FlagPushPromisePadded) {
  2515			if p, padLength, err = http2readByte(p); err != nil {
  2516				return
  2517			}
  2518		}
  2519	
  2520		p, pp.PromiseID, err = http2readUint32(p)
  2521		if err != nil {
  2522			return
  2523		}
  2524		pp.PromiseID = pp.PromiseID & (1<<31 - 1)
  2525	
  2526		if int(padLength) > len(p) {
  2527			// like the DATA frame, error out if padding is longer than the body.
  2528			return nil, http2ConnectionError(http2ErrCodeProtocol)
  2529		}
  2530		pp.headerFragBuf = p[:len(p)-int(padLength)]
  2531		return pp, nil
  2532	}
  2533	
  2534	// PushPromiseParam are the parameters for writing a PUSH_PROMISE frame.
  2535	type http2PushPromiseParam struct {
  2536		// StreamID is the required Stream ID to initiate.
  2537		StreamID uint32
  2538	
  2539		// PromiseID is the required Stream ID which this
  2540		// Push Promises
  2541		PromiseID uint32
  2542	
  2543		// BlockFragment is part (or all) of a Header Block.
  2544		BlockFragment []byte
  2545	
  2546		// EndHeaders indicates that this frame contains an entire
  2547		// header block and is not followed by any
  2548		// CONTINUATION frames.
  2549		EndHeaders bool
  2550	
  2551		// PadLength is the optional number of bytes of zeros to add
  2552		// to this frame.
  2553		PadLength uint8
  2554	}
  2555	
  2556	// WritePushPromise writes a single PushPromise Frame.
  2557	//
  2558	// As with Header Frames, This is the low level call for writing
  2559	// individual frames. Continuation frames are handled elsewhere.
  2560	//
  2561	// It will perform exactly one Write to the underlying Writer.
  2562	// It is the caller's responsibility to not call other Write methods concurrently.
  2563	func (f *http2Framer) WritePushPromise(p http2PushPromiseParam) error {
  2564		if !http2validStreamID(p.StreamID) && !f.AllowIllegalWrites {
  2565			return http2errStreamID
  2566		}
  2567		var flags http2Flags
  2568		if p.PadLength != 0 {
  2569			flags |= http2FlagPushPromisePadded
  2570		}
  2571		if p.EndHeaders {
  2572			flags |= http2FlagPushPromiseEndHeaders
  2573		}
  2574		f.startWrite(http2FramePushPromise, flags, p.StreamID)
  2575		if p.PadLength != 0 {
  2576			f.writeByte(p.PadLength)
  2577		}
  2578		if !http2validStreamID(p.PromiseID) && !f.AllowIllegalWrites {
  2579			return http2errStreamID
  2580		}
  2581		f.writeUint32(p.PromiseID)
  2582		f.wbuf = append(f.wbuf, p.BlockFragment...)
  2583		f.wbuf = append(f.wbuf, http2padZeros[:p.PadLength]...)
  2584		return f.endWrite()
  2585	}
  2586	
  2587	// WriteRawFrame writes a raw frame. This can be used to write
  2588	// extension frames unknown to this package.
  2589	func (f *http2Framer) WriteRawFrame(t http2FrameType, flags http2Flags, streamID uint32, payload []byte) error {
  2590		f.startWrite(t, flags, streamID)
  2591		f.writeBytes(payload)
  2592		return f.endWrite()
  2593	}
  2594	
  2595	func http2readByte(p []byte) (remain []byte, b byte, err error) {
  2596		if len(p) == 0 {
  2597			return nil, 0, io.ErrUnexpectedEOF
  2598		}
  2599		return p[1:], p[0], nil
  2600	}
  2601	
  2602	func http2readUint32(p []byte) (remain []byte, v uint32, err error) {
  2603		if len(p) < 4 {
  2604			return nil, 0, io.ErrUnexpectedEOF
  2605		}
  2606		return p[4:], binary.BigEndian.Uint32(p[:4]), nil
  2607	}
  2608	
  2609	type http2streamEnder interface {
  2610		StreamEnded() bool
  2611	}
  2612	
  2613	type http2headersEnder interface {
  2614		HeadersEnded() bool
  2615	}
  2616	
  2617	type http2headersOrContinuation interface {
  2618		http2headersEnder
  2619		HeaderBlockFragment() []byte
  2620	}
  2621	
  2622	// A MetaHeadersFrame is the representation of one HEADERS frame and
  2623	// zero or more contiguous CONTINUATION frames and the decoding of
  2624	// their HPACK-encoded contents.
  2625	//
  2626	// This type of frame does not appear on the wire and is only returned
  2627	// by the Framer when Framer.ReadMetaHeaders is set.
  2628	type http2MetaHeadersFrame struct {
  2629		*http2HeadersFrame
  2630	
  2631		// Fields are the fields contained in the HEADERS and
  2632		// CONTINUATION frames. The underlying slice is owned by the
  2633		// Framer and must not be retained after the next call to
  2634		// ReadFrame.
  2635		//
  2636		// Fields are guaranteed to be in the correct http2 order and
  2637		// not have unknown pseudo header fields or invalid header
  2638		// field names or values. Required pseudo header fields may be
  2639		// missing, however. Use the MetaHeadersFrame.Pseudo accessor
  2640		// method access pseudo headers.
  2641		Fields []hpack.HeaderField
  2642	
  2643		// Truncated is whether the max header list size limit was hit
  2644		// and Fields is incomplete. The hpack decoder state is still
  2645		// valid, however.
  2646		Truncated bool
  2647	}
  2648	
  2649	// PseudoValue returns the given pseudo header field's value.
  2650	// The provided pseudo field should not contain the leading colon.
  2651	func (mh *http2MetaHeadersFrame) PseudoValue(pseudo string) string {
  2652		for _, hf := range mh.Fields {
  2653			if !hf.IsPseudo() {
  2654				return ""
  2655			}
  2656			if hf.Name[1:] == pseudo {
  2657				return hf.Value
  2658			}
  2659		}
  2660		return ""
  2661	}
  2662	
  2663	// RegularFields returns the regular (non-pseudo) header fields of mh.
  2664	// The caller does not own the returned slice.
  2665	func (mh *http2MetaHeadersFrame) RegularFields() []hpack.HeaderField {
  2666		for i, hf := range mh.Fields {
  2667			if !hf.IsPseudo() {
  2668				return mh.Fields[i:]
  2669			}
  2670		}
  2671		return nil
  2672	}
  2673	
  2674	// PseudoFields returns the pseudo header fields of mh.
  2675	// The caller does not own the returned slice.
  2676	func (mh *http2MetaHeadersFrame) PseudoFields() []hpack.HeaderField {
  2677		for i, hf := range mh.Fields {
  2678			if !hf.IsPseudo() {
  2679				return mh.Fields[:i]
  2680			}
  2681		}
  2682		return mh.Fields
  2683	}
  2684	
  2685	func (mh *http2MetaHeadersFrame) checkPseudos() error {
  2686		var isRequest, isResponse bool
  2687		pf := mh.PseudoFields()
  2688		for i, hf := range pf {
  2689			switch hf.Name {
  2690			case ":method", ":path", ":scheme", ":authority":
  2691				isRequest = true
  2692			case ":status":
  2693				isResponse = true
  2694			default:
  2695				return http2pseudoHeaderError(hf.Name)
  2696			}
  2697			// Check for duplicates.
  2698			// This would be a bad algorithm, but N is 4.
  2699			// And this doesn't allocate.
  2700			for _, hf2 := range pf[:i] {
  2701				if hf.Name == hf2.Name {
  2702					return http2duplicatePseudoHeaderError(hf.Name)
  2703				}
  2704			}
  2705		}
  2706		if isRequest && isResponse {
  2707			return http2errMixPseudoHeaderTypes
  2708		}
  2709		return nil
  2710	}
  2711	
  2712	func (fr *http2Framer) maxHeaderStringLen() int {
  2713		v := fr.maxHeaderListSize()
  2714		if uint32(int(v)) == v {
  2715			return int(v)
  2716		}
  2717		// They had a crazy big number for MaxHeaderBytes anyway,
  2718		// so give them unlimited header lengths:
  2719		return 0
  2720	}
  2721	
  2722	// readMetaFrame returns 0 or more CONTINUATION frames from fr and
  2723	// merge them into the provided hf and returns a MetaHeadersFrame
  2724	// with the decoded hpack values.
  2725	func (fr *http2Framer) readMetaFrame(hf *http2HeadersFrame) (*http2MetaHeadersFrame, error) {
  2726		if fr.AllowIllegalReads {
  2727			return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders")
  2728		}
  2729		mh := &http2MetaHeadersFrame{
  2730			http2HeadersFrame: hf,
  2731		}
  2732		var remainSize = fr.maxHeaderListSize()
  2733		var sawRegular bool
  2734	
  2735		var invalid error // pseudo header field errors
  2736		hdec := fr.ReadMetaHeaders
  2737		hdec.SetEmitEnabled(true)
  2738		hdec.SetMaxStringLength(fr.maxHeaderStringLen())
  2739		hdec.SetEmitFunc(func(hf hpack.HeaderField) {
  2740			if http2VerboseLogs && fr.logReads {
  2741				fr.debugReadLoggerf("http2: decoded hpack field %+v", hf)
  2742			}
  2743			if !httpguts.ValidHeaderFieldValue(hf.Value) {
  2744				invalid = http2headerFieldValueError(hf.Value)
  2745			}
  2746			isPseudo := strings.HasPrefix(hf.Name, ":")
  2747			if isPseudo {
  2748				if sawRegular {
  2749					invalid = http2errPseudoAfterRegular
  2750				}
  2751			} else {
  2752				sawRegular = true
  2753				if !http2validWireHeaderFieldName(hf.Name) {
  2754					invalid = http2headerFieldNameError(hf.Name)
  2755				}
  2756			}
  2757	
  2758			if invalid != nil {
  2759				hdec.SetEmitEnabled(false)
  2760				return
  2761			}
  2762	
  2763			size := hf.Size()
  2764			if size > remainSize {
  2765				hdec.SetEmitEnabled(false)
  2766				mh.Truncated = true
  2767				return
  2768			}
  2769			remainSize -= size
  2770	
  2771			mh.Fields = append(mh.Fields, hf)
  2772		})
  2773		// Lose reference to MetaHeadersFrame:
  2774		defer hdec.SetEmitFunc(func(hf hpack.HeaderField) {})
  2775	
  2776		var hc http2headersOrContinuation = hf
  2777		for {
  2778			frag := hc.HeaderBlockFragment()
  2779			if _, err := hdec.Write(frag); err != nil {
  2780				return nil, http2ConnectionError(http2ErrCodeCompression)
  2781			}
  2782	
  2783			if hc.HeadersEnded() {
  2784				break
  2785			}
  2786			if f, err := fr.ReadFrame(); err != nil {
  2787				return nil, err
  2788			} else {
  2789				hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
  2790			}
  2791		}
  2792	
  2793		mh.http2HeadersFrame.headerFragBuf = nil
  2794		mh.http2HeadersFrame.invalidate()
  2795	
  2796		if err := hdec.Close(); err != nil {
  2797			return nil, http2ConnectionError(http2ErrCodeCompression)
  2798		}
  2799		if invalid != nil {
  2800			fr.errDetail = invalid
  2801			if http2VerboseLogs {
  2802				log.Printf("http2: invalid header: %v", invalid)
  2803			}
  2804			return nil, http2StreamError{mh.StreamID, http2ErrCodeProtocol, invalid}
  2805		}
  2806		if err := mh.checkPseudos(); err != nil {
  2807			fr.errDetail = err
  2808			if http2VerboseLogs {
  2809				log.Printf("http2: invalid pseudo headers: %v", err)
  2810			}
  2811			return nil, http2StreamError{mh.StreamID, http2ErrCodeProtocol, err}
  2812		}
  2813		return mh, nil
  2814	}
  2815	
  2816	func http2summarizeFrame(f http2Frame) string {
  2817		var buf bytes.Buffer
  2818		f.Header().writeDebug(&buf)
  2819		switch f := f.(type) {
  2820		case *http2SettingsFrame:
  2821			n := 0
  2822			f.ForeachSetting(func(s http2Setting) error {
  2823				n++
  2824				if n == 1 {
  2825					buf.WriteString(", settings:")
  2826				}
  2827				fmt.Fprintf(&buf, " %v=%v,", s.ID, s.Val)
  2828				return nil
  2829			})
  2830			if n > 0 {
  2831				buf.Truncate(buf.Len() - 1) // remove trailing comma
  2832			}
  2833		case *http2DataFrame:
  2834			data := f.Data()
  2835			const max = 256
  2836			if len(data) > max {
  2837				data = data[:max]
  2838			}
  2839			fmt.Fprintf(&buf, " data=%q", data)
  2840			if len(f.Data()) > max {
  2841				fmt.Fprintf(&buf, " (%d bytes omitted)", len(f.Data())-max)
  2842			}
  2843		case *http2WindowUpdateFrame:
  2844			if f.StreamID == 0 {
  2845				buf.WriteString(" (conn)")
  2846			}
  2847			fmt.Fprintf(&buf, " incr=%v", f.Increment)
  2848		case *http2PingFrame:
  2849			fmt.Fprintf(&buf, " ping=%q", f.Data[:])
  2850		case *http2GoAwayFrame:
  2851			fmt.Fprintf(&buf, " LastStreamID=%v ErrCode=%v Debug=%q",
  2852				f.LastStreamID, f.ErrCode, f.debugData)
  2853		case *http2RSTStreamFrame:
  2854			fmt.Fprintf(&buf, " ErrCode=%v", f.ErrCode)
  2855		}
  2856		return buf.String()
  2857	}
  2858	
  2859	func http2traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool {
  2860		return trace != nil && trace.WroteHeaderField != nil
  2861	}
  2862	
  2863	func http2traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) {
  2864		if trace != nil && trace.WroteHeaderField != nil {
  2865			trace.WroteHeaderField(k, []string{v})
  2866		}
  2867	}
  2868	
  2869	func http2traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error {
  2870		if trace != nil {
  2871			return trace.Got1xxResponse
  2872		}
  2873		return nil
  2874	}
  2875	
  2876	var http2DebugGoroutines = os.Getenv("DEBUG_HTTP2_GOROUTINES") == "1"
  2877	
  2878	type http2goroutineLock uint64
  2879	
  2880	func http2newGoroutineLock() http2goroutineLock {
  2881		if !http2DebugGoroutines {
  2882			return 0
  2883		}
  2884		return http2goroutineLock(http2curGoroutineID())
  2885	}
  2886	
  2887	func (g http2goroutineLock) check() {
  2888		if !http2DebugGoroutines {
  2889			return
  2890		}
  2891		if http2curGoroutineID() != uint64(g) {
  2892			panic("running on the wrong goroutine")
  2893		}
  2894	}
  2895	
  2896	func (g http2goroutineLock) checkNotOn() {
  2897		if !http2DebugGoroutines {
  2898			return
  2899		}
  2900		if http2curGoroutineID() == uint64(g) {
  2901			panic("running on the wrong goroutine")
  2902		}
  2903	}
  2904	
  2905	var http2goroutineSpace = []byte("goroutine ")
  2906	
  2907	func http2curGoroutineID() uint64 {
  2908		bp := http2littleBuf.Get().(*[]byte)
  2909		defer http2littleBuf.Put(bp)
  2910		b := *bp
  2911		b = b[:runtime.Stack(b, false)]
  2912		// Parse the 4707 out of "goroutine 4707 ["
  2913		b = bytes.TrimPrefix(b, http2goroutineSpace)
  2914		i := bytes.IndexByte(b, ' ')
  2915		if i < 0 {
  2916			panic(fmt.Sprintf("No space found in %q", b))
  2917		}
  2918		b = b[:i]
  2919		n, err := http2parseUintBytes(b, 10, 64)
  2920		if err != nil {
  2921			panic(fmt.Sprintf("Failed to parse goroutine ID out of %q: %v", b, err))
  2922		}
  2923		return n
  2924	}
  2925	
  2926	var http2littleBuf = sync.Pool{
  2927		New: func() interface{} {
  2928			buf := make([]byte, 64)
  2929			return &buf
  2930		},
  2931	}
  2932	
  2933	// parseUintBytes is like strconv.ParseUint, but using a []byte.
  2934	func http2parseUintBytes(s []byte, base int, bitSize int) (n uint64, err error) {
  2935		var cutoff, maxVal uint64
  2936	
  2937		if bitSize == 0 {
  2938			bitSize = int(strconv.IntSize)
  2939		}
  2940	
  2941		s0 := s
  2942		switch {
  2943		case len(s) < 1:
  2944			err = strconv.ErrSyntax
  2945			goto Error
  2946	
  2947		case 2 <= base && base <= 36:
  2948			// valid base; nothing to do
  2949	
  2950		case base == 0:
  2951			// Look for octal, hex prefix.
  2952			switch {
  2953			case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'):
  2954				base = 16
  2955				s = s[2:]
  2956				if len(s) < 1 {
  2957					err = strconv.ErrSyntax
  2958					goto Error
  2959				}
  2960			case s[0] == '0':
  2961				base = 8
  2962			default:
  2963				base = 10
  2964			}
  2965	
  2966		default:
  2967			err = errors.New("invalid base " + strconv.Itoa(base))
  2968			goto Error
  2969		}
  2970	
  2971		n = 0
  2972		cutoff = http2cutoff64(base)
  2973		maxVal = 1<<uint(bitSize) - 1
  2974	
  2975		for i := 0; i < len(s); i++ {
  2976			var v byte
  2977			d := s[i]
  2978			switch {
  2979			case '0' <= d && d <= '9':
  2980				v = d - '0'
  2981			case 'a' <= d && d <= 'z':
  2982				v = d - 'a' + 10
  2983			case 'A' <= d && d <= 'Z':
  2984				v = d - 'A' + 10
  2985			default:
  2986				n = 0
  2987				err = strconv.ErrSyntax
  2988				goto Error
  2989			}
  2990			if int(v) >= base {
  2991				n = 0
  2992				err = strconv.ErrSyntax
  2993				goto Error
  2994			}
  2995	
  2996			if n >= cutoff {
  2997				// n*base overflows
  2998				n = 1<<64 - 1
  2999				err = strconv.ErrRange
  3000				goto Error
  3001			}
  3002			n *= uint64(base)
  3003	
  3004			n1 := n + uint64(v)
  3005			if n1 < n || n1 > maxVal {
  3006				// n+v overflows
  3007				n = 1<<64 - 1
  3008				err = strconv.ErrRange
  3009				goto Error
  3010			}
  3011			n = n1
  3012		}
  3013	
  3014		return n, nil
  3015	
  3016	Error:
  3017		return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
  3018	}
  3019	
  3020	// Return the first number n such that n*base >= 1<<64.
  3021	func http2cutoff64(base int) uint64 {
  3022		if base < 2 {
  3023			return 0
  3024		}
  3025		return (1<<64-1)/uint64(base) + 1
  3026	}
  3027	
  3028	var (
  3029		http2commonBuildOnce   sync.Once
  3030		http2commonLowerHeader map[string]string // Go-Canonical-Case -> lower-case
  3031		http2commonCanonHeader map[string]string // lower-case -> Go-Canonical-Case
  3032	)
  3033	
  3034	func http2buildCommonHeaderMapsOnce() {
  3035		http2commonBuildOnce.Do(http2buildCommonHeaderMaps)
  3036	}
  3037	
  3038	func http2buildCommonHeaderMaps() {
  3039		common := []string{
  3040			"accept",
  3041			"accept-charset",
  3042			"accept-encoding",
  3043			"accept-language",
  3044			"accept-ranges",
  3045			"age",
  3046			"access-control-allow-origin",
  3047			"allow",
  3048			"authorization",
  3049			"cache-control",
  3050			"content-disposition",
  3051			"content-encoding",
  3052			"content-language",
  3053			"content-length",
  3054			"content-location",
  3055			"content-range",
  3056			"content-type",
  3057			"cookie",
  3058			"date",
  3059			"etag",
  3060			"expect",
  3061			"expires",
  3062			"from",
  3063			"host",
  3064			"if-match",
  3065			"if-modified-since",
  3066			"if-none-match",
  3067			"if-unmodified-since",
  3068			"last-modified",
  3069			"link",
  3070			"location",
  3071			"max-forwards",
  3072			"proxy-authenticate",
  3073			"proxy-authorization",
  3074			"range",
  3075			"referer",
  3076			"refresh",
  3077			"retry-after",
  3078			"server",
  3079			"set-cookie",
  3080			"strict-transport-security",
  3081			"trailer",
  3082			"transfer-encoding",
  3083			"user-agent",
  3084			"vary",
  3085			"via",
  3086			"www-authenticate",
  3087		}
  3088		http2commonLowerHeader = make(map[string]string, len(common))
  3089		http2commonCanonHeader = make(map[string]string, len(common))
  3090		for _, v := range common {
  3091			chk := CanonicalHeaderKey(v)
  3092			http2commonLowerHeader[chk] = v
  3093			http2commonCanonHeader[v] = chk
  3094		}
  3095	}
  3096	
  3097	func http2lowerHeader(v string) string {
  3098		http2buildCommonHeaderMapsOnce()
  3099		if s, ok := http2commonLowerHeader[v]; ok {
  3100			return s
  3101		}
  3102		return strings.ToLower(v)
  3103	}
  3104	
  3105	var (
  3106		http2VerboseLogs    bool
  3107		http2logFrameWrites bool
  3108		http2logFrameReads  bool
  3109		http2inTests        bool
  3110	)
  3111	
  3112	func init() {
  3113		e := os.Getenv("GODEBUG")
  3114		if strings.Contains(e, "http2debug=1") {
  3115			http2VerboseLogs = true
  3116		}
  3117		if strings.Contains(e, "http2debug=2") {
  3118			http2VerboseLogs = true
  3119			http2logFrameWrites = true
  3120			http2logFrameReads = true
  3121		}
  3122	}
  3123	
  3124	const (
  3125		// ClientPreface is the string that must be sent by new
  3126		// connections from clients.
  3127		http2ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
  3128	
  3129		// SETTINGS_MAX_FRAME_SIZE default
  3130		// http://http2.github.io/http2-spec/#rfc.section.6.5.2
  3131		http2initialMaxFrameSize = 16384
  3132	
  3133		// NextProtoTLS is the NPN/ALPN protocol negotiated during
  3134		// HTTP/2's TLS setup.
  3135		http2NextProtoTLS = "h2"
  3136	
  3137		// http://http2.github.io/http2-spec/#SettingValues
  3138		http2initialHeaderTableSize = 4096
  3139	
  3140		http2initialWindowSize = 65535 // 6.9.2 Initial Flow Control Window Size
  3141	
  3142		http2defaultMaxReadFrameSize = 1 << 20
  3143	)
  3144	
  3145	var (
  3146		http2clientPreface = []byte(http2ClientPreface)
  3147	)
  3148	
  3149	type http2streamState int
  3150	
  3151	// HTTP/2 stream states.
  3152	//
  3153	// See http://tools.ietf.org/html/rfc7540#section-5.1.
  3154	//
  3155	// For simplicity, the server code merges "reserved (local)" into
  3156	// "half-closed (remote)". This is one less state transition to track.
  3157	// The only downside is that we send PUSH_PROMISEs slightly less
  3158	// liberally than allowable. More discussion here:
  3159	// https://lists.w3.org/Archives/Public/ietf-http-wg/2016JulSep/0599.html
  3160	//
  3161	// "reserved (remote)" is omitted since the client code does not
  3162	// support server push.
  3163	const (
  3164		http2stateIdle http2streamState = iota
  3165		http2stateOpen
  3166		http2stateHalfClosedLocal
  3167		http2stateHalfClosedRemote
  3168		http2stateClosed
  3169	)
  3170	
  3171	var http2stateName = [...]string{
  3172		http2stateIdle:             "Idle",
  3173		http2stateOpen:             "Open",
  3174		http2stateHalfClosedLocal:  "HalfClosedLocal",
  3175		http2stateHalfClosedRemote: "HalfClosedRemote",
  3176		http2stateClosed:           "Closed",
  3177	}
  3178	
  3179	func (st http2streamState) String() string {
  3180		return http2stateName[st]
  3181	}
  3182	
  3183	// Setting is a setting parameter: which setting it is, and its value.
  3184	type http2Setting struct {
  3185		// ID is which setting is being set.
  3186		// See http://http2.github.io/http2-spec/#SettingValues
  3187		ID http2SettingID
  3188	
  3189		// Val is the value.
  3190		Val uint32
  3191	}
  3192	
  3193	func (s http2Setting) String() string {
  3194		return fmt.Sprintf("[%v = %d]", s.ID, s.Val)
  3195	}
  3196	
  3197	// Valid reports whether the setting is valid.
  3198	func (s http2Setting) Valid() error {
  3199		// Limits and error codes from 6.5.2 Defined SETTINGS Parameters
  3200		switch s.ID {
  3201		case http2SettingEnablePush:
  3202			if s.Val != 1 && s.Val != 0 {
  3203				return http2ConnectionError(http2ErrCodeProtocol)
  3204			}
  3205		case http2SettingInitialWindowSize:
  3206			if s.Val > 1<<31-1 {
  3207				return http2ConnectionError(http2ErrCodeFlowControl)
  3208			}
  3209		case http2SettingMaxFrameSize:
  3210			if s.Val < 16384 || s.Val > 1<<24-1 {
  3211				return http2ConnectionError(http2ErrCodeProtocol)
  3212			}
  3213		}
  3214		return nil
  3215	}
  3216	
  3217	// A SettingID is an HTTP/2 setting as defined in
  3218	// http://http2.github.io/http2-spec/#iana-settings
  3219	type http2SettingID uint16
  3220	
  3221	const (
  3222		http2SettingHeaderTableSize      http2SettingID = 0x1
  3223		http2SettingEnablePush           http2SettingID = 0x2
  3224		http2SettingMaxConcurrentStreams http2SettingID = 0x3
  3225		http2SettingInitialWindowSize    http2SettingID = 0x4
  3226		http2SettingMaxFrameSize         http2SettingID = 0x5
  3227		http2SettingMaxHeaderListSize    http2SettingID = 0x6
  3228	)
  3229	
  3230	var http2settingName = map[http2SettingID]string{
  3231		http2SettingHeaderTableSize:      "HEADER_TABLE_SIZE",
  3232		http2SettingEnablePush:           "ENABLE_PUSH",
  3233		http2SettingMaxConcurrentStreams: "MAX_CONCURRENT_STREAMS",
  3234		http2SettingInitialWindowSize:    "INITIAL_WINDOW_SIZE",
  3235		http2SettingMaxFrameSize:         "MAX_FRAME_SIZE",
  3236		http2SettingMaxHeaderListSize:    "MAX_HEADER_LIST_SIZE",
  3237	}
  3238	
  3239	func (s http2SettingID) String() string {
  3240		if v, ok := http2settingName[s]; ok {
  3241			return v
  3242		}
  3243		return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s))
  3244	}
  3245	
  3246	var (
  3247		http2errInvalidHeaderFieldName  = errors.New("http2: invalid header field name")
  3248		http2errInvalidHeaderFieldValue = errors.New("http2: invalid header field value")
  3249	)
  3250	
  3251	// validWireHeaderFieldName reports whether v is a valid header field
  3252	// name (key). See httpguts.ValidHeaderName for the base rules.
  3253	//
  3254	// Further, http2 says:
  3255	//   "Just as in HTTP/1.x, header field names are strings of ASCII
  3256	//   characters that are compared in a case-insensitive
  3257	//   fashion. However, header field names MUST be converted to
  3258	//   lowercase prior to their encoding in HTTP/2. "
  3259	func http2validWireHeaderFieldName(v string) bool {
  3260		if len(v) == 0 {
  3261			return false
  3262		}
  3263		for _, r := range v {
  3264			if !httpguts.IsTokenRune(r) {
  3265				return false
  3266			}
  3267			if 'A' <= r && r <= 'Z' {
  3268				return false
  3269			}
  3270		}
  3271		return true
  3272	}
  3273	
  3274	func http2httpCodeString(code int) string {
  3275		switch code {
  3276		case 200:
  3277			return "200"
  3278		case 404:
  3279			return "404"
  3280		}
  3281		return strconv.Itoa(code)
  3282	}
  3283	
  3284	// from pkg io
  3285	type http2stringWriter interface {
  3286		WriteString(s string) (n int, err error)
  3287	}
  3288	
  3289	// A gate lets two goroutines coordinate their activities.
  3290	type http2gate chan struct{}
  3291	
  3292	func (g http2gate) Done() { g <- struct{}{} }
  3293	
  3294	func (g http2gate) Wait() { <-g }
  3295	
  3296	// A closeWaiter is like a sync.WaitGroup but only goes 1 to 0 (open to closed).
  3297	type http2closeWaiter chan struct{}
  3298	
  3299	// Init makes a closeWaiter usable.
  3300	// It exists because so a closeWaiter value can be placed inside a
  3301	// larger struct and have the Mutex and Cond's memory in the same
  3302	// allocation.
  3303	func (cw *http2closeWaiter) Init() {
  3304		*cw = make(chan struct{})
  3305	}
  3306	
  3307	// Close marks the closeWaiter as closed and unblocks any waiters.
  3308	func (cw http2closeWaiter) Close() {
  3309		close(cw)
  3310	}
  3311	
  3312	// Wait waits for the closeWaiter to become closed.
  3313	func (cw http2closeWaiter) Wait() {
  3314		<-cw
  3315	}
  3316	
  3317	// bufferedWriter is a buffered writer that writes to w.
  3318	// Its buffered writer is lazily allocated as needed, to minimize
  3319	// idle memory usage with many connections.
  3320	type http2bufferedWriter struct {
  3321		w  io.Writer     // immutable
  3322		bw *bufio.Writer // non-nil when data is buffered
  3323	}
  3324	
  3325	func http2newBufferedWriter(w io.Writer) *http2bufferedWriter {
  3326		return &http2bufferedWriter{w: w}
  3327	}
  3328	
  3329	// bufWriterPoolBufferSize is the size of bufio.Writer's
  3330	// buffers created using bufWriterPool.
  3331	//
  3332	// TODO: pick a less arbitrary value? this is a bit under
  3333	// (3 x typical 1500 byte MTU) at least. Other than that,
  3334	// not much thought went into it.
  3335	const http2bufWriterPoolBufferSize = 4 << 10
  3336	
  3337	var http2bufWriterPool = sync.Pool{
  3338		New: func() interface{} {
  3339			return bufio.NewWriterSize(nil, http2bufWriterPoolBufferSize)
  3340		},
  3341	}
  3342	
  3343	func (w *http2bufferedWriter) Available() int {
  3344		if w.bw == nil {
  3345			return http2bufWriterPoolBufferSize
  3346		}
  3347		return w.bw.Available()
  3348	}
  3349	
  3350	func (w *http2bufferedWriter) Write(p []byte) (n int, err error) {
  3351		if w.bw == nil {
  3352			bw := http2bufWriterPool.Get().(*bufio.Writer)
  3353			bw.Reset(w.w)
  3354			w.bw = bw
  3355		}
  3356		return w.bw.Write(p)
  3357	}
  3358	
  3359	func (w *http2bufferedWriter) Flush() error {
  3360		bw := w.bw
  3361		if bw == nil {
  3362			return nil
  3363		}
  3364		err := bw.Flush()
  3365		bw.Reset(nil)
  3366		http2bufWriterPool.Put(bw)
  3367		w.bw = nil
  3368		return err
  3369	}
  3370	
  3371	func http2mustUint31(v int32) uint32 {
  3372		if v < 0 || v > 2147483647 {
  3373			panic("out of range")
  3374		}
  3375		return uint32(v)
  3376	}
  3377	
  3378	// bodyAllowedForStatus reports whether a given response status code
  3379	// permits a body. See RFC 7230, section 3.3.
  3380	func http2bodyAllowedForStatus(status int) bool {
  3381		switch {
  3382		case status >= 100 && status <= 199:
  3383			return false
  3384		case status == 204:
  3385			return false
  3386		case status == 304:
  3387			return false
  3388		}
  3389		return true
  3390	}
  3391	
  3392	type http2httpError struct {
  3393		msg     string
  3394		timeout bool
  3395	}
  3396	
  3397	func (e *http2httpError) Error() string { return e.msg }
  3398	
  3399	func (e *http2httpError) Timeout() bool { return e.timeout }
  3400	
  3401	func (e *http2httpError) Temporary() bool { return true }
  3402	
  3403	var http2errTimeout error = &http2httpError{msg: "http2: timeout awaiting response headers", timeout: true}
  3404	
  3405	type http2connectionStater interface {
  3406		ConnectionState() tls.ConnectionState
  3407	}
  3408	
  3409	var http2sorterPool = sync.Pool{New: func() interface{} { return new(http2sorter) }}
  3410	
  3411	type http2sorter struct {
  3412		v []string // owned by sorter
  3413	}
  3414	
  3415	func (s *http2sorter) Len() int { return len(s.v) }
  3416	
  3417	func (s *http2sorter) Swap(i, j int) { s.v[i], s.v[j] = s.v[j], s.v[i] }
  3418	
  3419	func (s *http2sorter) Less(i, j int) bool { return s.v[i] < s.v[j] }
  3420	
  3421	// Keys returns the sorted keys of h.
  3422	//
  3423	// The returned slice is only valid until s used again or returned to
  3424	// its pool.
  3425	func (s *http2sorter) Keys(h Header) []string {
  3426		keys := s.v[:0]
  3427		for k := range h {
  3428			keys = append(keys, k)
  3429		}
  3430		s.v = keys
  3431		sort.Sort(s)
  3432		return keys
  3433	}
  3434	
  3435	func (s *http2sorter) SortStrings(ss []string) {
  3436		// Our sorter works on s.v, which sorter owns, so
  3437		// stash it away while we sort the user's buffer.
  3438		save := s.v
  3439		s.v = ss
  3440		sort.Sort(s)
  3441		s.v = save
  3442	}
  3443	
  3444	// validPseudoPath reports whether v is a valid :path pseudo-header
  3445	// value. It must be either:
  3446	//
  3447	//     *) a non-empty string starting with '/'
  3448	//     *) the string '*', for OPTIONS requests.
  3449	//
  3450	// For now this is only used a quick check for deciding when to clean
  3451	// up Opaque URLs before sending requests from the Transport.
  3452	// See golang.org/issue/16847
  3453	//
  3454	// We used to enforce that the path also didn't start with "//", but
  3455	// Google's GFE accepts such paths and Chrome sends them, so ignore
  3456	// that part of the spec. See golang.org/issue/19103.
  3457	func http2validPseudoPath(v string) bool {
  3458		return (len(v) > 0 && v[0] == '/') || v == "*"
  3459	}
  3460	
  3461	// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like
  3462	// io.Pipe except there are no PipeReader/PipeWriter halves, and the
  3463	// underlying buffer is an interface. (io.Pipe is always unbuffered)
  3464	type http2pipe struct {
  3465		mu       sync.Mutex
  3466		c        sync.Cond       // c.L lazily initialized to &p.mu
  3467		b        http2pipeBuffer // nil when done reading
  3468		err      error           // read error once empty. non-nil means closed.
  3469		breakErr error           // immediate read error (caller doesn't see rest of b)
  3470		donec    chan struct{}   // closed on error
  3471		readFn   func()          // optional code to run in Read before error
  3472	}
  3473	
  3474	type http2pipeBuffer interface {
  3475		Len() int
  3476		io.Writer
  3477		io.Reader
  3478	}
  3479	
  3480	func (p *http2pipe) Len() int {
  3481		p.mu.Lock()
  3482		defer p.mu.Unlock()
  3483		if p.b == nil {
  3484			return 0
  3485		}
  3486		return p.b.Len()
  3487	}
  3488	
  3489	// Read waits until data is available and copies bytes
  3490	// from the buffer into p.
  3491	func (p *http2pipe) Read(d []byte) (n int, err error) {
  3492		p.mu.Lock()
  3493		defer p.mu.Unlock()
  3494		if p.c.L == nil {
  3495			p.c.L = &p.mu
  3496		}
  3497		for {
  3498			if p.breakErr != nil {
  3499				return 0, p.breakErr
  3500			}
  3501			if p.b != nil && p.b.Len() > 0 {
  3502				return p.b.Read(d)
  3503			}
  3504			if p.err != nil {
  3505				if p.readFn != nil {
  3506					p.readFn()     // e.g. copy trailers
  3507					p.readFn = nil // not sticky like p.err
  3508				}
  3509				p.b = nil
  3510				return 0, p.err
  3511			}
  3512			p.c.Wait()
  3513		}
  3514	}
  3515	
  3516	var http2errClosedPipeWrite = errors.New("write on closed buffer")
  3517	
  3518	// Write copies bytes from p into the buffer and wakes a reader.
  3519	// It is an error to write more data than the buffer can hold.
  3520	func (p *http2pipe) Write(d []byte) (n int, err error) {
  3521		p.mu.Lock()
  3522		defer p.mu.Unlock()
  3523		if p.c.L == nil {
  3524			p.c.L = &p.mu
  3525		}
  3526		defer p.c.Signal()
  3527		if p.err != nil {
  3528			return 0, http2errClosedPipeWrite
  3529		}
  3530		if p.breakErr != nil {
  3531			return len(d), nil // discard when there is no reader
  3532		}
  3533		return p.b.Write(d)
  3534	}
  3535	
  3536	// CloseWithError causes the next Read (waking up a current blocked
  3537	// Read if needed) to return the provided err after all data has been
  3538	// read.
  3539	//
  3540	// The error must be non-nil.
  3541	func (p *http2pipe) CloseWithError(err error) { p.closeWithError(&p.err, err, nil) }
  3542	
  3543	// BreakWithError causes the next Read (waking up a current blocked
  3544	// Read if needed) to return the provided err immediately, without
  3545	// waiting for unread data.
  3546	func (p *http2pipe) BreakWithError(err error) { p.closeWithError(&p.breakErr, err, nil) }
  3547	
  3548	// closeWithErrorAndCode is like CloseWithError but also sets some code to run
  3549	// in the caller's goroutine before returning the error.
  3550	func (p *http2pipe) closeWithErrorAndCode(err error, fn func()) { p.closeWithError(&p.err, err, fn) }
  3551	
  3552	func (p *http2pipe) closeWithError(dst *error, err error, fn func()) {
  3553		if err == nil {
  3554			panic("err must be non-nil")
  3555		}
  3556		p.mu.Lock()
  3557		defer p.mu.Unlock()
  3558		if p.c.L == nil {
  3559			p.c.L = &p.mu
  3560		}
  3561		defer p.c.Signal()
  3562		if *dst != nil {
  3563			// Already been done.
  3564			return
  3565		}
  3566		p.readFn = fn
  3567		if dst == &p.breakErr {
  3568			p.b = nil
  3569		}
  3570		*dst = err
  3571		p.closeDoneLocked()
  3572	}
  3573	
  3574	// requires p.mu be held.
  3575	func (p *http2pipe) closeDoneLocked() {
  3576		if p.donec == nil {
  3577			return
  3578		}
  3579		// Close if unclosed. This isn't racy since we always
  3580		// hold p.mu while closing.
  3581		select {
  3582		case <-p.donec:
  3583		default:
  3584			close(p.donec)
  3585		}
  3586	}
  3587	
  3588	// Err returns the error (if any) first set by BreakWithError or CloseWithError.
  3589	func (p *http2pipe) Err() error {
  3590		p.mu.Lock()
  3591		defer p.mu.Unlock()
  3592		if p.breakErr != nil {
  3593			return p.breakErr
  3594		}
  3595		return p.err
  3596	}
  3597	
  3598	// Done returns a channel which is closed if and when this pipe is closed
  3599	// with CloseWithError.
  3600	func (p *http2pipe) Done() <-chan struct{} {
  3601		p.mu.Lock()
  3602		defer p.mu.Unlock()
  3603		if p.donec == nil {
  3604			p.donec = make(chan struct{})
  3605			if p.err != nil || p.breakErr != nil {
  3606				// Already hit an error.
  3607				p.closeDoneLocked()
  3608			}
  3609		}
  3610		return p.donec
  3611	}
  3612	
  3613	const (
  3614		http2prefaceTimeout         = 10 * time.Second
  3615		http2firstSettingsTimeout   = 2 * time.Second // should be in-flight with preface anyway
  3616		http2handlerChunkWriteSize  = 4 << 10
  3617		http2defaultMaxStreams      = 250 // TODO: make this 100 as the GFE seems to?
  3618		http2maxQueuedControlFrames = 10000
  3619	)
  3620	
  3621	var (
  3622		http2errClientDisconnected = errors.New("client disconnected")
  3623		http2errClosedBody         = errors.New("body closed by handler")
  3624		http2errHandlerComplete    = errors.New("http2: request body closed due to handler exiting")
  3625		http2errStreamClosed       = errors.New("http2: stream closed")
  3626	)
  3627	
  3628	var http2responseWriterStatePool = sync.Pool{
  3629		New: func() interface{} {
  3630			rws := &http2responseWriterState{}
  3631			rws.bw = bufio.NewWriterSize(http2chunkWriter{rws}, http2handlerChunkWriteSize)
  3632			return rws
  3633		},
  3634	}
  3635	
  3636	// Test hooks.
  3637	var (
  3638		http2testHookOnConn        func()
  3639		http2testHookGetServerConn func(*http2serverConn)
  3640		http2testHookOnPanicMu     *sync.Mutex // nil except in tests
  3641		http2testHookOnPanic       func(sc *http2serverConn, panicVal interface{}) (rePanic bool)
  3642	)
  3643	
  3644	// Server is an HTTP/2 server.
  3645	type http2Server struct {
  3646		// MaxHandlers limits the number of http.Handler ServeHTTP goroutines
  3647		// which may run at a time over all connections.
  3648		// Negative or zero no limit.
  3649		// TODO: implement
  3650		MaxHandlers int
  3651	
  3652		// MaxConcurrentStreams optionally specifies the number of
  3653		// concurrent streams that each client may have open at a
  3654		// time. This is unrelated to the number of http.Handler goroutines
  3655		// which may be active globally, which is MaxHandlers.
  3656		// If zero, MaxConcurrentStreams defaults to at least 100, per
  3657		// the HTTP/2 spec's recommendations.
  3658		MaxConcurrentStreams uint32
  3659	
  3660		// MaxReadFrameSize optionally specifies the largest frame
  3661		// this server is willing to read. A valid value is between
  3662		// 16k and 16M, inclusive. If zero or otherwise invalid, a
  3663		// default value is used.
  3664		MaxReadFrameSize uint32
  3665	
  3666		// PermitProhibitedCipherSuites, if true, permits the use of
  3667		// cipher suites prohibited by the HTTP/2 spec.
  3668		PermitProhibitedCipherSuites bool
  3669	
  3670		// IdleTimeout specifies how long until idle clients should be
  3671		// closed with a GOAWAY frame. PING frames are not considered
  3672		// activity for the purposes of IdleTimeout.
  3673		IdleTimeout time.Duration
  3674	
  3675		// MaxUploadBufferPerConnection is the size of the initial flow
  3676		// control window for each connections. The HTTP/2 spec does not
  3677		// allow this to be smaller than 65535 or larger than 2^32-1.
  3678		// If the value is outside this range, a default value will be
  3679		// used instead.
  3680		MaxUploadBufferPerConnection int32
  3681	
  3682		// MaxUploadBufferPerStream is the size of the initial flow control
  3683		// window for each stream. The HTTP/2 spec does not allow this to
  3684		// be larger than 2^32-1. If the value is zero or larger than the
  3685		// maximum, a default value will be used instead.
  3686		MaxUploadBufferPerStream int32
  3687	
  3688		// NewWriteScheduler constructs a write scheduler for a connection.
  3689		// If nil, a default scheduler is chosen.
  3690		NewWriteScheduler func() http2WriteScheduler
  3691	
  3692		// Internal state. This is a pointer (rather than embedded directly)
  3693		// so that we don't embed a Mutex in this struct, which will make the
  3694		// struct non-copyable, which might break some callers.
  3695		state *http2serverInternalState
  3696	}
  3697	
  3698	func (s *http2Server) initialConnRecvWindowSize() int32 {
  3699		if s.MaxUploadBufferPerConnection > http2initialWindowSize {
  3700			return s.MaxUploadBufferPerConnection
  3701		}
  3702		return 1 << 20
  3703	}
  3704	
  3705	func (s *http2Server) initialStreamRecvWindowSize() int32 {
  3706		if s.MaxUploadBufferPerStream > 0 {
  3707			return s.MaxUploadBufferPerStream
  3708		}
  3709		return 1 << 20
  3710	}
  3711	
  3712	func (s *http2Server) maxReadFrameSize() uint32 {
  3713		if v := s.MaxReadFrameSize; v >= http2minMaxFrameSize && v <= http2maxFrameSize {
  3714			return v
  3715		}
  3716		return http2defaultMaxReadFrameSize
  3717	}
  3718	
  3719	func (s *http2Server) maxConcurrentStreams() uint32 {
  3720		if v := s.MaxConcurrentStreams; v > 0 {
  3721			return v
  3722		}
  3723		return http2defaultMaxStreams
  3724	}
  3725	
  3726	// maxQueuedControlFrames is the maximum number of control frames like
  3727	// SETTINGS, PING and RST_STREAM that will be queued for writing before
  3728	// the connection is closed to prevent memory exhaustion attacks.
  3729	func (s *http2Server) maxQueuedControlFrames() int {
  3730		// TODO: if anybody asks, add a Server field, and remember to define the
  3731		// behavior of negative values.
  3732		return http2maxQueuedControlFrames
  3733	}
  3734	
  3735	type http2serverInternalState struct {
  3736		mu          sync.Mutex
  3737		activeConns map[*http2serverConn]struct{}
  3738	}
  3739	
  3740	func (s *http2serverInternalState) registerConn(sc *http2serverConn) {
  3741		if s == nil {
  3742			return // if the Server was used without calling ConfigureServer
  3743		}
  3744		s.mu.Lock()
  3745		s.activeConns[sc] = struct{}{}
  3746		s.mu.Unlock()
  3747	}
  3748	
  3749	func (s *http2serverInternalState) unregisterConn(sc *http2serverConn) {
  3750		if s == nil {
  3751			return // if the Server was used without calling ConfigureServer
  3752		}
  3753		s.mu.Lock()
  3754		delete(s.activeConns, sc)
  3755		s.mu.Unlock()
  3756	}
  3757	
  3758	func (s *http2serverInternalState) startGracefulShutdown() {
  3759		if s == nil {
  3760			return // if the Server was used without calling ConfigureServer
  3761		}
  3762		s.mu.Lock()
  3763		for sc := range s.activeConns {
  3764			sc.startGracefulShutdown()
  3765		}
  3766		s.mu.Unlock()
  3767	}
  3768	
  3769	// ConfigureServer adds HTTP/2 support to a net/http Server.
  3770	//
  3771	// The configuration conf may be nil.
  3772	//
  3773	// ConfigureServer must be called before s begins serving.
  3774	func http2ConfigureServer(s *Server, conf *http2Server) error {
  3775		if s == nil {
  3776			panic("nil *http.Server")
  3777		}
  3778		if conf == nil {
  3779			conf = new(http2Server)
  3780		}
  3781		conf.state = &http2serverInternalState{activeConns: make(map[*http2serverConn]struct{})}
  3782		if h1, h2 := s, conf; h2.IdleTimeout == 0 {
  3783			if h1.IdleTimeout != 0 {
  3784				h2.IdleTimeout = h1.IdleTimeout
  3785			} else {
  3786				h2.IdleTimeout = h1.ReadTimeout
  3787			}
  3788		}
  3789		s.RegisterOnShutdown(conf.state.startGracefulShutdown)
  3790	
  3791		if s.TLSConfig == nil {
  3792			s.TLSConfig = new(tls.Config)
  3793		} else if s.TLSConfig.CipherSuites != nil {
  3794			// If they already provided a CipherSuite list, return
  3795			// an error if it has a bad order or is missing
  3796			// ECDHE_RSA_WITH_AES_128_GCM_SHA256 or ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
  3797			haveRequired := false
  3798			sawBad := false
  3799			for i, cs := range s.TLSConfig.CipherSuites {
  3800				switch cs {
  3801				case tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  3802					// Alternative MTI cipher to not discourage ECDSA-only servers.
  3803					// See http://golang.org/cl/30721 for further information.
  3804					tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  3805					haveRequired = true
  3806				}
  3807				if http2isBadCipher(cs) {
  3808					sawBad = true
  3809				} else if sawBad {
  3810					return fmt.Errorf("http2: TLSConfig.CipherSuites index %d contains an HTTP/2-approved cipher suite (%#04x), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.", i, cs)
  3811				}
  3812			}
  3813			if !haveRequired {
  3814				return fmt.Errorf("http2: TLSConfig.CipherSuites is missing an HTTP/2-required AES_128_GCM_SHA256 cipher.")
  3815			}
  3816		}
  3817	
  3818		// Note: not setting MinVersion to tls.VersionTLS12,
  3819		// as we don't want to interfere with HTTP/1.1 traffic
  3820		// on the user's server. We enforce TLS 1.2 later once
  3821		// we accept a connection. Ideally this should be done
  3822		// during next-proto selection, but using TLS <1.2 with
  3823		// HTTP/2 is still the client's bug.
  3824	
  3825		s.TLSConfig.PreferServerCipherSuites = true
  3826	
  3827		haveNPN := false
  3828		for _, p := range s.TLSConfig.NextProtos {
  3829			if p == http2NextProtoTLS {
  3830				haveNPN = true
  3831				break
  3832			}
  3833		}
  3834		if !haveNPN {
  3835			s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, http2NextProtoTLS)
  3836		}
  3837	
  3838		if s.TLSNextProto == nil {
  3839			s.TLSNextProto = map[string]func(*Server, *tls.Conn, Handler){}
  3840		}
  3841		protoHandler := func(hs *Server, c *tls.Conn, h Handler) {
  3842			if http2testHookOnConn != nil {
  3843				http2testHookOnConn()
  3844			}
  3845			// The TLSNextProto interface predates contexts, so
  3846			// the net/http package passes down its per-connection
  3847			// base context via an exported but unadvertised
  3848			// method on the Handler. This is for internal
  3849			// net/http<=>http2 use only.
  3850			var ctx context.Context
  3851			type baseContexter interface {
  3852				BaseContext() context.Context
  3853			}
  3854			if bc, ok := h.(baseContexter); ok {
  3855				ctx = bc.BaseContext()
  3856			}
  3857			conf.ServeConn(c, &http2ServeConnOpts{
  3858				Context:    ctx,
  3859				Handler:    h,
  3860				BaseConfig: hs,
  3861			})
  3862		}
  3863		s.TLSNextProto[http2NextProtoTLS] = protoHandler
  3864		return nil
  3865	}
  3866	
  3867	// ServeConnOpts are options for the Server.ServeConn method.
  3868	type http2ServeConnOpts struct {
  3869		// Context is the base context to use.
  3870		// If nil, context.Background is used.
  3871		Context context.Context
  3872	
  3873		// BaseConfig optionally sets the base configuration
  3874		// for values. If nil, defaults are used.
  3875		BaseConfig *Server
  3876	
  3877		// Handler specifies which handler to use for processing
  3878		// requests. If nil, BaseConfig.Handler is used. If BaseConfig
  3879		// or BaseConfig.Handler is nil, http.DefaultServeMux is used.
  3880		Handler Handler
  3881	}
  3882	
  3883	func (o *http2ServeConnOpts) context() context.Context {
  3884		if o.Context != nil {
  3885			return o.Context
  3886		}
  3887		return context.Background()
  3888	}
  3889	
  3890	func (o *http2ServeConnOpts) baseConfig() *Server {
  3891		if o != nil && o.BaseConfig != nil {
  3892			return o.BaseConfig
  3893		}
  3894		return new(Server)
  3895	}
  3896	
  3897	func (o *http2ServeConnOpts) handler() Handler {
  3898		if o != nil {
  3899			if o.Handler != nil {
  3900				return o.Handler
  3901			}
  3902			if o.BaseConfig != nil && o.BaseConfig.Handler != nil {
  3903				return o.BaseConfig.Handler
  3904			}
  3905		}
  3906		return DefaultServeMux
  3907	}
  3908	
  3909	// ServeConn serves HTTP/2 requests on the provided connection and
  3910	// blocks until the connection is no longer readable.
  3911	//
  3912	// ServeConn starts speaking HTTP/2 assuming that c has not had any
  3913	// reads or writes. It writes its initial settings frame and expects
  3914	// to be able to read the preface and settings frame from the
  3915	// client. If c has a ConnectionState method like a *tls.Conn, the
  3916	// ConnectionState is used to verify the TLS ciphersuite and to set
  3917	// the Request.TLS field in Handlers.
  3918	//
  3919	// ServeConn does not support h2c by itself. Any h2c support must be
  3920	// implemented in terms of providing a suitably-behaving net.Conn.
  3921	//
  3922	// The opts parameter is optional. If nil, default values are used.
  3923	func (s *http2Server) ServeConn(c net.Conn, opts *http2ServeConnOpts) {
  3924		baseCtx, cancel := http2serverConnBaseContext(c, opts)
  3925		defer cancel()
  3926	
  3927		sc := &http2serverConn{
  3928			srv:                         s,
  3929			hs:                          opts.baseConfig(),
  3930			conn:                        c,
  3931			baseCtx:                     baseCtx,
  3932			remoteAddrStr:               c.RemoteAddr().String(),
  3933			bw:                          http2newBufferedWriter(c),
  3934			handler:                     opts.handler(),
  3935			streams:                     make(map[uint32]*http2stream),
  3936			readFrameCh:                 make(chan http2readFrameResult),
  3937			wantWriteFrameCh:            make(chan http2FrameWriteRequest, 8),
  3938			serveMsgCh:                  make(chan interface{}, 8),
  3939			wroteFrameCh:                make(chan http2frameWriteResult, 1), // buffered; one send in writeFrameAsync
  3940			bodyReadCh:                  make(chan http2bodyReadMsg),         // buffering doesn't matter either way
  3941			doneServing:                 make(chan struct{}),
  3942			clientMaxStreams:            math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value"
  3943			advMaxStreams:               s.maxConcurrentStreams(),
  3944			initialStreamSendWindowSize: http2initialWindowSize,
  3945			maxFrameSize:                http2initialMaxFrameSize,
  3946			headerTableSize:             http2initialHeaderTableSize,
  3947			serveG:                      http2newGoroutineLock(),
  3948			pushEnabled:                 true,
  3949		}
  3950	
  3951		s.state.registerConn(sc)
  3952		defer s.state.unregisterConn(sc)
  3953	
  3954		// The net/http package sets the write deadline from the
  3955		// http.Server.WriteTimeout during the TLS handshake, but then
  3956		// passes the connection off to us with the deadline already set.
  3957		// Write deadlines are set per stream in serverConn.newStream.
  3958		// Disarm the net.Conn write deadline here.
  3959		if sc.hs.WriteTimeout != 0 {
  3960			sc.conn.SetWriteDeadline(time.Time{})
  3961		}
  3962	
  3963		if s.NewWriteScheduler != nil {
  3964			sc.writeSched = s.NewWriteScheduler()
  3965		} else {
  3966			sc.writeSched = http2NewRandomWriteScheduler()
  3967		}
  3968	
  3969		// These start at the RFC-specified defaults. If there is a higher
  3970		// configured value for inflow, that will be updated when we send a
  3971		// WINDOW_UPDATE shortly after sending SETTINGS.
  3972		sc.flow.add(http2initialWindowSize)
  3973		sc.inflow.add(http2initialWindowSize)
  3974		sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf)
  3975	
  3976		fr := http2NewFramer(sc.bw, c)
  3977		fr.ReadMetaHeaders = hpack.NewDecoder(http2initialHeaderTableSize, nil)
  3978		fr.MaxHeaderListSize = sc.maxHeaderListSize()
  3979		fr.SetMaxReadFrameSize(s.maxReadFrameSize())
  3980		sc.framer = fr
  3981	
  3982		if tc, ok := c.(http2connectionStater); ok {
  3983			sc.tlsState = new(tls.ConnectionState)
  3984			*sc.tlsState = tc.ConnectionState()
  3985			// 9.2 Use of TLS Features
  3986			// An implementation of HTTP/2 over TLS MUST use TLS
  3987			// 1.2 or higher with the restrictions on feature set
  3988			// and cipher suite described in this section. Due to
  3989			// implementation limitations, it might not be
  3990			// possible to fail TLS negotiation. An endpoint MUST
  3991			// immediately terminate an HTTP/2 connection that
  3992			// does not meet the TLS requirements described in
  3993			// this section with a connection error (Section
  3994			// 5.4.1) of type INADEQUATE_SECURITY.
  3995			if sc.tlsState.Version < tls.VersionTLS12 {
  3996				sc.rejectConn(http2ErrCodeInadequateSecurity, "TLS version too low")
  3997				return
  3998			}
  3999	
  4000			if sc.tlsState.ServerName == "" {
  4001				// Client must use SNI, but we don't enforce that anymore,
  4002				// since it was causing problems when connecting to bare IP
  4003				// addresses during development.
  4004				//
  4005				// TODO: optionally enforce? Or enforce at the time we receive
  4006				// a new request, and verify the ServerName matches the :authority?
  4007				// But that precludes proxy situations, perhaps.
  4008				//
  4009				// So for now, do nothing here again.
  4010			}
  4011	
  4012			if !s.PermitProhibitedCipherSuites && http2isBadCipher(sc.tlsState.CipherSuite) {
  4013				// "Endpoints MAY choose to generate a connection error
  4014				// (Section 5.4.1) of type INADEQUATE_SECURITY if one of
  4015				// the prohibited cipher suites are negotiated."
  4016				//
  4017				// We choose that. In my opinion, the spec is weak
  4018				// here. It also says both parties must support at least
  4019				// TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 so there's no
  4020				// excuses here. If we really must, we could allow an
  4021				// "AllowInsecureWeakCiphers" option on the server later.
  4022				// Let's see how it plays out first.
  4023				sc.rejectConn(http2ErrCodeInadequateSecurity, fmt.Sprintf("Prohibited TLS 1.2 Cipher Suite: %x", sc.tlsState.CipherSuite))
  4024				return
  4025			}
  4026		}
  4027	
  4028		if hook := http2testHookGetServerConn; hook != nil {
  4029			hook(sc)
  4030		}
  4031		sc.serve()
  4032	}
  4033	
  4034	func http2serverConnBaseContext(c net.Conn, opts *http2ServeConnOpts) (ctx context.Context, cancel func()) {
  4035		ctx, cancel = context.WithCancel(opts.context())
  4036		ctx = context.WithValue(ctx, LocalAddrContextKey, c.LocalAddr())
  4037		if hs := opts.baseConfig(); hs != nil {
  4038			ctx = context.WithValue(ctx, ServerContextKey, hs)
  4039		}
  4040		return
  4041	}
  4042	
  4043	func (sc *http2serverConn) rejectConn(err http2ErrCode, debug string) {
  4044		sc.vlogf("http2: server rejecting conn: %v, %s", err, debug)
  4045		// ignoring errors. hanging up anyway.
  4046		sc.framer.WriteGoAway(0, err, []byte(debug))
  4047		sc.bw.Flush()
  4048		sc.conn.Close()
  4049	}
  4050	
  4051	type http2serverConn struct {
  4052		// Immutable:
  4053		srv              *http2Server
  4054		hs               *Server
  4055		conn             net.Conn
  4056		bw               *http2bufferedWriter // writing to conn
  4057		handler          Handler
  4058		baseCtx          context.Context
  4059		framer           *http2Framer
  4060		doneServing      chan struct{}               // closed when serverConn.serve ends
  4061		readFrameCh      chan http2readFrameResult   // written by serverConn.readFrames
  4062		wantWriteFrameCh chan http2FrameWriteRequest // from handlers -> serve
  4063		wroteFrameCh     chan http2frameWriteResult  // from writeFrameAsync -> serve, tickles more frame writes
  4064		bodyReadCh       chan http2bodyReadMsg       // from handlers -> serve
  4065		serveMsgCh       chan interface{}            // misc messages & code to send to / run on the serve loop
  4066		flow             http2flow                   // conn-wide (not stream-specific) outbound flow control
  4067		inflow           http2flow                   // conn-wide inbound flow control
  4068		tlsState         *tls.ConnectionState        // shared by all handlers, like net/http
  4069		remoteAddrStr    string
  4070		writeSched       http2WriteScheduler
  4071	
  4072		// Everything following is owned by the serve loop; use serveG.check():
  4073		serveG                      http2goroutineLock // used to verify funcs are on serve()
  4074		pushEnabled                 bool
  4075		sawFirstSettings            bool // got the initial SETTINGS frame after the preface
  4076		needToSendSettingsAck       bool
  4077		unackedSettings             int    // how many SETTINGS have we sent without ACKs?
  4078		queuedControlFrames         int    // control frames in the writeSched queue
  4079		clientMaxStreams            uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit)
  4080		advMaxStreams               uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client
  4081		curClientStreams            uint32 // number of open streams initiated by the client
  4082		curPushedStreams            uint32 // number of open streams initiated by server push
  4083		maxClientStreamID           uint32 // max ever seen from client (odd), or 0 if there have been no client requests
  4084		maxPushPromiseID            uint32 // ID of the last push promise (even), or 0 if there have been no pushes
  4085		streams                     map[uint32]*http2stream
  4086		initialStreamSendWindowSize int32
  4087		maxFrameSize                int32
  4088		headerTableSize             uint32
  4089		peerMaxHeaderListSize       uint32            // zero means unknown (default)
  4090		canonHeader                 map[string]string // http2-lower-case -> Go-Canonical-Case
  4091		writingFrame                bool              // started writing a frame (on serve goroutine or separate)
  4092		writingFrameAsync           bool              // started a frame on its own goroutine but haven't heard back on wroteFrameCh
  4093		needsFrameFlush             bool              // last frame write wasn't a flush
  4094		inGoAway                    bool              // we've started to or sent GOAWAY
  4095		inFrameScheduleLoop         bool              // whether we're in the scheduleFrameWrite loop
  4096		needToSendGoAway            bool              // we need to schedule a GOAWAY frame write
  4097		goAwayCode                  http2ErrCode
  4098		shutdownTimer               *time.Timer // nil until used
  4099		idleTimer                   *time.Timer // nil if unused
  4100	
  4101		// Owned by the writeFrameAsync goroutine:
  4102		headerWriteBuf bytes.Buffer
  4103		hpackEncoder   *hpack.Encoder
  4104	
  4105		// Used by startGracefulShutdown.
  4106		shutdownOnce sync.Once
  4107	}
  4108	
  4109	func (sc *http2serverConn) maxHeaderListSize() uint32 {
  4110		n := sc.hs.MaxHeaderBytes
  4111		if n <= 0 {
  4112			n = DefaultMaxHeaderBytes
  4113		}
  4114		// http2's count is in a slightly different unit and includes 32 bytes per pair.
  4115		// So, take the net/http.Server value and pad it up a bit, assuming 10 headers.
  4116		const perFieldOverhead = 32 // per http2 spec
  4117		const typicalHeaders = 10   // conservative
  4118		return uint32(n + typicalHeaders*perFieldOverhead)
  4119	}
  4120	
  4121	func (sc *http2serverConn) curOpenStreams() uint32 {
  4122		sc.serveG.check()
  4123		return sc.curClientStreams + sc.curPushedStreams
  4124	}
  4125	
  4126	// stream represents a stream. This is the minimal metadata needed by
  4127	// the serve goroutine. Most of the actual stream state is owned by
  4128	// the http.Handler's goroutine in the responseWriter. Because the
  4129	// responseWriter's responseWriterState is recycled at the end of a
  4130	// handler, this struct intentionally has no pointer to the
  4131	// *responseWriter{,State} itself, as the Handler ending nils out the
  4132	// responseWriter's state field.
  4133	type http2stream struct {
  4134		// immutable:
  4135		sc        *http2serverConn
  4136		id        uint32
  4137		body      *http2pipe       // non-nil if expecting DATA frames
  4138		cw        http2closeWaiter // closed wait stream transitions to closed state
  4139		ctx       context.Context
  4140		cancelCtx func()
  4141	
  4142		// owned by serverConn's serve loop:
  4143		bodyBytes        int64        // body bytes seen so far
  4144		declBodyBytes    int64        // or -1 if undeclared
  4145		flow             http2flow    // limits writing from Handler to client
  4146		inflow           http2flow    // what the client is allowed to POST/etc to us
  4147		parent           *http2stream // or nil
  4148		numTrailerValues int64
  4149		weight           uint8
  4150		state            http2streamState
  4151		resetQueued      bool        // RST_STREAM queued for write; set by sc.resetStream
  4152		gotTrailerHeader bool        // HEADER frame for trailers was seen
  4153		wroteHeaders     bool        // whether we wrote headers (not status 100)
  4154		writeDeadline    *time.Timer // nil if unused
  4155	
  4156		trailer    Header // accumulated trailers
  4157		reqTrailer Header // handler's Request.Trailer
  4158	}
  4159	
  4160	func (sc *http2serverConn) Framer() *http2Framer { return sc.framer }
  4161	
  4162	func (sc *http2serverConn) CloseConn() error { return sc.conn.Close() }
  4163	
  4164	func (sc *http2serverConn) Flush() error { return sc.bw.Flush() }
  4165	
  4166	func (sc *http2serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) {
  4167		return sc.hpackEncoder, &sc.headerWriteBuf
  4168	}
  4169	
  4170	func (sc *http2serverConn) state(streamID uint32) (http2streamState, *http2stream) {
  4171		sc.serveG.check()
  4172		// http://tools.ietf.org/html/rfc7540#section-5.1
  4173		if st, ok := sc.streams[streamID]; ok {
  4174			return st.state, st
  4175		}
  4176		// "The first use of a new stream identifier implicitly closes all
  4177		// streams in the "idle" state that might have been initiated by
  4178		// that peer with a lower-valued stream identifier. For example, if
  4179		// a client sends a HEADERS frame on stream 7 without ever sending a
  4180		// frame on stream 5, then stream 5 transitions to the "closed"
  4181		// state when the first frame for stream 7 is sent or received."
  4182		if streamID%2 == 1 {
  4183			if streamID <= sc.maxClientStreamID {
  4184				return http2stateClosed, nil
  4185			}
  4186		} else {
  4187			if streamID <= sc.maxPushPromiseID {
  4188				return http2stateClosed, nil
  4189			}
  4190		}
  4191		return http2stateIdle, nil
  4192	}
  4193	
  4194	// setConnState calls the net/http ConnState hook for this connection, if configured.
  4195	// Note that the net/http package does StateNew and StateClosed for us.
  4196	// There is currently no plan for StateHijacked or hijacking HTTP/2 connections.
  4197	func (sc *http2serverConn) setConnState(state ConnState) {
  4198		if sc.hs.ConnState != nil {
  4199			sc.hs.ConnState(sc.conn, state)
  4200		}
  4201	}
  4202	
  4203	func (sc *http2serverConn) vlogf(format string, args ...interface{}) {
  4204		if http2VerboseLogs {
  4205			sc.logf(format, args...)
  4206		}
  4207	}
  4208	
  4209	func (sc *http2serverConn) logf(format string, args ...interface{}) {
  4210		if lg := sc.hs.ErrorLog; lg != nil {
  4211			lg.Printf(format, args...)
  4212		} else {
  4213			log.Printf(format, args...)
  4214		}
  4215	}
  4216	
  4217	// errno returns v's underlying uintptr, else 0.
  4218	//
  4219	// TODO: remove this helper function once http2 can use build
  4220	// tags. See comment in isClosedConnError.
  4221	func http2errno(v error) uintptr {
  4222		if rv := reflect.ValueOf(v); rv.Kind() == reflect.Uintptr {
  4223			return uintptr(rv.Uint())
  4224		}
  4225		return 0
  4226	}
  4227	
  4228	// isClosedConnError reports whether err is an error from use of a closed
  4229	// network connection.
  4230	func http2isClosedConnError(err error) bool {
  4231		if err == nil {
  4232			return false
  4233		}
  4234	
  4235		// TODO: remove this string search and be more like the Windows
  4236		// case below. That might involve modifying the standard library
  4237		// to return better error types.
  4238		str := err.Error()
  4239		if strings.Contains(str, "use of closed network connection") {
  4240			return true
  4241		}
  4242	
  4243		// TODO(bradfitz): x/tools/cmd/bundle doesn't really support
  4244		// build tags, so I can't make an http2_windows.go file with
  4245		// Windows-specific stuff. Fix that and move this, once we
  4246		// have a way to bundle this into std's net/http somehow.
  4247		if runtime.GOOS == "windows" {
  4248			if oe, ok := err.(*net.OpError); ok && oe.Op == "read" {
  4249				if se, ok := oe.Err.(*os.SyscallError); ok && se.Syscall == "wsarecv" {
  4250					const WSAECONNABORTED = 10053
  4251					const WSAECONNRESET = 10054
  4252					if n := http2errno(se.Err); n == WSAECONNRESET || n == WSAECONNABORTED {
  4253						return true
  4254					}
  4255				}
  4256			}
  4257		}
  4258		return false
  4259	}
  4260	
  4261	func (sc *http2serverConn) condlogf(err error, format string, args ...interface{}) {
  4262		if err == nil {
  4263			return
  4264		}
  4265		if err == io.EOF || err == io.ErrUnexpectedEOF || http2isClosedConnError(err) || err == http2errPrefaceTimeout {
  4266			// Boring, expected errors.
  4267			sc.vlogf(format, args...)
  4268		} else {
  4269			sc.logf(format, args...)
  4270		}
  4271	}
  4272	
  4273	func (sc *http2serverConn) canonicalHeader(v string) string {
  4274		sc.serveG.check()
  4275		http2buildCommonHeaderMapsOnce()
  4276		cv, ok := http2commonCanonHeader[v]
  4277		if ok {
  4278			return cv
  4279		}
  4280		cv, ok = sc.canonHeader[v]
  4281		if ok {
  4282			return cv
  4283		}
  4284		if sc.canonHeader == nil {
  4285			sc.canonHeader = make(map[string]string)
  4286		}
  4287		cv = CanonicalHeaderKey(v)
  4288		sc.canonHeader[v] = cv
  4289		return cv
  4290	}
  4291	
  4292	type http2readFrameResult struct {
  4293		f   http2Frame // valid until readMore is called
  4294		err error
  4295	
  4296		// readMore should be called once the consumer no longer needs or
  4297		// retains f. After readMore, f is invalid and more frames can be
  4298		// read.
  4299		readMore func()
  4300	}
  4301	
  4302	// readFrames is the loop that reads incoming frames.
  4303	// It takes care to only read one frame at a time, blocking until the
  4304	// consumer is done with the frame.
  4305	// It's run on its own goroutine.
  4306	func (sc *http2serverConn) readFrames() {
  4307		gate := make(http2gate)
  4308		gateDone := gate.Done
  4309		for {
  4310			f, err := sc.framer.ReadFrame()
  4311			select {
  4312			case sc.readFrameCh <- http2readFrameResult{f, err, gateDone}:
  4313			case <-sc.doneServing:
  4314				return
  4315			}
  4316			select {
  4317			case <-gate:
  4318			case <-sc.doneServing:
  4319				return
  4320			}
  4321			if http2terminalReadFrameError(err) {
  4322				return
  4323			}
  4324		}
  4325	}
  4326	
  4327	// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine.
  4328	type http2frameWriteResult struct {
  4329		wr  http2FrameWriteRequest // what was written (or attempted)
  4330		err error                  // result of the writeFrame call
  4331	}
  4332	
  4333	// writeFrameAsync runs in its own goroutine and writes a single frame
  4334	// and then reports when it's done.
  4335	// At most one goroutine can be running writeFrameAsync at a time per
  4336	// serverConn.
  4337	func (sc *http2serverConn) writeFrameAsync(wr http2FrameWriteRequest) {
  4338		err := wr.write.writeFrame(sc)
  4339		sc.wroteFrameCh <- http2frameWriteResult{wr, err}
  4340	}
  4341	
  4342	func (sc *http2serverConn) closeAllStreamsOnConnClose() {
  4343		sc.serveG.check()
  4344		for _, st := range sc.streams {
  4345			sc.closeStream(st, http2errClientDisconnected)
  4346		}
  4347	}
  4348	
  4349	func (sc *http2serverConn) stopShutdownTimer() {
  4350		sc.serveG.check()
  4351		if t := sc.shutdownTimer; t != nil {
  4352			t.Stop()
  4353		}
  4354	}
  4355	
  4356	func (sc *http2serverConn) notePanic() {
  4357		// Note: this is for serverConn.serve panicking, not http.Handler code.
  4358		if http2testHookOnPanicMu != nil {
  4359			http2testHookOnPanicMu.Lock()
  4360			defer http2testHookOnPanicMu.Unlock()
  4361		}
  4362		if http2testHookOnPanic != nil {
  4363			if e := recover(); e != nil {
  4364				if http2testHookOnPanic(sc, e) {
  4365					panic(e)
  4366				}
  4367			}
  4368		}
  4369	}
  4370	
  4371	func (sc *http2serverConn) serve() {
  4372		sc.serveG.check()
  4373		defer sc.notePanic()
  4374		defer sc.conn.Close()
  4375		defer sc.closeAllStreamsOnConnClose()
  4376		defer sc.stopShutdownTimer()
  4377		defer close(sc.doneServing) // unblocks handlers trying to send
  4378	
  4379		if http2VerboseLogs {
  4380			sc.vlogf("http2: server connection from %v on %p", sc.conn.RemoteAddr(), sc.hs)
  4381		}
  4382	
  4383		sc.writeFrame(http2FrameWriteRequest{
  4384			write: http2writeSettings{
  4385				{http2SettingMaxFrameSize, sc.srv.maxReadFrameSize()},
  4386				{http2SettingMaxConcurrentStreams, sc.advMaxStreams},
  4387				{http2SettingMaxHeaderListSize, sc.maxHeaderListSize()},
  4388				{http2SettingInitialWindowSize, uint32(sc.srv.initialStreamRecvWindowSize())},
  4389			},
  4390		})
  4391		sc.unackedSettings++
  4392	
  4393		// Each connection starts with intialWindowSize inflow tokens.
  4394		// If a higher value is configured, we add more tokens.
  4395		if diff := sc.srv.initialConnRecvWindowSize() - http2initialWindowSize; diff > 0 {
  4396			sc.sendWindowUpdate(nil, int(diff))
  4397		}
  4398	
  4399		if err := sc.readPreface(); err != nil {
  4400			sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err)
  4401			return
  4402		}
  4403		// Now that we've got the preface, get us out of the
  4404		// "StateNew" state. We can't go directly to idle, though.
  4405		// Active means we read some data and anticipate a request. We'll
  4406		// do another Active when we get a HEADERS frame.
  4407		sc.setConnState(StateActive)
  4408		sc.setConnState(StateIdle)
  4409	
  4410		if sc.srv.IdleTimeout != 0 {
  4411			sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer)
  4412			defer sc.idleTimer.Stop()
  4413		}
  4414	
  4415		go sc.readFrames() // closed by defer sc.conn.Close above
  4416	
  4417		settingsTimer := time.AfterFunc(http2firstSettingsTimeout, sc.onSettingsTimer)
  4418		defer settingsTimer.Stop()
  4419	
  4420		loopNum := 0
  4421		for {
  4422			loopNum++
  4423			select {
  4424			case wr := <-sc.wantWriteFrameCh:
  4425				if se, ok := wr.write.(http2StreamError); ok {
  4426					sc.resetStream(se)
  4427					break
  4428				}
  4429				sc.writeFrame(wr)
  4430			case res := <-sc.wroteFrameCh:
  4431				sc.wroteFrame(res)
  4432			case res := <-sc.readFrameCh:
  4433				if !sc.processFrameFromReader(res) {
  4434					return
  4435				}
  4436				res.readMore()
  4437				if settingsTimer != nil {
  4438					settingsTimer.Stop()
  4439					settingsTimer = nil
  4440				}
  4441			case m := <-sc.bodyReadCh:
  4442				sc.noteBodyRead(m.st, m.n)
  4443			case msg := <-sc.serveMsgCh:
  4444				switch v := msg.(type) {
  4445				case func(int):
  4446					v(loopNum) // for testing
  4447				case *http2serverMessage:
  4448					switch v {
  4449					case http2settingsTimerMsg:
  4450						sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr())
  4451						return
  4452					case http2idleTimerMsg:
  4453						sc.vlogf("connection is idle")
  4454						sc.goAway(http2ErrCodeNo)
  4455					case http2shutdownTimerMsg:
  4456						sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr())
  4457						return
  4458					case http2gracefulShutdownMsg:
  4459						sc.startGracefulShutdownInternal()
  4460					default:
  4461						panic("unknown timer")
  4462					}
  4463				case *http2startPushRequest:
  4464					sc.startPush(v)
  4465				default:
  4466					panic(fmt.Sprintf("unexpected type %T", v))
  4467				}
  4468			}
  4469	
  4470			// If the peer is causing us to generate a lot of control frames,
  4471			// but not reading them from us, assume they are trying to make us
  4472			// run out of memory.
  4473			if sc.queuedControlFrames > sc.srv.maxQueuedControlFrames() {
  4474				sc.vlogf("http2: too many control frames in send queue, closing connection")
  4475				return
  4476			}
  4477	
  4478			// Start the shutdown timer after sending a GOAWAY. When sending GOAWAY
  4479			// with no error code (graceful shutdown), don't start the timer until
  4480			// all open streams have been completed.
  4481			sentGoAway := sc.inGoAway && !sc.needToSendGoAway && !sc.writingFrame
  4482			gracefulShutdownComplete := sc.goAwayCode == http2ErrCodeNo && sc.curOpenStreams() == 0
  4483			if sentGoAway && sc.shutdownTimer == nil && (sc.goAwayCode != http2ErrCodeNo || gracefulShutdownComplete) {
  4484				sc.shutDownIn(http2goAwayTimeout)
  4485			}
  4486		}
  4487	}
  4488	
  4489	func (sc *http2serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) {
  4490		select {
  4491		case <-sc.doneServing:
  4492		case <-sharedCh:
  4493			close(privateCh)
  4494		}
  4495	}
  4496	
  4497	type http2serverMessage int
  4498	
  4499	// Message values sent to serveMsgCh.
  4500	var (
  4501		http2settingsTimerMsg    = new(http2serverMessage)
  4502		http2idleTimerMsg        = new(http2serverMessage)
  4503		http2shutdownTimerMsg    = new(http2serverMessage)
  4504		http2gracefulShutdownMsg = new(http2serverMessage)
  4505	)
  4506	
  4507	func (sc *http2serverConn) onSettingsTimer() { sc.sendServeMsg(http2settingsTimerMsg) }
  4508	
  4509	func (sc *http2serverConn) onIdleTimer() { sc.sendServeMsg(http2idleTimerMsg) }
  4510	
  4511	func (sc *http2serverConn) onShutdownTimer() { sc.sendServeMsg(http2shutdownTimerMsg) }
  4512	
  4513	func (sc *http2serverConn) sendServeMsg(msg interface{}) {
  4514		sc.serveG.checkNotOn() // NOT
  4515		select {
  4516		case sc.serveMsgCh <- msg:
  4517		case <-sc.doneServing:
  4518		}
  4519	}
  4520	
  4521	var http2errPrefaceTimeout = errors.New("timeout waiting for client preface")
  4522	
  4523	// readPreface reads the ClientPreface greeting from the peer or
  4524	// returns errPrefaceTimeout on timeout, or an error if the greeting
  4525	// is invalid.
  4526	func (sc *http2serverConn) readPreface() error {
  4527		errc := make(chan error, 1)
  4528		go func() {
  4529			// Read the client preface
  4530			buf := make([]byte, len(http2ClientPreface))
  4531			if _, err := io.ReadFull(sc.conn, buf); err != nil {
  4532				errc <- err
  4533			} else if !bytes.Equal(buf, http2clientPreface) {
  4534				errc <- fmt.Errorf("bogus greeting %q", buf)
  4535			} else {
  4536				errc <- nil
  4537			}
  4538		}()
  4539		timer := time.NewTimer(http2prefaceTimeout) // TODO: configurable on *Server?
  4540		defer timer.Stop()
  4541		select {
  4542		case <-timer.C:
  4543			return http2errPrefaceTimeout
  4544		case err := <-errc:
  4545			if err == nil {
  4546				if http2VerboseLogs {
  4547					sc.vlogf("http2: server: client %v said hello", sc.conn.RemoteAddr())
  4548				}
  4549			}
  4550			return err
  4551		}
  4552	}
  4553	
  4554	var http2errChanPool = sync.Pool{
  4555		New: func() interface{} { return make(chan error, 1) },
  4556	}
  4557	
  4558	var http2writeDataPool = sync.Pool{
  4559		New: func() interface{} { return new(http2writeData) },
  4560	}
  4561	
  4562	// writeDataFromHandler writes DATA response frames from a handler on
  4563	// the given stream.
  4564	func (sc *http2serverConn) writeDataFromHandler(stream *http2stream, data []byte, endStream bool) error {
  4565		ch := http2errChanPool.Get().(chan error)
  4566		writeArg := http2writeDataPool.Get().(*http2writeData)
  4567		*writeArg = http2writeData{stream.id, data, endStream}
  4568		err := sc.writeFrameFromHandler(http2FrameWriteRequest{
  4569			write:  writeArg,
  4570			stream: stream,
  4571			done:   ch,
  4572		})
  4573		if err != nil {
  4574			return err
  4575		}
  4576		var frameWriteDone bool // the frame write is done (successfully or not)
  4577		select {
  4578		case err = <-ch:
  4579			frameWriteDone = true
  4580		case <-sc.doneServing:
  4581			return http2errClientDisconnected
  4582		case <-stream.cw:
  4583			// If both ch and stream.cw were ready (as might
  4584			// happen on the final Write after an http.Handler
  4585			// ends), prefer the write result. Otherwise this
  4586			// might just be us successfully closing the stream.
  4587			// The writeFrameAsync and serve goroutines guarantee
  4588			// that the ch send will happen before the stream.cw
  4589			// close.
  4590			select {
  4591			case err = <-ch:
  4592				frameWriteDone = true
  4593			default:
  4594				return http2errStreamClosed
  4595			}
  4596		}
  4597		http2errChanPool.Put(ch)
  4598		if frameWriteDone {
  4599			http2writeDataPool.Put(writeArg)
  4600		}
  4601		return err
  4602	}
  4603	
  4604	// writeFrameFromHandler sends wr to sc.wantWriteFrameCh, but aborts
  4605	// if the connection has gone away.
  4606	//
  4607	// This must not be run from the serve goroutine itself, else it might
  4608	// deadlock writing to sc.wantWriteFrameCh (which is only mildly
  4609	// buffered and is read by serve itself). If you're on the serve
  4610	// goroutine, call writeFrame instead.
  4611	func (sc *http2serverConn) writeFrameFromHandler(wr http2FrameWriteRequest) error {
  4612		sc.serveG.checkNotOn() // NOT
  4613		select {
  4614		case sc.wantWriteFrameCh <- wr:
  4615			return nil
  4616		case <-sc.doneServing:
  4617			// Serve loop is gone.
  4618			// Client has closed their connection to the server.
  4619			return http2errClientDisconnected
  4620		}
  4621	}
  4622	
  4623	// writeFrame schedules a frame to write and sends it if there's nothing
  4624	// already being written.
  4625	//
  4626	// There is no pushback here (the serve goroutine never blocks). It's
  4627	// the http.Handlers that block, waiting for their previous frames to
  4628	// make it onto the wire
  4629	//
  4630	// If you're not on the serve goroutine, use writeFrameFromHandler instead.
  4631	func (sc *http2serverConn) writeFrame(wr http2FrameWriteRequest) {
  4632		sc.serveG.check()
  4633	
  4634		// If true, wr will not be written and wr.done will not be signaled.
  4635		var ignoreWrite bool
  4636	
  4637		// We are not allowed to write frames on closed streams. RFC 7540 Section
  4638		// 5.1.1 says: "An endpoint MUST NOT send frames other than PRIORITY on
  4639		// a closed stream." Our server never sends PRIORITY, so that exception
  4640		// does not apply.
  4641		//
  4642		// The serverConn might close an open stream while the stream's handler
  4643		// is still running. For example, the server might close a stream when it
  4644		// receives bad data from the client. If this happens, the handler might
  4645		// attempt to write a frame after the stream has been closed (since the
  4646		// handler hasn't yet been notified of the close). In this case, we simply
  4647		// ignore the frame. The handler will notice that the stream is closed when
  4648		// it waits for the frame to be written.
  4649		//
  4650		// As an exception to this rule, we allow sending RST_STREAM after close.
  4651		// This allows us to immediately reject new streams without tracking any
  4652		// state for those streams (except for the queued RST_STREAM frame). This
  4653		// may result in duplicate RST_STREAMs in some cases, but the client should
  4654		// ignore those.
  4655		if wr.StreamID() != 0 {
  4656			_, isReset := wr.write.(http2StreamError)
  4657			if state, _ := sc.state(wr.StreamID()); state == http2stateClosed && !isReset {
  4658				ignoreWrite = true
  4659			}
  4660		}
  4661	
  4662		// Don't send a 100-continue response if we've already sent headers.
  4663		// See golang.org/issue/14030.
  4664		switch wr.write.(type) {
  4665		case *http2writeResHeaders:
  4666			wr.stream.wroteHeaders = true
  4667		case http2write100ContinueHeadersFrame:
  4668			if wr.stream.wroteHeaders {
  4669				// We do not need to notify wr.done because this frame is
  4670				// never written with wr.done != nil.
  4671				if wr.done != nil {
  4672					panic("wr.done != nil for write100ContinueHeadersFrame")
  4673				}
  4674				ignoreWrite = true
  4675			}
  4676		}
  4677	
  4678		if !ignoreWrite {
  4679			if wr.isControl() {
  4680				sc.queuedControlFrames++
  4681				// For extra safety, detect wraparounds, which should not happen,
  4682				// and pull the plug.
  4683				if sc.queuedControlFrames < 0 {
  4684					sc.conn.Close()
  4685				}
  4686			}
  4687			sc.writeSched.Push(wr)
  4688		}
  4689		sc.scheduleFrameWrite()
  4690	}
  4691	
  4692	// startFrameWrite starts a goroutine to write wr (in a separate
  4693	// goroutine since that might block on the network), and updates the
  4694	// serve goroutine's state about the world, updated from info in wr.
  4695	func (sc *http2serverConn) startFrameWrite(wr http2FrameWriteRequest) {
  4696		sc.serveG.check()
  4697		if sc.writingFrame {
  4698			panic("internal error: can only be writing one frame at a time")
  4699		}
  4700	
  4701		st := wr.stream
  4702		if st != nil {
  4703			switch st.state {
  4704			case http2stateHalfClosedLocal:
  4705				switch wr.write.(type) {
  4706				case http2StreamError, http2handlerPanicRST, http2writeWindowUpdate:
  4707					// RFC 7540 Section 5.1 allows sending RST_STREAM, PRIORITY, and WINDOW_UPDATE
  4708					// in this state. (We never send PRIORITY from the server, so that is not checked.)
  4709				default:
  4710					panic(fmt.Sprintf("internal error: attempt to send frame on a half-closed-local stream: %v", wr))
  4711				}
  4712			case http2stateClosed:
  4713				panic(fmt.Sprintf("internal error: attempt to send frame on a closed stream: %v", wr))
  4714			}
  4715		}
  4716		if wpp, ok := wr.write.(*http2writePushPromise); ok {
  4717			var err error
  4718			wpp.promisedID, err = wpp.allocatePromisedID()
  4719			if err != nil {
  4720				sc.writingFrameAsync = false
  4721				wr.replyToWriter(err)
  4722				return
  4723			}
  4724		}
  4725	
  4726		sc.writingFrame = true
  4727		sc.needsFrameFlush = true
  4728		if wr.write.staysWithinBuffer(sc.bw.Available()) {
  4729			sc.writingFrameAsync = false
  4730			err := wr.write.writeFrame(sc)
  4731			sc.wroteFrame(http2frameWriteResult{wr, err})
  4732		} else {
  4733			sc.writingFrameAsync = true
  4734			go sc.writeFrameAsync(wr)
  4735		}
  4736	}
  4737	
  4738	// errHandlerPanicked is the error given to any callers blocked in a read from
  4739	// Request.Body when the main goroutine panics. Since most handlers read in the
  4740	// main ServeHTTP goroutine, this will show up rarely.
  4741	var http2errHandlerPanicked = errors.New("http2: handler panicked")
  4742	
  4743	// wroteFrame is called on the serve goroutine with the result of
  4744	// whatever happened on writeFrameAsync.
  4745	func (sc *http2serverConn) wroteFrame(res http2frameWriteResult) {
  4746		sc.serveG.check()
  4747		if !sc.writingFrame {
  4748			panic("internal error: expected to be already writing a frame")
  4749		}
  4750		sc.writingFrame = false
  4751		sc.writingFrameAsync = false
  4752	
  4753		wr := res.wr
  4754	
  4755		if http2writeEndsStream(wr.write) {
  4756			st := wr.stream
  4757			if st == nil {
  4758				panic("internal error: expecting non-nil stream")
  4759			}
  4760			switch st.state {
  4761			case http2stateOpen:
  4762				// Here we would go to stateHalfClosedLocal in
  4763				// theory, but since our handler is done and
  4764				// the net/http package provides no mechanism
  4765				// for closing a ResponseWriter while still
  4766				// reading data (see possible TODO at top of
  4767				// this file), we go into closed state here
  4768				// anyway, after telling the peer we're
  4769				// hanging up on them. We'll transition to
  4770				// stateClosed after the RST_STREAM frame is
  4771				// written.
  4772				st.state = http2stateHalfClosedLocal
  4773				// Section 8.1: a server MAY request that the client abort
  4774				// transmission of a request without error by sending a
  4775				// RST_STREAM with an error code of NO_ERROR after sending
  4776				// a complete response.
  4777				sc.resetStream(http2streamError(st.id, http2ErrCodeNo))
  4778			case http2stateHalfClosedRemote:
  4779				sc.closeStream(st, http2errHandlerComplete)
  4780			}
  4781		} else {
  4782			switch v := wr.write.(type) {
  4783			case http2StreamError:
  4784				// st may be unknown if the RST_STREAM was generated to reject bad input.
  4785				if st, ok := sc.streams[v.StreamID]; ok {
  4786					sc.closeStream(st, v)
  4787				}
  4788			case http2handlerPanicRST:
  4789				sc.closeStream(wr.stream, http2errHandlerPanicked)
  4790			}
  4791		}
  4792	
  4793		// Reply (if requested) to unblock the ServeHTTP goroutine.
  4794		wr.replyToWriter(res.err)
  4795	
  4796		sc.scheduleFrameWrite()
  4797	}
  4798	
  4799	// scheduleFrameWrite tickles the frame writing scheduler.
  4800	//
  4801	// If a frame is already being written, nothing happens. This will be called again
  4802	// when the frame is done being written.
  4803	//
  4804	// If a frame isn't being written and we need to send one, the best frame
  4805	// to send is selected by writeSched.
  4806	//
  4807	// If a frame isn't being written and there's nothing else to send, we
  4808	// flush the write buffer.
  4809	func (sc *http2serverConn) scheduleFrameWrite() {
  4810		sc.serveG.check()
  4811		if sc.writingFrame || sc.inFrameScheduleLoop {
  4812			return
  4813		}
  4814		sc.inFrameScheduleLoop = true
  4815		for !sc.writingFrameAsync {
  4816			if sc.needToSendGoAway {
  4817				sc.needToSendGoAway = false
  4818				sc.startFrameWrite(http2FrameWriteRequest{
  4819					write: &http2writeGoAway{
  4820						maxStreamID: sc.maxClientStreamID,
  4821						code:        sc.goAwayCode,
  4822					},
  4823				})
  4824				continue
  4825			}
  4826			if sc.needToSendSettingsAck {
  4827				sc.needToSendSettingsAck = false
  4828				sc.startFrameWrite(http2FrameWriteRequest{write: http2writeSettingsAck{}})
  4829				continue
  4830			}
  4831			if !sc.inGoAway || sc.goAwayCode == http2ErrCodeNo {
  4832				if wr, ok := sc.writeSched.Pop(); ok {
  4833					if wr.isControl() {
  4834						sc.queuedControlFrames--
  4835					}
  4836					sc.startFrameWrite(wr)
  4837					continue
  4838				}
  4839			}
  4840			if sc.needsFrameFlush {
  4841				sc.startFrameWrite(http2FrameWriteRequest{write: http2flushFrameWriter{}})
  4842				sc.needsFrameFlush = false // after startFrameWrite, since it sets this true
  4843				continue
  4844			}
  4845			break
  4846		}
  4847		sc.inFrameScheduleLoop = false
  4848	}
  4849	
  4850	// startGracefulShutdown gracefully shuts down a connection. This
  4851	// sends GOAWAY with ErrCodeNo to tell the client we're gracefully
  4852	// shutting down. The connection isn't closed until all current
  4853	// streams are done.
  4854	//
  4855	// startGracefulShutdown returns immediately; it does not wait until
  4856	// the connection has shut down.
  4857	func (sc *http2serverConn) startGracefulShutdown() {
  4858		sc.serveG.checkNotOn() // NOT
  4859		sc.shutdownOnce.Do(func() { sc.sendServeMsg(http2gracefulShutdownMsg) })
  4860	}
  4861	
  4862	// After sending GOAWAY, the connection will close after goAwayTimeout.
  4863	// If we close the connection immediately after sending GOAWAY, there may
  4864	// be unsent data in our kernel receive buffer, which will cause the kernel
  4865	// to send a TCP RST on close() instead of a FIN. This RST will abort the
  4866	// connection immediately, whether or not the client had received the GOAWAY.
  4867	//
  4868	// Ideally we should delay for at least 1 RTT + epsilon so the client has
  4869	// a chance to read the GOAWAY and stop sending messages. Measuring RTT
  4870	// is hard, so we approximate with 1 second. See golang.org/issue/18701.
  4871	//
  4872	// This is a var so it can be shorter in tests, where all requests uses the
  4873	// loopback interface making the expected RTT very small.
  4874	//
  4875	// TODO: configurable?
  4876	var http2goAwayTimeout = 1 * time.Second
  4877	
  4878	func (sc *http2serverConn) startGracefulShutdownInternal() {
  4879		sc.goAway(http2ErrCodeNo)
  4880	}
  4881	
  4882	func (sc *http2serverConn) goAway(code http2ErrCode) {
  4883		sc.serveG.check()
  4884		if sc.inGoAway {
  4885			return
  4886		}
  4887		sc.inGoAway = true
  4888		sc.needToSendGoAway = true
  4889		sc.goAwayCode = code
  4890		sc.scheduleFrameWrite()
  4891	}
  4892	
  4893	func (sc *http2serverConn) shutDownIn(d time.Duration) {
  4894		sc.serveG.check()
  4895		sc.shutdownTimer = time.AfterFunc(d, sc.onShutdownTimer)
  4896	}
  4897	
  4898	func (sc *http2serverConn) resetStream(se http2StreamError) {
  4899		sc.serveG.check()
  4900		sc.writeFrame(http2FrameWriteRequest{write: se})
  4901		if st, ok := sc.streams[se.StreamID]; ok {
  4902			st.resetQueued = true
  4903		}
  4904	}
  4905	
  4906	// processFrameFromReader processes the serve loop's read from readFrameCh from the
  4907	// frame-reading goroutine.
  4908	// processFrameFromReader returns whether the connection should be kept open.
  4909	func (sc *http2serverConn) processFrameFromReader(res http2readFrameResult) bool {
  4910		sc.serveG.check()
  4911		err := res.err
  4912		if err != nil {
  4913			if err == http2ErrFrameTooLarge {
  4914				sc.goAway(http2ErrCodeFrameSize)
  4915				return true // goAway will close the loop
  4916			}
  4917			clientGone := err == io.EOF || err == io.ErrUnexpectedEOF || http2isClosedConnError(err)
  4918			if clientGone {
  4919				// TODO: could we also get into this state if
  4920				// the peer does a half close
  4921				// (e.g. CloseWrite) because they're done
  4922				// sending frames but they're still wanting
  4923				// our open replies?  Investigate.
  4924				// TODO: add CloseWrite to crypto/tls.Conn first
  4925				// so we have a way to test this? I suppose
  4926				// just for testing we could have a non-TLS mode.
  4927				return false
  4928			}
  4929		} else {
  4930			f := res.f
  4931			if http2VerboseLogs {
  4932				sc.vlogf("http2: server read frame %v", http2summarizeFrame(f))
  4933			}
  4934			err = sc.processFrame(f)
  4935			if err == nil {
  4936				return true
  4937			}
  4938		}
  4939	
  4940		switch ev := err.(type) {
  4941		case http2StreamError:
  4942			sc.resetStream(ev)
  4943			return true
  4944		case http2goAwayFlowError:
  4945			sc.goAway(http2ErrCodeFlowControl)
  4946			return true
  4947		case http2ConnectionError:
  4948			sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev)
  4949			sc.goAway(http2ErrCode(ev))
  4950			return true // goAway will handle shutdown
  4951		default:
  4952			if res.err != nil {
  4953				sc.vlogf("http2: server closing client connection; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err)
  4954			} else {
  4955				sc.logf("http2: server closing client connection: %v", err)
  4956			}
  4957			return false
  4958		}
  4959	}
  4960	
  4961	func (sc *http2serverConn) processFrame(f http2Frame) error {
  4962		sc.serveG.check()
  4963	
  4964		// First frame received must be SETTINGS.
  4965		if !sc.sawFirstSettings {
  4966			if _, ok := f.(*http2SettingsFrame); !ok {
  4967				return http2ConnectionError(http2ErrCodeProtocol)
  4968			}
  4969			sc.sawFirstSettings = true
  4970		}
  4971	
  4972		switch f := f.(type) {
  4973		case *http2SettingsFrame:
  4974			return sc.processSettings(f)
  4975		case *http2MetaHeadersFrame:
  4976			return sc.processHeaders(f)
  4977		case *http2WindowUpdateFrame:
  4978			return sc.processWindowUpdate(f)
  4979		case *http2PingFrame:
  4980			return sc.processPing(f)
  4981		case *http2DataFrame:
  4982			return sc.processData(f)
  4983		case *http2RSTStreamFrame:
  4984			return sc.processResetStream(f)
  4985		case *http2PriorityFrame:
  4986			return sc.processPriority(f)
  4987		case *http2GoAwayFrame:
  4988			return sc.processGoAway(f)
  4989		case *http2PushPromiseFrame:
  4990			// A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE
  4991			// frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
  4992			return http2ConnectionError(http2ErrCodeProtocol)
  4993		default:
  4994			sc.vlogf("http2: server ignoring frame: %v", f.Header())
  4995			return nil
  4996		}
  4997	}
  4998	
  4999	func (sc *http2serverConn) processPing(f *http2PingFrame) error {
  5000		sc.serveG.check()
  5001		if f.IsAck() {
  5002			// 6.7 PING: " An endpoint MUST NOT respond to PING frames
  5003			// containing this flag."
  5004			return nil
  5005		}
  5006		if f.StreamID != 0 {
  5007			// "PING frames are not associated with any individual
  5008			// stream. If a PING frame is received with a stream
  5009			// identifier field value other than 0x0, the recipient MUST
  5010			// respond with a connection error (Section 5.4.1) of type
  5011			// PROTOCOL_ERROR."
  5012			return http2ConnectionError(http2ErrCodeProtocol)
  5013		}
  5014		if sc.inGoAway && sc.goAwayCode != http2ErrCodeNo {
  5015			return nil
  5016		}
  5017		sc.writeFrame(http2FrameWriteRequest{write: http2writePingAck{f}})
  5018		return nil
  5019	}
  5020	
  5021	func (sc *http2serverConn) processWindowUpdate(f *http2WindowUpdateFrame) error {
  5022		sc.serveG.check()
  5023		switch {
  5024		case f.StreamID != 0: // stream-level flow control
  5025			state, st := sc.state(f.StreamID)
  5026			if state == http2stateIdle {
  5027				// Section 5.1: "Receiving any frame other than HEADERS
  5028				// or PRIORITY on a stream in this state MUST be
  5029				// treated as a connection error (Section 5.4.1) of
  5030				// type PROTOCOL_ERROR."
  5031				return http2ConnectionError(http2ErrCodeProtocol)
  5032			}
  5033			if st == nil {
  5034				// "WINDOW_UPDATE can be sent by a peer that has sent a
  5035				// frame bearing the END_STREAM flag. This means that a
  5036				// receiver could receive a WINDOW_UPDATE frame on a "half
  5037				// closed (remote)" or "closed" stream. A receiver MUST
  5038				// NOT treat this as an error, see Section 5.1."
  5039				return nil
  5040			}
  5041			if !st.flow.add(int32(f.Increment)) {
  5042				return http2streamError(f.StreamID, http2ErrCodeFlowControl)
  5043			}
  5044		default: // connection-level flow control
  5045			if !sc.flow.add(int32(f.Increment)) {
  5046				return http2goAwayFlowError{}
  5047			}
  5048		}
  5049		sc.scheduleFrameWrite()
  5050		return nil
  5051	}
  5052	
  5053	func (sc *http2serverConn) processResetStream(f *http2RSTStreamFrame) error {
  5054		sc.serveG.check()
  5055	
  5056		state, st := sc.state(f.StreamID)
  5057		if state == http2stateIdle {
  5058			// 6.4 "RST_STREAM frames MUST NOT be sent for a
  5059			// stream in the "idle" state. If a RST_STREAM frame
  5060			// identifying an idle stream is received, the
  5061			// recipient MUST treat this as a connection error
  5062			// (Section 5.4.1) of type PROTOCOL_ERROR.
  5063			return http2ConnectionError(http2ErrCodeProtocol)
  5064		}
  5065		if st != nil {
  5066			st.cancelCtx()
  5067			sc.closeStream(st, http2streamError(f.StreamID, f.ErrCode))
  5068		}
  5069		return nil
  5070	}
  5071	
  5072	func (sc *http2serverConn) closeStream(st *http2stream, err error) {
  5073		sc.serveG.check()
  5074		if st.state == http2stateIdle || st.state == http2stateClosed {
  5075			panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state))
  5076		}
  5077		st.state = http2stateClosed
  5078		if st.writeDeadline != nil {
  5079			st.writeDeadline.Stop()
  5080		}
  5081		if st.isPushed() {
  5082			sc.curPushedStreams--
  5083		} else {
  5084			sc.curClientStreams--
  5085		}
  5086		delete(sc.streams, st.id)
  5087		if len(sc.streams) == 0 {
  5088			sc.setConnState(StateIdle)
  5089			if sc.srv.IdleTimeout != 0 {
  5090				sc.idleTimer.Reset(sc.srv.IdleTimeout)
  5091			}
  5092			if http2h1ServerKeepAlivesDisabled(sc.hs) {
  5093				sc.startGracefulShutdownInternal()
  5094			}
  5095		}
  5096		if p := st.body; p != nil {
  5097			// Return any buffered unread bytes worth of conn-level flow control.
  5098			// See golang.org/issue/16481
  5099			sc.sendWindowUpdate(nil, p.Len())
  5100	
  5101			p.CloseWithError(err)
  5102		}
  5103		st.cw.Close() // signals Handler's CloseNotifier, unblocks writes, etc
  5104		sc.writeSched.CloseStream(st.id)
  5105	}
  5106	
  5107	func (sc *http2serverConn) processSettings(f *http2SettingsFrame) error {
  5108		sc.serveG.check()
  5109		if f.IsAck() {
  5110			sc.unackedSettings--
  5111			if sc.unackedSettings < 0 {
  5112				// Why is the peer ACKing settings we never sent?
  5113				// The spec doesn't mention this case, but
  5114				// hang up on them anyway.
  5115				return http2ConnectionError(http2ErrCodeProtocol)
  5116			}
  5117			return nil
  5118		}
  5119		if f.NumSettings() > 100 || f.HasDuplicates() {
  5120			// This isn't actually in the spec, but hang up on
  5121			// suspiciously large settings frames or those with
  5122			// duplicate entries.
  5123			return http2ConnectionError(http2ErrCodeProtocol)
  5124		}
  5125		if err := f.ForeachSetting(sc.processSetting); err != nil {
  5126			return err
  5127		}
  5128		// TODO: judging by RFC 7540, Section 6.5.3 each SETTINGS frame should be
  5129		// acknowledged individually, even if multiple are received before the ACK.
  5130		sc.needToSendSettingsAck = true
  5131		sc.scheduleFrameWrite()
  5132		return nil
  5133	}
  5134	
  5135	func (sc *http2serverConn) processSetting(s http2Setting) error {
  5136		sc.serveG.check()
  5137		if err := s.Valid(); err != nil {
  5138			return err
  5139		}
  5140		if http2VerboseLogs {
  5141			sc.vlogf("http2: server processing setting %v", s)
  5142		}
  5143		switch s.ID {
  5144		case http2SettingHeaderTableSize:
  5145			sc.headerTableSize = s.Val
  5146			sc.hpackEncoder.SetMaxDynamicTableSize(s.Val)
  5147		case http2SettingEnablePush:
  5148			sc.pushEnabled = s.Val != 0
  5149		case http2SettingMaxConcurrentStreams:
  5150			sc.clientMaxStreams = s.Val
  5151		case http2SettingInitialWindowSize:
  5152			return sc.processSettingInitialWindowSize(s.Val)
  5153		case http2SettingMaxFrameSize:
  5154			sc.maxFrameSize = int32(s.Val) // the maximum valid s.Val is < 2^31
  5155		case http2SettingMaxHeaderListSize:
  5156			sc.peerMaxHeaderListSize = s.Val
  5157		default:
  5158			// Unknown setting: "An endpoint that receives a SETTINGS
  5159			// frame with any unknown or unsupported identifier MUST
  5160			// ignore that setting."
  5161			if http2VerboseLogs {
  5162				sc.vlogf("http2: server ignoring unknown setting %v", s)
  5163			}
  5164		}
  5165		return nil
  5166	}
  5167	
  5168	func (sc *http2serverConn) processSettingInitialWindowSize(val uint32) error {
  5169		sc.serveG.check()
  5170		// Note: val already validated to be within range by
  5171		// processSetting's Valid call.
  5172	
  5173		// "A SETTINGS frame can alter the initial flow control window
  5174		// size for all current streams. When the value of
  5175		// SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST
  5176		// adjust the size of all stream flow control windows that it
  5177		// maintains by the difference between the new value and the
  5178		// old value."
  5179		old := sc.initialStreamSendWindowSize
  5180		sc.initialStreamSendWindowSize = int32(val)
  5181		growth := int32(val) - old // may be negative
  5182		for _, st := range sc.streams {
  5183			if !st.flow.add(growth) {
  5184				// 6.9.2 Initial Flow Control Window Size
  5185				// "An endpoint MUST treat a change to
  5186				// SETTINGS_INITIAL_WINDOW_SIZE that causes any flow
  5187				// control window to exceed the maximum size as a
  5188				// connection error (Section 5.4.1) of type
  5189				// FLOW_CONTROL_ERROR."
  5190				return http2ConnectionError(http2ErrCodeFlowControl)
  5191			}
  5192		}
  5193		return nil
  5194	}
  5195	
  5196	func (sc *http2serverConn) processData(f *http2DataFrame) error {
  5197		sc.serveG.check()
  5198		if sc.inGoAway && sc.goAwayCode != http2ErrCodeNo {
  5199			return nil
  5200		}
  5201		data := f.Data()
  5202	
  5203		// "If a DATA frame is received whose stream is not in "open"
  5204		// or "half closed (local)" state, the recipient MUST respond
  5205		// with a stream error (Section 5.4.2) of type STREAM_CLOSED."
  5206		id := f.Header().StreamID
  5207		state, st := sc.state(id)
  5208		if id == 0 || state == http2stateIdle {
  5209			// Section 5.1: "Receiving any frame other than HEADERS
  5210			// or PRIORITY on a stream in this state MUST be
  5211			// treated as a connection error (Section 5.4.1) of
  5212			// type PROTOCOL_ERROR."
  5213			return http2ConnectionError(http2ErrCodeProtocol)
  5214		}
  5215		if st == nil || state != http2stateOpen || st.gotTrailerHeader || st.resetQueued {
  5216			// This includes sending a RST_STREAM if the stream is
  5217			// in stateHalfClosedLocal (which currently means that
  5218			// the http.Handler returned, so it's done reading &
  5219			// done writing). Try to stop the client from sending
  5220			// more DATA.
  5221	
  5222			// But still enforce their connection-level flow control,
  5223			// and return any flow control bytes since we're not going
  5224			// to consume them.
  5225			if sc.inflow.available() < int32(f.Length) {
  5226				return http2streamError(id, http2ErrCodeFlowControl)
  5227			}
  5228			// Deduct the flow control from inflow, since we're
  5229			// going to immediately add it back in
  5230			// sendWindowUpdate, which also schedules sending the
  5231			// frames.
  5232			sc.inflow.take(int32(f.Length))
  5233			sc.sendWindowUpdate(nil, int(f.Length)) // conn-level
  5234	
  5235			if st != nil && st.resetQueued {
  5236				// Already have a stream error in flight. Don't send another.
  5237				return nil
  5238			}
  5239			return http2streamError(id, http2ErrCodeStreamClosed)
  5240		}
  5241		if st.body == nil {
  5242			panic("internal error: should have a body in this state")
  5243		}
  5244	
  5245		// Sender sending more than they'd declared?
  5246		if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes {
  5247			st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes))
  5248			// RFC 7540, sec 8.1.2.6: A request or response is also malformed if the
  5249			// value of a content-length header field does not equal the sum of the
  5250			// DATA frame payload lengths that form the body.
  5251			return http2streamError(id, http2ErrCodeProtocol)
  5252		}
  5253		if f.Length > 0 {
  5254			// Check whether the client has flow control quota.
  5255			if st.inflow.available() < int32(f.Length) {
  5256				return http2streamError(id, http2ErrCodeFlowControl)
  5257			}
  5258			st.inflow.take(int32(f.Length))
  5259	
  5260			if len(data) > 0 {
  5261				wrote, err := st.body.Write(data)
  5262				if err != nil {
  5263					return http2streamError(id, http2ErrCodeStreamClosed)
  5264				}
  5265				if wrote != len(data) {
  5266					panic("internal error: bad Writer")
  5267				}
  5268				st.bodyBytes += int64(len(data))
  5269			}
  5270	
  5271			// Return any padded flow control now, since we won't
  5272			// refund it later on body reads.
  5273			if pad := int32(f.Length) - int32(len(data)); pad > 0 {
  5274				sc.sendWindowUpdate32(nil, pad)
  5275				sc.sendWindowUpdate32(st, pad)
  5276			}
  5277		}
  5278		if f.StreamEnded() {
  5279			st.endStream()
  5280		}
  5281		return nil
  5282	}
  5283	
  5284	func (sc *http2serverConn) processGoAway(f *http2GoAwayFrame) error {
  5285		sc.serveG.check()
  5286		if f.ErrCode != http2ErrCodeNo {
  5287			sc.logf("http2: received GOAWAY %+v, starting graceful shutdown", f)
  5288		} else {
  5289			sc.vlogf("http2: received GOAWAY %+v, starting graceful shutdown", f)
  5290		}
  5291		sc.startGracefulShutdownInternal()
  5292		// http://tools.ietf.org/html/rfc7540#section-6.8
  5293		// We should not create any new streams, which means we should disable push.
  5294		sc.pushEnabled = false
  5295		return nil
  5296	}
  5297	
  5298	// isPushed reports whether the stream is server-initiated.
  5299	func (st *http2stream) isPushed() bool {
  5300		return st.id%2 == 0
  5301	}
  5302	
  5303	// endStream closes a Request.Body's pipe. It is called when a DATA
  5304	// frame says a request body is over (or after trailers).
  5305	func (st *http2stream) endStream() {
  5306		sc := st.sc
  5307		sc.serveG.check()
  5308	
  5309		if st.declBodyBytes != -1 && st.declBodyBytes != st.bodyBytes {
  5310			st.body.CloseWithError(fmt.Errorf("request declared a Content-Length of %d but only wrote %d bytes",
  5311				st.declBodyBytes, st.bodyBytes))
  5312		} else {
  5313			st.body.closeWithErrorAndCode(io.EOF, st.copyTrailersToHandlerRequest)
  5314			st.body.CloseWithError(io.EOF)
  5315		}
  5316		st.state = http2stateHalfClosedRemote
  5317	}
  5318	
  5319	// copyTrailersToHandlerRequest is run in the Handler's goroutine in
  5320	// its Request.Body.Read just before it gets io.EOF.
  5321	func (st *http2stream) copyTrailersToHandlerRequest() {
  5322		for k, vv := range st.trailer {
  5323			if _, ok := st.reqTrailer[k]; ok {
  5324				// Only copy it over it was pre-declared.
  5325				st.reqTrailer[k] = vv
  5326			}
  5327		}
  5328	}
  5329	
  5330	// onWriteTimeout is run on its own goroutine (from time.AfterFunc)
  5331	// when the stream's WriteTimeout has fired.
  5332	func (st *http2stream) onWriteTimeout() {
  5333		st.sc.writeFrameFromHandler(http2FrameWriteRequest{write: http2streamError(st.id, http2ErrCodeInternal)})
  5334	}
  5335	
  5336	func (sc *http2serverConn) processHeaders(f *http2MetaHeadersFrame) error {
  5337		sc.serveG.check()
  5338		id := f.StreamID
  5339		if sc.inGoAway {
  5340			// Ignore.
  5341			return nil
  5342		}
  5343		// http://tools.ietf.org/html/rfc7540#section-5.1.1
  5344		// Streams initiated by a client MUST use odd-numbered stream
  5345		// identifiers. [...] An endpoint that receives an unexpected
  5346		// stream identifier MUST respond with a connection error
  5347		// (Section 5.4.1) of type PROTOCOL_ERROR.
  5348		if id%2 != 1 {
  5349			return http2ConnectionError(http2ErrCodeProtocol)
  5350		}
  5351		// A HEADERS frame can be used to create a new stream or
  5352		// send a trailer for an open one. If we already have a stream
  5353		// open, let it process its own HEADERS frame (trailers at this
  5354		// point, if it's valid).
  5355		if st := sc.streams[f.StreamID]; st != nil {
  5356			if st.resetQueued {
  5357				// We're sending RST_STREAM to close the stream, so don't bother
  5358				// processing this frame.
  5359				return nil
  5360			}
  5361			// RFC 7540, sec 5.1: If an endpoint receives additional frames, other than
  5362			// WINDOW_UPDATE, PRIORITY, or RST_STREAM, for a stream that is in
  5363			// this state, it MUST respond with a stream error (Section 5.4.2) of
  5364			// type STREAM_CLOSED.
  5365			if st.state == http2stateHalfClosedRemote {
  5366				return http2streamError(id, http2ErrCodeStreamClosed)
  5367			}
  5368			return st.processTrailerHeaders(f)
  5369		}
  5370	
  5371		// [...] The identifier of a newly established stream MUST be
  5372		// numerically greater than all streams that the initiating
  5373		// endpoint has opened or reserved. [...]  An endpoint that
  5374		// receives an unexpected stream identifier MUST respond with
  5375		// a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
  5376		if id <= sc.maxClientStreamID {
  5377			return http2ConnectionError(http2ErrCodeProtocol)
  5378		}
  5379		sc.maxClientStreamID = id
  5380	
  5381		if sc.idleTimer != nil {
  5382			sc.idleTimer.Stop()
  5383		}
  5384	
  5385		// http://tools.ietf.org/html/rfc7540#section-5.1.2
  5386		// [...] Endpoints MUST NOT exceed the limit set by their peer. An
  5387		// endpoint that receives a HEADERS frame that causes their
  5388		// advertised concurrent stream limit to be exceeded MUST treat
  5389		// this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR
  5390		// or REFUSED_STREAM.
  5391		if sc.curClientStreams+1 > sc.advMaxStreams {
  5392			if sc.unackedSettings == 0 {
  5393				// They should know better.
  5394				return http2streamError(id, http2ErrCodeProtocol)
  5395			}
  5396			// Assume it's a network race, where they just haven't
  5397			// received our last SETTINGS update. But actually
  5398			// this can't happen yet, because we don't yet provide
  5399			// a way for users to adjust server parameters at
  5400			// runtime.
  5401			return http2streamError(id, http2ErrCodeRefusedStream)
  5402		}
  5403	
  5404		initialState := http2stateOpen
  5405		if f.StreamEnded() {
  5406			initialState = http2stateHalfClosedRemote
  5407		}
  5408		st := sc.newStream(id, 0, initialState)
  5409	
  5410		if f.HasPriority() {
  5411			if err := http2checkPriority(f.StreamID, f.Priority); err != nil {
  5412				return err
  5413			}
  5414			sc.writeSched.AdjustStream(st.id, f.Priority)
  5415		}
  5416	
  5417		rw, req, err := sc.newWriterAndRequest(st, f)
  5418		if err != nil {
  5419			return err
  5420		}
  5421		st.reqTrailer = req.Trailer
  5422		if st.reqTrailer != nil {
  5423			st.trailer = make(Header)
  5424		}
  5425		st.body = req.Body.(*http2requestBody).pipe // may be nil
  5426		st.declBodyBytes = req.ContentLength
  5427	
  5428		handler := sc.handler.ServeHTTP
  5429		if f.Truncated {
  5430			// Their header list was too long. Send a 431 error.
  5431			handler = http2handleHeaderListTooLong
  5432		} else if err := http2checkValidHTTP2RequestHeaders(req.Header); err != nil {
  5433			handler = http2new400Handler(err)
  5434		}
  5435	
  5436		// The net/http package sets the read deadline from the
  5437		// http.Server.ReadTimeout during the TLS handshake, but then
  5438		// passes the connection off to us with the deadline already
  5439		// set. Disarm it here after the request headers are read,
  5440		// similar to how the http1 server works. Here it's
  5441		// technically more like the http1 Server's ReadHeaderTimeout
  5442		// (in Go 1.8), though. That's a more sane option anyway.
  5443		if sc.hs.ReadTimeout != 0 {
  5444			sc.conn.SetReadDeadline(time.Time{})
  5445		}
  5446	
  5447		go sc.runHandler(rw, req, handler)
  5448		return nil
  5449	}
  5450	
  5451	func (st *http2stream) processTrailerHeaders(f *http2MetaHeadersFrame) error {
  5452		sc := st.sc
  5453		sc.serveG.check()
  5454		if st.gotTrailerHeader {
  5455			return http2ConnectionError(http2ErrCodeProtocol)
  5456		}
  5457		st.gotTrailerHeader = true
  5458		if !f.StreamEnded() {
  5459			return http2streamError(st.id, http2ErrCodeProtocol)
  5460		}
  5461	
  5462		if len(f.PseudoFields()) > 0 {
  5463			return http2streamError(st.id, http2ErrCodeProtocol)
  5464		}
  5465		if st.trailer != nil {
  5466			for _, hf := range f.RegularFields() {
  5467				key := sc.canonicalHeader(hf.Name)
  5468				if !httpguts.ValidTrailerHeader(key) {
  5469					// TODO: send more details to the peer somehow. But http2 has
  5470					// no way to send debug data at a stream level. Discuss with
  5471					// HTTP folk.
  5472					return http2streamError(st.id, http2ErrCodeProtocol)
  5473				}
  5474				st.trailer[key] = append(st.trailer[key], hf.Value)
  5475			}
  5476		}
  5477		st.endStream()
  5478		return nil
  5479	}
  5480	
  5481	func http2checkPriority(streamID uint32, p http2PriorityParam) error {
  5482		if streamID == p.StreamDep {
  5483			// Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat
  5484			// this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR."
  5485			// Section 5.3.3 says that a stream can depend on one of its dependencies,
  5486			// so it's only self-dependencies that are forbidden.
  5487			return http2streamError(streamID, http2ErrCodeProtocol)
  5488		}
  5489		return nil
  5490	}
  5491	
  5492	func (sc *http2serverConn) processPriority(f *http2PriorityFrame) error {
  5493		if sc.inGoAway {
  5494			return nil
  5495		}
  5496		if err := http2checkPriority(f.StreamID, f.http2PriorityParam); err != nil {
  5497			return err
  5498		}
  5499		sc.writeSched.AdjustStream(f.StreamID, f.http2PriorityParam)
  5500		return nil
  5501	}
  5502	
  5503	func (sc *http2serverConn) newStream(id, pusherID uint32, state http2streamState) *http2stream {
  5504		sc.serveG.check()
  5505		if id == 0 {
  5506			panic("internal error: cannot create stream with id 0")
  5507		}
  5508	
  5509		ctx, cancelCtx := context.WithCancel(sc.baseCtx)
  5510		st := &http2stream{
  5511			sc:        sc,
  5512			id:        id,
  5513			state:     state,
  5514			ctx:       ctx,
  5515			cancelCtx: cancelCtx,
  5516		}
  5517		st.cw.Init()
  5518		st.flow.conn = &sc.flow // link to conn-level counter
  5519		st.flow.add(sc.initialStreamSendWindowSize)
  5520		st.inflow.conn = &sc.inflow // link to conn-level counter
  5521		st.inflow.add(sc.srv.initialStreamRecvWindowSize())
  5522		if sc.hs.WriteTimeout != 0 {
  5523			st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout)
  5524		}
  5525	
  5526		sc.streams[id] = st
  5527		sc.writeSched.OpenStream(st.id, http2OpenStreamOptions{PusherID: pusherID})
  5528		if st.isPushed() {
  5529			sc.curPushedStreams++
  5530		} else {
  5531			sc.curClientStreams++
  5532		}
  5533		if sc.curOpenStreams() == 1 {
  5534			sc.setConnState(StateActive)
  5535		}
  5536	
  5537		return st
  5538	}
  5539	
  5540	func (sc *http2serverConn) newWriterAndRequest(st *http2stream, f *http2MetaHeadersFrame) (*http2responseWriter, *Request, error) {
  5541		sc.serveG.check()
  5542	
  5543		rp := http2requestParam{
  5544			method:    f.PseudoValue("method"),
  5545			scheme:    f.PseudoValue("scheme"),
  5546			authority: f.PseudoValue("authority"),
  5547			path:      f.PseudoValue("path"),
  5548		}
  5549	
  5550		isConnect := rp.method == "CONNECT"
  5551		if isConnect {
  5552			if rp.path != "" || rp.scheme != "" || rp.authority == "" {
  5553				return nil, nil, http2streamError(f.StreamID, http2ErrCodeProtocol)
  5554			}
  5555		} else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") {
  5556			// See 8.1.2.6 Malformed Requests and Responses:
  5557			//
  5558			// Malformed requests or responses that are detected
  5559			// MUST be treated as a stream error (Section 5.4.2)
  5560			// of type PROTOCOL_ERROR."
  5561			//
  5562			// 8.1.2.3 Request Pseudo-Header Fields
  5563			// "All HTTP/2 requests MUST include exactly one valid
  5564			// value for the :method, :scheme, and :path
  5565			// pseudo-header fields"
  5566			return nil, nil, http2streamError(f.StreamID, http2ErrCodeProtocol)
  5567		}
  5568	
  5569		bodyOpen := !f.StreamEnded()
  5570		if rp.method == "HEAD" && bodyOpen {
  5571			// HEAD requests can't have bodies
  5572			return nil, nil, http2streamError(f.StreamID, http2ErrCodeProtocol)
  5573		}
  5574	
  5575		rp.header = make(Header)
  5576		for _, hf := range f.RegularFields() {
  5577			rp.header.Add(sc.canonicalHeader(hf.Name), hf.Value)
  5578		}
  5579		if rp.authority == "" {
  5580			rp.authority = rp.header.Get("Host")
  5581		}
  5582	
  5583		rw, req, err := sc.newWriterAndRequestNoBody(st, rp)
  5584		if err != nil {
  5585			return nil, nil, err
  5586		}
  5587		if bodyOpen {
  5588			if vv, ok := rp.header["Content-Length"]; ok {
  5589				req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64)
  5590			} else {
  5591				req.ContentLength = -1
  5592			}
  5593			req.Body.(*http2requestBody).pipe = &http2pipe{
  5594				b: &http2dataBuffer{expected: req.ContentLength},
  5595			}
  5596		}
  5597		return rw, req, nil
  5598	}
  5599	
  5600	type http2requestParam struct {
  5601		method                  string
  5602		scheme, authority, path string
  5603		header                  Header
  5604	}
  5605	
  5606	func (sc *http2serverConn) newWriterAndRequestNoBody(st *http2stream, rp http2requestParam) (*http2responseWriter, *Request, error) {
  5607		sc.serveG.check()
  5608	
  5609		var tlsState *tls.ConnectionState // nil if not scheme https
  5610		if rp.scheme == "https" {
  5611			tlsState = sc.tlsState
  5612		}
  5613	
  5614		needsContinue := rp.header.Get("Expect") == "100-continue"
  5615		if needsContinue {
  5616			rp.header.Del("Expect")
  5617		}
  5618		// Merge Cookie headers into one "; "-delimited value.
  5619		if cookies := rp.header["Cookie"]; len(cookies) > 1 {
  5620			rp.header.Set("Cookie", strings.Join(cookies, "; "))
  5621		}
  5622	
  5623		// Setup Trailers
  5624		var trailer Header
  5625		for _, v := range rp.header["Trailer"] {
  5626			for _, key := range strings.Split(v, ",") {
  5627				key = CanonicalHeaderKey(strings.TrimSpace(key))
  5628				switch key {
  5629				case "Transfer-Encoding", "Trailer", "Content-Length":
  5630					// Bogus. (copy of http1 rules)
  5631					// Ignore.
  5632				default:
  5633					if trailer == nil {
  5634						trailer = make(Header)
  5635					}
  5636					trailer[key] = nil
  5637				}
  5638			}
  5639		}
  5640		delete(rp.header, "Trailer")
  5641	
  5642		var url_ *url.URL
  5643		var requestURI string
  5644		if rp.method == "CONNECT" {
  5645			url_ = &url.URL{Host: rp.authority}
  5646			requestURI = rp.authority // mimic HTTP/1 server behavior
  5647		} else {
  5648			var err error
  5649			url_, err = url.ParseRequestURI(rp.path)
  5650			if err != nil {
  5651				return nil, nil, http2streamError(st.id, http2ErrCodeProtocol)
  5652			}
  5653			requestURI = rp.path
  5654		}
  5655	
  5656		body := &http2requestBody{
  5657			conn:          sc,
  5658			stream:        st,
  5659			needsContinue: needsContinue,
  5660		}
  5661		req := &Request{
  5662			Method:     rp.method,
  5663			URL:        url_,
  5664			RemoteAddr: sc.remoteAddrStr,
  5665			Header:     rp.header,
  5666			RequestURI: requestURI,
  5667			Proto:      "HTTP/2.0",
  5668			ProtoMajor: 2,
  5669			ProtoMinor: 0,
  5670			TLS:        tlsState,
  5671			Host:       rp.authority,
  5672			Body:       body,
  5673			Trailer:    trailer,
  5674		}
  5675		req = req.WithContext(st.ctx)
  5676	
  5677		rws := http2responseWriterStatePool.Get().(*http2responseWriterState)
  5678		bwSave := rws.bw
  5679		*rws = http2responseWriterState{} // zero all the fields
  5680		rws.conn = sc
  5681		rws.bw = bwSave
  5682		rws.bw.Reset(http2chunkWriter{rws})
  5683		rws.stream = st
  5684		rws.req = req
  5685		rws.body = body
  5686	
  5687		rw := &http2responseWriter{rws: rws}
  5688		return rw, req, nil
  5689	}
  5690	
  5691	// Run on its own goroutine.
  5692	func (sc *http2serverConn) runHandler(rw *http2responseWriter, req *Request, handler func(ResponseWriter, *Request)) {
  5693		didPanic := true
  5694		defer func() {
  5695			rw.rws.stream.cancelCtx()
  5696			if didPanic {
  5697				e := recover()
  5698				sc.writeFrameFromHandler(http2FrameWriteRequest{
  5699					write:  http2handlerPanicRST{rw.rws.stream.id},
  5700					stream: rw.rws.stream,
  5701				})
  5702				// Same as net/http:
  5703				if e != nil && e != ErrAbortHandler {
  5704					const size = 64 << 10
  5705					buf := make([]byte, size)
  5706					buf = buf[:runtime.Stack(buf, false)]
  5707					sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf)
  5708				}
  5709				return
  5710			}
  5711			rw.handlerDone()
  5712		}()
  5713		handler(rw, req)
  5714		didPanic = false
  5715	}
  5716	
  5717	func http2handleHeaderListTooLong(w ResponseWriter, r *Request) {
  5718		// 10.5.1 Limits on Header Block Size:
  5719		// .. "A server that receives a larger header block than it is
  5720		// willing to handle can send an HTTP 431 (Request Header Fields Too
  5721		// Large) status code"
  5722		const statusRequestHeaderFieldsTooLarge = 431 // only in Go 1.6+
  5723		w.WriteHeader(statusRequestHeaderFieldsTooLarge)
  5724		io.WriteString(w, "<h1>HTTP Error 431</h1><p>Request Header Field(s) Too Large</p>")
  5725	}
  5726	
  5727	// called from handler goroutines.
  5728	// h may be nil.
  5729	func (sc *http2serverConn) writeHeaders(st *http2stream, headerData *http2writeResHeaders) error {
  5730		sc.serveG.checkNotOn() // NOT on
  5731		var errc chan error
  5732		if headerData.h != nil {
  5733			// If there's a header map (which we don't own), so we have to block on
  5734			// waiting for this frame to be written, so an http.Flush mid-handler
  5735			// writes out the correct value of keys, before a handler later potentially
  5736			// mutates it.
  5737			errc = http2errChanPool.Get().(chan error)
  5738		}
  5739		if err := sc.writeFrameFromHandler(http2FrameWriteRequest{
  5740			write:  headerData,
  5741			stream: st,
  5742			done:   errc,
  5743		}); err != nil {
  5744			return err
  5745		}
  5746		if errc != nil {
  5747			select {
  5748			case err := <-errc:
  5749				http2errChanPool.Put(errc)
  5750				return err
  5751			case <-sc.doneServing:
  5752				return http2errClientDisconnected
  5753			case <-st.cw:
  5754				return http2errStreamClosed
  5755			}
  5756		}
  5757		return nil
  5758	}
  5759	
  5760	// called from handler goroutines.
  5761	func (sc *http2serverConn) write100ContinueHeaders(st *http2stream) {
  5762		sc.writeFrameFromHandler(http2FrameWriteRequest{
  5763			write:  http2write100ContinueHeadersFrame{st.id},
  5764			stream: st,
  5765		})
  5766	}
  5767	
  5768	// A bodyReadMsg tells the server loop that the http.Handler read n
  5769	// bytes of the DATA from the client on the given stream.
  5770	type http2bodyReadMsg struct {
  5771		st *http2stream
  5772		n  int
  5773	}
  5774	
  5775	// called from handler goroutines.
  5776	// Notes that the handler for the given stream ID read n bytes of its body
  5777	// and schedules flow control tokens to be sent.
  5778	func (sc *http2serverConn) noteBodyReadFromHandler(st *http2stream, n int, err error) {
  5779		sc.serveG.checkNotOn() // NOT on
  5780		if n > 0 {
  5781			select {
  5782			case sc.bodyReadCh <- http2bodyReadMsg{st, n}:
  5783			case <-sc.doneServing:
  5784			}
  5785		}
  5786	}
  5787	
  5788	func (sc *http2serverConn) noteBodyRead(st *http2stream, n int) {
  5789		sc.serveG.check()
  5790		sc.sendWindowUpdate(nil, n) // conn-level
  5791		if st.state != http2stateHalfClosedRemote && st.state != http2stateClosed {
  5792			// Don't send this WINDOW_UPDATE if the stream is closed
  5793			// remotely.
  5794			sc.sendWindowUpdate(st, n)
  5795		}
  5796	}
  5797	
  5798	// st may be nil for conn-level
  5799	func (sc *http2serverConn) sendWindowUpdate(st *http2stream, n int) {
  5800		sc.serveG.check()
  5801		// "The legal range for the increment to the flow control
  5802		// window is 1 to 2^31-1 (2,147,483,647) octets."
  5803		// A Go Read call on 64-bit machines could in theory read
  5804		// a larger Read than this. Very unlikely, but we handle it here
  5805		// rather than elsewhere for now.
  5806		const maxUint31 = 1<<31 - 1
  5807		for n >= maxUint31 {
  5808			sc.sendWindowUpdate32(st, maxUint31)
  5809			n -= maxUint31
  5810		}
  5811		sc.sendWindowUpdate32(st, int32(n))
  5812	}
  5813	
  5814	// st may be nil for conn-level
  5815	func (sc *http2serverConn) sendWindowUpdate32(st *http2stream, n int32) {
  5816		sc.serveG.check()
  5817		if n == 0 {
  5818			return
  5819		}
  5820		if n < 0 {
  5821			panic("negative update")
  5822		}
  5823		var streamID uint32
  5824		if st != nil {
  5825			streamID = st.id
  5826		}
  5827		sc.writeFrame(http2FrameWriteRequest{
  5828			write:  http2writeWindowUpdate{streamID: streamID, n: uint32(n)},
  5829			stream: st,
  5830		})
  5831		var ok bool
  5832		if st == nil {
  5833			ok = sc.inflow.add(n)
  5834		} else {
  5835			ok = st.inflow.add(n)
  5836		}
  5837		if !ok {
  5838			panic("internal error; sent too many window updates without decrements?")
  5839		}
  5840	}
  5841	
  5842	// requestBody is the Handler's Request.Body type.
  5843	// Read and Close may be called concurrently.
  5844	type http2requestBody struct {
  5845		stream        *http2stream
  5846		conn          *http2serverConn
  5847		closed        bool       // for use by Close only
  5848		sawEOF        bool       // for use by Read only
  5849		pipe          *http2pipe // non-nil if we have a HTTP entity message body
  5850		needsContinue bool       // need to send a 100-continue
  5851	}
  5852	
  5853	func (b *http2requestBody) Close() error {
  5854		if b.pipe != nil && !b.closed {
  5855			b.pipe.BreakWithError(http2errClosedBody)
  5856		}
  5857		b.closed = true
  5858		return nil
  5859	}
  5860	
  5861	func (b *http2requestBody) Read(p []byte) (n int, err error) {
  5862		if b.needsContinue {
  5863			b.needsContinue = false
  5864			b.conn.write100ContinueHeaders(b.stream)
  5865		}
  5866		if b.pipe == nil || b.sawEOF {
  5867			return 0, io.EOF
  5868		}
  5869		n, err = b.pipe.Read(p)
  5870		if err == io.EOF {
  5871			b.sawEOF = true
  5872		}
  5873		if b.conn == nil && http2inTests {
  5874			return
  5875		}
  5876		b.conn.noteBodyReadFromHandler(b.stream, n, err)
  5877		return
  5878	}
  5879	
  5880	// responseWriter is the http.ResponseWriter implementation. It's
  5881	// intentionally small (1 pointer wide) to minimize garbage. The
  5882	// responseWriterState pointer inside is zeroed at the end of a
  5883	// request (in handlerDone) and calls on the responseWriter thereafter
  5884	// simply crash (caller's mistake), but the much larger responseWriterState
  5885	// and buffers are reused between multiple requests.
  5886	type http2responseWriter struct {
  5887		rws *http2responseWriterState
  5888	}
  5889	
  5890	// Optional http.ResponseWriter interfaces implemented.
  5891	var (
  5892		_ CloseNotifier     = (*http2responseWriter)(nil)
  5893		_ Flusher           = (*http2responseWriter)(nil)
  5894		_ http2stringWriter = (*http2responseWriter)(nil)
  5895	)
  5896	
  5897	type http2responseWriterState struct {
  5898		// immutable within a request:
  5899		stream *http2stream
  5900		req    *Request
  5901		body   *http2requestBody // to close at end of request, if DATA frames didn't
  5902		conn   *http2serverConn
  5903	
  5904		// TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc
  5905		bw *bufio.Writer // writing to a chunkWriter{this *responseWriterState}
  5906	
  5907		// mutated by http.Handler goroutine:
  5908		handlerHeader Header   // nil until called
  5909		snapHeader    Header   // snapshot of handlerHeader at WriteHeader time
  5910		trailers      []string // set in writeChunk
  5911		status        int      // status code passed to WriteHeader
  5912		wroteHeader   bool     // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet.
  5913		sentHeader    bool     // have we sent the header frame?
  5914		handlerDone   bool     // handler has finished
  5915		dirty         bool     // a Write failed; don't reuse this responseWriterState
  5916	
  5917		sentContentLen int64 // non-zero if handler set a Content-Length header
  5918		wroteBytes     int64
  5919	
  5920		closeNotifierMu sync.Mutex // guards closeNotifierCh
  5921		closeNotifierCh chan bool  // nil until first used
  5922	}
  5923	
  5924	type http2chunkWriter struct{ rws *http2responseWriterState }
  5925	
  5926	func (cw http2chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) }
  5927	
  5928	func (rws *http2responseWriterState) hasTrailers() bool { return len(rws.trailers) > 0 }
  5929	
  5930	func (rws *http2responseWriterState) hasNonemptyTrailers() bool {
  5931		for _, trailer := range rws.trailers {
  5932			if _, ok := rws.handlerHeader[trailer]; ok {
  5933				return true
  5934			}
  5935		}
  5936		return false
  5937	}
  5938	
  5939	// declareTrailer is called for each Trailer header when the
  5940	// response header is written. It notes that a header will need to be
  5941	// written in the trailers at the end of the response.
  5942	func (rws *http2responseWriterState) declareTrailer(k string) {
  5943		k = CanonicalHeaderKey(k)
  5944		if !httpguts.ValidTrailerHeader(k) {
  5945			// Forbidden by RFC 7230, section 4.1.2.
  5946			rws.conn.logf("ignoring invalid trailer %q", k)
  5947			return
  5948		}
  5949		if !http2strSliceContains(rws.trailers, k) {
  5950			rws.trailers = append(rws.trailers, k)
  5951		}
  5952	}
  5953	
  5954	// writeChunk writes chunks from the bufio.Writer. But because
  5955	// bufio.Writer may bypass its chunking, sometimes p may be
  5956	// arbitrarily large.
  5957	//
  5958	// writeChunk is also responsible (on the first chunk) for sending the
  5959	// HEADER response.
  5960	func (rws *http2responseWriterState) writeChunk(p []byte) (n int, err error) {
  5961		if !rws.wroteHeader {
  5962			rws.writeHeader(200)
  5963		}
  5964	
  5965		isHeadResp := rws.req.Method == "HEAD"
  5966		if !rws.sentHeader {
  5967			rws.sentHeader = true
  5968			var ctype, clen string
  5969			if clen = rws.snapHeader.Get("Content-Length"); clen != "" {
  5970				rws.snapHeader.Del("Content-Length")
  5971				clen64, err := strconv.ParseInt(clen, 10, 64)
  5972				if err == nil && clen64 >= 0 {
  5973					rws.sentContentLen = clen64
  5974				} else {
  5975					clen = ""
  5976				}
  5977			}
  5978			if clen == "" && rws.handlerDone && http2bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
  5979				clen = strconv.Itoa(len(p))
  5980			}
  5981			_, hasContentType := rws.snapHeader["Content-Type"]
  5982			if !hasContentType && http2bodyAllowedForStatus(rws.status) && len(p) > 0 {
  5983				ctype = DetectContentType(p)
  5984			}
  5985			var date string
  5986			if _, ok := rws.snapHeader["Date"]; !ok {
  5987				// TODO(bradfitz): be faster here, like net/http? measure.
  5988				date = time.Now().UTC().Format(TimeFormat)
  5989			}
  5990	
  5991			for _, v := range rws.snapHeader["Trailer"] {
  5992				http2foreachHeaderElement(v, rws.declareTrailer)
  5993			}
  5994	
  5995			// "Connection" headers aren't allowed in HTTP/2 (RFC 7540, 8.1.2.2),
  5996			// but respect "Connection" == "close" to mean sending a GOAWAY and tearing
  5997			// down the TCP connection when idle, like we do for HTTP/1.
  5998			// TODO: remove more Connection-specific header fields here, in addition
  5999			// to "Connection".
  6000			if _, ok := rws.snapHeader["Connection"]; ok {
  6001				v := rws.snapHeader.Get("Connection")
  6002				delete(rws.snapHeader, "Connection")
  6003				if v == "close" {
  6004					rws.conn.startGracefulShutdown()
  6005				}
  6006			}
  6007	
  6008			endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp
  6009			err = rws.conn.writeHeaders(rws.stream, &http2writeResHeaders{
  6010				streamID:      rws.stream.id,
  6011				httpResCode:   rws.status,
  6012				h:             rws.snapHeader,
  6013				endStream:     endStream,
  6014				contentType:   ctype,
  6015				contentLength: clen,
  6016				date:          date,
  6017			})
  6018			if err != nil {
  6019				rws.dirty = true
  6020				return 0, err
  6021			}
  6022			if endStream {
  6023				return 0, nil
  6024			}
  6025		}
  6026		if isHeadResp {
  6027			return len(p), nil
  6028		}
  6029		if len(p) == 0 && !rws.handlerDone {
  6030			return 0, nil
  6031		}
  6032	
  6033		if rws.handlerDone {
  6034			rws.promoteUndeclaredTrailers()
  6035		}
  6036	
  6037		// only send trailers if they have actually been defined by the
  6038		// server handler.
  6039		hasNonemptyTrailers := rws.hasNonemptyTrailers()
  6040		endStream := rws.handlerDone && !hasNonemptyTrailers
  6041		if len(p) > 0 || endStream {
  6042			// only send a 0 byte DATA frame if we're ending the stream.
  6043			if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil {
  6044				rws.dirty = true
  6045				return 0, err
  6046			}
  6047		}
  6048	
  6049		if rws.handlerDone && hasNonemptyTrailers {
  6050			err = rws.conn.writeHeaders(rws.stream, &http2writeResHeaders{
  6051				streamID:  rws.stream.id,
  6052				h:         rws.handlerHeader,
  6053				trailers:  rws.trailers,
  6054				endStream: true,
  6055			})
  6056			if err != nil {
  6057				rws.dirty = true
  6058			}
  6059			return len(p), err
  6060		}
  6061		return len(p), nil
  6062	}
  6063	
  6064	// TrailerPrefix is a magic prefix for ResponseWriter.Header map keys
  6065	// that, if present, signals that the map entry is actually for
  6066	// the response trailers, and not the response headers. The prefix
  6067	// is stripped after the ServeHTTP call finishes and the values are
  6068	// sent in the trailers.
  6069	//
  6070	// This mechanism is intended only for trailers that are not known
  6071	// prior to the headers being written. If the set of trailers is fixed
  6072	// or known before the header is written, the normal Go trailers mechanism
  6073	// is preferred:
  6074	//    https://golang.org/pkg/net/http/#ResponseWriter
  6075	//    https://golang.org/pkg/net/http/#example_ResponseWriter_trailers
  6076	const http2TrailerPrefix = "Trailer:"
  6077	
  6078	// promoteUndeclaredTrailers permits http.Handlers to set trailers
  6079	// after the header has already been flushed. Because the Go
  6080	// ResponseWriter interface has no way to set Trailers (only the
  6081	// Header), and because we didn't want to expand the ResponseWriter
  6082	// interface, and because nobody used trailers, and because RFC 7230
  6083	// says you SHOULD (but not must) predeclare any trailers in the
  6084	// header, the official ResponseWriter rules said trailers in Go must
  6085	// be predeclared, and then we reuse the same ResponseWriter.Header()
  6086	// map to mean both Headers and Trailers. When it's time to write the
  6087	// Trailers, we pick out the fields of Headers that were declared as
  6088	// trailers. That worked for a while, until we found the first major
  6089	// user of Trailers in the wild: gRPC (using them only over http2),
  6090	// and gRPC libraries permit setting trailers mid-stream without
  6091	// predeclarnig them. So: change of plans. We still permit the old
  6092	// way, but we also permit this hack: if a Header() key begins with
  6093	// "Trailer:", the suffix of that key is a Trailer. Because ':' is an
  6094	// invalid token byte anyway, there is no ambiguity. (And it's already
  6095	// filtered out) It's mildly hacky, but not terrible.
  6096	//
  6097	// This method runs after the Handler is done and promotes any Header
  6098	// fields to be trailers.
  6099	func (rws *http2responseWriterState) promoteUndeclaredTrailers() {
  6100		for k, vv := range rws.handlerHeader {
  6101			if !strings.HasPrefix(k, http2TrailerPrefix) {
  6102				continue
  6103			}
  6104			trailerKey := strings.TrimPrefix(k, http2TrailerPrefix)
  6105			rws.declareTrailer(trailerKey)
  6106			rws.handlerHeader[CanonicalHeaderKey(trailerKey)] = vv
  6107		}
  6108	
  6109		if len(rws.trailers) > 1 {
  6110			sorter := http2sorterPool.Get().(*http2sorter)
  6111			sorter.SortStrings(rws.trailers)
  6112			http2sorterPool.Put(sorter)
  6113		}
  6114	}
  6115	
  6116	func (w *http2responseWriter) Flush() {
  6117		rws := w.rws
  6118		if rws == nil {
  6119			panic("Header called after Handler finished")
  6120		}
  6121		if rws.bw.Buffered() > 0 {
  6122			if err := rws.bw.Flush(); err != nil {
  6123				// Ignore the error. The frame writer already knows.
  6124				return
  6125			}
  6126		} else {
  6127			// The bufio.Writer won't call chunkWriter.Write
  6128			// (writeChunk with zero bytes, so we have to do it
  6129			// ourselves to force the HTTP response header and/or
  6130			// final DATA frame (with END_STREAM) to be sent.
  6131			rws.writeChunk(nil)
  6132		}
  6133	}
  6134	
  6135	func (w *http2responseWriter) CloseNotify() <-chan bool {
  6136		rws := w.rws
  6137		if rws == nil {
  6138			panic("CloseNotify called after Handler finished")
  6139		}
  6140		rws.closeNotifierMu.Lock()
  6141		ch := rws.closeNotifierCh
  6142		if ch == nil {
  6143			ch = make(chan bool, 1)
  6144			rws.closeNotifierCh = ch
  6145			cw := rws.stream.cw
  6146			go func() {
  6147				cw.Wait() // wait for close
  6148				ch <- true
  6149			}()
  6150		}
  6151		rws.closeNotifierMu.Unlock()
  6152		return ch
  6153	}
  6154	
  6155	func (w *http2responseWriter) Header() Header {
  6156		rws := w.rws
  6157		if rws == nil {
  6158			panic("Header called after Handler finished")
  6159		}
  6160		if rws.handlerHeader == nil {
  6161			rws.handlerHeader = make(Header)
  6162		}
  6163		return rws.handlerHeader
  6164	}
  6165	
  6166	// checkWriteHeaderCode is a copy of net/http's checkWriteHeaderCode.
  6167	func http2checkWriteHeaderCode(code int) {
  6168		// Issue 22880: require valid WriteHeader status codes.
  6169		// For now we only enforce that it's three digits.
  6170		// In the future we might block things over 599 (600 and above aren't defined
  6171		// at http://httpwg.org/specs/rfc7231.html#status.codes)
  6172		// and we might block under 200 (once we have more mature 1xx support).
  6173		// But for now any three digits.
  6174		//
  6175		// We used to send "HTTP/1.1 000 0" on the wire in responses but there's
  6176		// no equivalent bogus thing we can realistically send in HTTP/2,
  6177		// so we'll consistently panic instead and help people find their bugs
  6178		// early. (We can't return an error from WriteHeader even if we wanted to.)
  6179		if code < 100 || code > 999 {
  6180			panic(fmt.Sprintf("invalid WriteHeader code %v", code))
  6181		}
  6182	}
  6183	
  6184	func (w *http2responseWriter) WriteHeader(code int) {
  6185		rws := w.rws
  6186		if rws == nil {
  6187			panic("WriteHeader called after Handler finished")
  6188		}
  6189		rws.writeHeader(code)
  6190	}
  6191	
  6192	func (rws *http2responseWriterState) writeHeader(code int) {
  6193		if !rws.wroteHeader {
  6194			http2checkWriteHeaderCode(code)
  6195			rws.wroteHeader = true
  6196			rws.status = code
  6197			if len(rws.handlerHeader) > 0 {
  6198				rws.snapHeader = http2cloneHeader(rws.handlerHeader)
  6199			}
  6200		}
  6201	}
  6202	
  6203	func http2cloneHeader(h Header) Header {
  6204		h2 := make(Header, len(h))
  6205		for k, vv := range h {
  6206			vv2 := make([]string, len(vv))
  6207			copy(vv2, vv)
  6208			h2[k] = vv2
  6209		}
  6210		return h2
  6211	}
  6212	
  6213	// The Life Of A Write is like this:
  6214	//
  6215	// * Handler calls w.Write or w.WriteString ->
  6216	// * -> rws.bw (*bufio.Writer) ->
  6217	// * (Handler might call Flush)
  6218	// * -> chunkWriter{rws}
  6219	// * -> responseWriterState.writeChunk(p []byte)
  6220	// * -> responseWriterState.writeChunk (most of the magic; see comment there)
  6221	func (w *http2responseWriter) Write(p []byte) (n int, err error) {
  6222		return w.write(len(p), p, "")
  6223	}
  6224	
  6225	func (w *http2responseWriter) WriteString(s string) (n int, err error) {
  6226		return w.write(len(s), nil, s)
  6227	}
  6228	
  6229	// either dataB or dataS is non-zero.
  6230	func (w *http2responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) {
  6231		rws := w.rws
  6232		if rws == nil {
  6233			panic("Write called after Handler finished")
  6234		}
  6235		if !rws.wroteHeader {
  6236			w.WriteHeader(200)
  6237		}
  6238		if !http2bodyAllowedForStatus(rws.status) {
  6239			return 0, ErrBodyNotAllowed
  6240		}
  6241		rws.wroteBytes += int64(len(dataB)) + int64(len(dataS)) // only one can be set
  6242		if rws.sentContentLen != 0 && rws.wroteBytes > rws.sentContentLen {
  6243			// TODO: send a RST_STREAM
  6244			return 0, errors.New("http2: handler wrote more than declared Content-Length")
  6245		}
  6246	
  6247		if dataB != nil {
  6248			return rws.bw.Write(dataB)
  6249		} else {
  6250			return rws.bw.WriteString(dataS)
  6251		}
  6252	}
  6253	
  6254	func (w *http2responseWriter) handlerDone() {
  6255		rws := w.rws
  6256		dirty := rws.dirty
  6257		rws.handlerDone = true
  6258		w.Flush()
  6259		w.rws = nil
  6260		if !dirty {
  6261			// Only recycle the pool if all prior Write calls to
  6262			// the serverConn goroutine completed successfully. If
  6263			// they returned earlier due to resets from the peer
  6264			// there might still be write goroutines outstanding
  6265			// from the serverConn referencing the rws memory. See
  6266			// issue 20704.
  6267			http2responseWriterStatePool.Put(rws)
  6268		}
  6269	}
  6270	
  6271	// Push errors.
  6272	var (
  6273		http2ErrRecursivePush    = errors.New("http2: recursive push not allowed")
  6274		http2ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS")
  6275	)
  6276	
  6277	var _ Pusher = (*http2responseWriter)(nil)
  6278	
  6279	func (w *http2responseWriter) Push(target string, opts *PushOptions) error {
  6280		st := w.rws.stream
  6281		sc := st.sc
  6282		sc.serveG.checkNotOn()
  6283	
  6284		// No recursive pushes: "PUSH_PROMISE frames MUST only be sent on a peer-initiated stream."
  6285		// http://tools.ietf.org/html/rfc7540#section-6.6
  6286		if st.isPushed() {
  6287			return http2ErrRecursivePush
  6288		}
  6289	
  6290		if opts == nil {
  6291			opts = new(PushOptions)
  6292		}
  6293	
  6294		// Default options.
  6295		if opts.Method == "" {
  6296			opts.Method = "GET"
  6297		}
  6298		if opts.Header == nil {
  6299			opts.Header = Header{}
  6300		}
  6301		wantScheme := "http"
  6302		if w.rws.req.TLS != nil {
  6303			wantScheme = "https"
  6304		}
  6305	
  6306		// Validate the request.
  6307		u, err := url.Parse(target)
  6308		if err != nil {
  6309			return err
  6310		}
  6311		if u.Scheme == "" {
  6312			if !strings.HasPrefix(target, "/") {
  6313				return fmt.Errorf("target must be an absolute URL or an absolute path: %q", target)
  6314			}
  6315			u.Scheme = wantScheme
  6316			u.Host = w.rws.req.Host
  6317		} else {
  6318			if u.Scheme != wantScheme {
  6319				return fmt.Errorf("cannot push URL with scheme %q from request with scheme %q", u.Scheme, wantScheme)
  6320			}
  6321			if u.Host == "" {
  6322				return errors.New("URL must have a host")
  6323			}
  6324		}
  6325		for k := range opts.Header {
  6326			if strings.HasPrefix(k, ":") {
  6327				return fmt.Errorf("promised request headers cannot include pseudo header %q", k)
  6328			}
  6329			// These headers are meaningful only if the request has a body,
  6330			// but PUSH_PROMISE requests cannot have a body.
  6331			// http://tools.ietf.org/html/rfc7540#section-8.2
  6332			// Also disallow Host, since the promised URL must be absolute.
  6333			switch strings.ToLower(k) {
  6334			case "content-length", "content-encoding", "trailer", "te", "expect", "host":
  6335				return fmt.Errorf("promised request headers cannot include %q", k)
  6336			}
  6337		}
  6338		if err := http2checkValidHTTP2RequestHeaders(opts.Header); err != nil {
  6339			return err
  6340		}
  6341	
  6342		// The RFC effectively limits promised requests to GET and HEAD:
  6343		// "Promised requests MUST be cacheable [GET, HEAD, or POST], and MUST be safe [GET or HEAD]"
  6344		// http://tools.ietf.org/html/rfc7540#section-8.2
  6345		if opts.Method != "GET" && opts.Method != "HEAD" {
  6346			return fmt.Errorf("method %q must be GET or HEAD", opts.Method)
  6347		}
  6348	
  6349		msg := &http2startPushRequest{
  6350			parent: st,
  6351			method: opts.Method,
  6352			url:    u,
  6353			header: http2cloneHeader(opts.Header),
  6354			done:   http2errChanPool.Get().(chan error),
  6355		}
  6356	
  6357		select {
  6358		case <-sc.doneServing:
  6359			return http2errClientDisconnected
  6360		case <-st.cw:
  6361			return http2errStreamClosed
  6362		case sc.serveMsgCh <- msg:
  6363		}
  6364	
  6365		select {
  6366		case <-sc.doneServing:
  6367			return http2errClientDisconnected
  6368		case <-st.cw:
  6369			return http2errStreamClosed
  6370		case err := <-msg.done:
  6371			http2errChanPool.Put(msg.done)
  6372			return err
  6373		}
  6374	}
  6375	
  6376	type http2startPushRequest struct {
  6377		parent *http2stream
  6378		method string
  6379		url    *url.URL
  6380		header Header
  6381		done   chan error
  6382	}
  6383	
  6384	func (sc *http2serverConn) startPush(msg *http2startPushRequest) {
  6385		sc.serveG.check()
  6386	
  6387		// http://tools.ietf.org/html/rfc7540#section-6.6.
  6388		// PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that
  6389		// is in either the "open" or "half-closed (remote)" state.
  6390		if msg.parent.state != http2stateOpen && msg.parent.state != http2stateHalfClosedRemote {
  6391			// responseWriter.Push checks that the stream is peer-initiaed.
  6392			msg.done <- http2errStreamClosed
  6393			return
  6394		}
  6395	
  6396		// http://tools.ietf.org/html/rfc7540#section-6.6.
  6397		if !sc.pushEnabled {
  6398			msg.done <- ErrNotSupported
  6399			return
  6400		}
  6401	
  6402		// PUSH_PROMISE frames must be sent in increasing order by stream ID, so
  6403		// we allocate an ID for the promised stream lazily, when the PUSH_PROMISE
  6404		// is written. Once the ID is allocated, we start the request handler.
  6405		allocatePromisedID := func() (uint32, error) {
  6406			sc.serveG.check()
  6407	
  6408			// Check this again, just in case. Technically, we might have received
  6409			// an updated SETTINGS by the time we got around to writing this frame.
  6410			if !sc.pushEnabled {
  6411				return 0, ErrNotSupported
  6412			}
  6413			// http://tools.ietf.org/html/rfc7540#section-6.5.2.
  6414			if sc.curPushedStreams+1 > sc.clientMaxStreams {
  6415				return 0, http2ErrPushLimitReached
  6416			}
  6417	
  6418			// http://tools.ietf.org/html/rfc7540#section-5.1.1.
  6419			// Streams initiated by the server MUST use even-numbered identifiers.
  6420			// A server that is unable to establish a new stream identifier can send a GOAWAY
  6421			// frame so that the client is forced to open a new connection for new streams.
  6422			if sc.maxPushPromiseID+2 >= 1<<31 {
  6423				sc.startGracefulShutdownInternal()
  6424				return 0, http2ErrPushLimitReached
  6425			}
  6426			sc.maxPushPromiseID += 2
  6427			promisedID := sc.maxPushPromiseID
  6428	
  6429			// http://tools.ietf.org/html/rfc7540#section-8.2.
  6430			// Strictly speaking, the new stream should start in "reserved (local)", then
  6431			// transition to "half closed (remote)" after sending the initial HEADERS, but
  6432			// we start in "half closed (remote)" for simplicity.
  6433			// See further comments at the definition of stateHalfClosedRemote.
  6434			promised := sc.newStream(promisedID, msg.parent.id, http2stateHalfClosedRemote)
  6435			rw, req, err := sc.newWriterAndRequestNoBody(promised, http2requestParam{
  6436				method:    msg.method,
  6437				scheme:    msg.url.Scheme,
  6438				authority: msg.url.Host,
  6439				path:      msg.url.RequestURI(),
  6440				header:    http2cloneHeader(msg.header), // clone since handler runs concurrently with writing the PUSH_PROMISE
  6441			})
  6442			if err != nil {
  6443				// Should not happen, since we've already validated msg.url.
  6444				panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err))
  6445			}
  6446	
  6447			go sc.runHandler(rw, req, sc.handler.ServeHTTP)
  6448			return promisedID, nil
  6449		}
  6450	
  6451		sc.writeFrame(http2FrameWriteRequest{
  6452			write: &http2writePushPromise{
  6453				streamID:           msg.parent.id,
  6454				method:             msg.method,
  6455				url:                msg.url,
  6456				h:                  msg.header,
  6457				allocatePromisedID: allocatePromisedID,
  6458			},
  6459			stream: msg.parent,
  6460			done:   msg.done,
  6461		})
  6462	}
  6463	
  6464	// foreachHeaderElement splits v according to the "#rule" construction
  6465	// in RFC 7230 section 7 and calls fn for each non-empty element.
  6466	func http2foreachHeaderElement(v string, fn func(string)) {
  6467		v = textproto.TrimString(v)
  6468		if v == "" {
  6469			return
  6470		}
  6471		if !strings.Contains(v, ",") {
  6472			fn(v)
  6473			return
  6474		}
  6475		for _, f := range strings.Split(v, ",") {
  6476			if f = textproto.TrimString(f); f != "" {
  6477				fn(f)
  6478			}
  6479		}
  6480	}
  6481	
  6482	// From http://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2.2
  6483	var http2connHeaders = []string{
  6484		"Connection",
  6485		"Keep-Alive",
  6486		"Proxy-Connection",
  6487		"Transfer-Encoding",
  6488		"Upgrade",
  6489	}
  6490	
  6491	// checkValidHTTP2RequestHeaders checks whether h is a valid HTTP/2 request,
  6492	// per RFC 7540 Section 8.1.2.2.
  6493	// The returned error is reported to users.
  6494	func http2checkValidHTTP2RequestHeaders(h Header) error {
  6495		for _, k := range http2connHeaders {
  6496			if _, ok := h[k]; ok {
  6497				return fmt.Errorf("request header %q is not valid in HTTP/2", k)
  6498			}
  6499		}
  6500		te := h["Te"]
  6501		if len(te) > 0 && (len(te) > 1 || (te[0] != "trailers" && te[0] != "")) {
  6502			return errors.New(`request header "TE" may only be "trailers" in HTTP/2`)
  6503		}
  6504		return nil
  6505	}
  6506	
  6507	func http2new400Handler(err error) HandlerFunc {
  6508		return func(w ResponseWriter, r *Request) {
  6509			Error(w, err.Error(), StatusBadRequest)
  6510		}
  6511	}
  6512	
  6513	// h1ServerKeepAlivesDisabled reports whether hs has its keep-alives
  6514	// disabled. See comments on h1ServerShutdownChan above for why
  6515	// the code is written this way.
  6516	func http2h1ServerKeepAlivesDisabled(hs *Server) bool {
  6517		var x interface{} = hs
  6518		type I interface {
  6519			doKeepAlives() bool
  6520		}
  6521		if hs, ok := x.(I); ok {
  6522			return !hs.doKeepAlives()
  6523		}
  6524		return false
  6525	}
  6526	
  6527	const (
  6528		// transportDefaultConnFlow is how many connection-level flow control
  6529		// tokens we give the server at start-up, past the default 64k.
  6530		http2transportDefaultConnFlow = 1 << 30
  6531	
  6532		// transportDefaultStreamFlow is how many stream-level flow
  6533		// control tokens we announce to the peer, and how many bytes
  6534		// we buffer per stream.
  6535		http2transportDefaultStreamFlow = 4 << 20
  6536	
  6537		// transportDefaultStreamMinRefresh is the minimum number of bytes we'll send
  6538		// a stream-level WINDOW_UPDATE for at a time.
  6539		http2transportDefaultStreamMinRefresh = 4 << 10
  6540	
  6541		http2defaultUserAgent = "Go-http-client/2.0"
  6542	)
  6543	
  6544	// Transport is an HTTP/2 Transport.
  6545	//
  6546	// A Transport internally caches connections to servers. It is safe
  6547	// for concurrent use by multiple goroutines.
  6548	type http2Transport struct {
  6549		// DialTLS specifies an optional dial function for creating
  6550		// TLS connections for requests.
  6551		//
  6552		// If DialTLS is nil, tls.Dial is used.
  6553		//
  6554		// If the returned net.Conn has a ConnectionState method like tls.Conn,
  6555		// it will be used to set http.Response.TLS.
  6556		DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error)
  6557	
  6558		// TLSClientConfig specifies the TLS configuration to use with
  6559		// tls.Client. If nil, the default configuration is used.
  6560		TLSClientConfig *tls.Config
  6561	
  6562		// ConnPool optionally specifies an alternate connection pool to use.
  6563		// If nil, the default is used.
  6564		ConnPool http2ClientConnPool
  6565	
  6566		// DisableCompression, if true, prevents the Transport from
  6567		// requesting compression with an "Accept-Encoding: gzip"
  6568		// request header when the Request contains no existing
  6569		// Accept-Encoding value. If the Transport requests gzip on
  6570		// its own and gets a gzipped response, it's transparently
  6571		// decoded in the Response.Body. However, if the user
  6572		// explicitly requested gzip it is not automatically
  6573		// uncompressed.
  6574		DisableCompression bool
  6575	
  6576		// AllowHTTP, if true, permits HTTP/2 requests using the insecure,
  6577		// plain-text "http" scheme. Note that this does not enable h2c support.
  6578		AllowHTTP bool
  6579	
  6580		// MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to
  6581		// send in the initial settings frame. It is how many bytes
  6582		// of response headers are allowed. Unlike the http2 spec, zero here
  6583		// means to use a default limit (currently 10MB). If you actually
  6584		// want to advertise an ulimited value to the peer, Transport
  6585		// interprets the highest possible value here (0xffffffff or 1<<32-1)
  6586		// to mean no limit.
  6587		MaxHeaderListSize uint32
  6588	
  6589		// StrictMaxConcurrentStreams controls whether the server's
  6590		// SETTINGS_MAX_CONCURRENT_STREAMS should be respected
  6591		// globally. If false, new TCP connections are created to the
  6592		// server as needed to keep each under the per-connection
  6593		// SETTINGS_MAX_CONCURRENT_STREAMS limit. If true, the
  6594		// server's SETTINGS_MAX_CONCURRENT_STREAMS is interpreted as
  6595		// a global limit and callers of RoundTrip block when needed,
  6596		// waiting for their turn.
  6597		StrictMaxConcurrentStreams bool
  6598	
  6599		// t1, if non-nil, is the standard library Transport using
  6600		// this transport. Its settings are used (but not its
  6601		// RoundTrip method, etc).
  6602		t1 *Transport
  6603	
  6604		connPoolOnce  sync.Once
  6605		connPoolOrDef http2ClientConnPool // non-nil version of ConnPool
  6606	}
  6607	
  6608	func (t *http2Transport) maxHeaderListSize() uint32 {
  6609		if t.MaxHeaderListSize == 0 {
  6610			return 10 << 20
  6611		}
  6612		if t.MaxHeaderListSize == 0xffffffff {
  6613			return 0
  6614		}
  6615		return t.MaxHeaderListSize
  6616	}
  6617	
  6618	func (t *http2Transport) disableCompression() bool {
  6619		return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression)
  6620	}
  6621	
  6622	// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
  6623	// It returns an error if t1 has already been HTTP/2-enabled.
  6624	func http2ConfigureTransport(t1 *Transport) error {
  6625		_, err := http2configureTransport(t1)
  6626		return err
  6627	}
  6628	
  6629	func http2configureTransport(t1 *Transport) (*http2Transport, error) {
  6630		connPool := new(http2clientConnPool)
  6631		t2 := &http2Transport{
  6632			ConnPool: http2noDialClientConnPool{connPool},
  6633			t1:       t1,
  6634		}
  6635		connPool.t = t2
  6636		if err := http2registerHTTPSProtocol(t1, http2noDialH2RoundTripper{t2}); err != nil {
  6637			return nil, err
  6638		}
  6639		if t1.TLSClientConfig == nil {
  6640			t1.TLSClientConfig = new(tls.Config)
  6641		}
  6642		if !http2strSliceContains(t1.TLSClientConfig.NextProtos, "h2") {
  6643			t1.TLSClientConfig.NextProtos = append([]string{"h2"}, t1.TLSClientConfig.NextProtos...)
  6644		}
  6645		if !http2strSliceContains(t1.TLSClientConfig.NextProtos, "http/1.1") {
  6646			t1.TLSClientConfig.NextProtos = append(t1.TLSClientConfig.NextProtos, "http/1.1")
  6647		}
  6648		upgradeFn := func(authority string, c *tls.Conn) RoundTripper {
  6649			addr := http2authorityAddr("https", authority)
  6650			if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil {
  6651				go c.Close()
  6652				return http2erringRoundTripper{err}
  6653			} else if !used {
  6654				// Turns out we don't need this c.
  6655				// For example, two goroutines made requests to the same host
  6656				// at the same time, both kicking off TCP dials. (since protocol
  6657				// was unknown)
  6658				go c.Close()
  6659			}
  6660			return t2
  6661		}
  6662		if m := t1.TLSNextProto; len(m) == 0 {
  6663			t1.TLSNextProto = map[string]func(string, *tls.Conn) RoundTripper{
  6664				"h2": upgradeFn,
  6665			}
  6666		} else {
  6667			m["h2"] = upgradeFn
  6668		}
  6669		return t2, nil
  6670	}
  6671	
  6672	func (t *http2Transport) connPool() http2ClientConnPool {
  6673		t.connPoolOnce.Do(t.initConnPool)
  6674		return t.connPoolOrDef
  6675	}
  6676	
  6677	func (t *http2Transport) initConnPool() {
  6678		if t.ConnPool != nil {
  6679			t.connPoolOrDef = t.ConnPool
  6680		} else {
  6681			t.connPoolOrDef = &http2clientConnPool{t: t}
  6682		}
  6683	}
  6684	
  6685	// ClientConn is the state of a single HTTP/2 client connection to an
  6686	// HTTP/2 server.
  6687	type http2ClientConn struct {
  6688		t         *http2Transport
  6689		tconn     net.Conn             // usually *tls.Conn, except specialized impls
  6690		tlsState  *tls.ConnectionState // nil only for specialized impls
  6691		reused    uint32               // whether conn is being reused; atomic
  6692		singleUse bool                 // whether being used for a single http.Request
  6693	
  6694		// readLoop goroutine fields:
  6695		readerDone chan struct{} // closed on error
  6696		readerErr  error         // set before readerDone is closed
  6697	
  6698		idleTimeout time.Duration // or 0 for never
  6699		idleTimer   *time.Timer
  6700	
  6701		mu              sync.Mutex // guards following
  6702		cond            *sync.Cond // hold mu; broadcast on flow/closed changes
  6703		flow            http2flow  // our conn-level flow control quota (cs.flow is per stream)
  6704		inflow          http2flow  // peer's conn-level flow control
  6705		closing         bool
  6706		closed          bool
  6707		wantSettingsAck bool                          // we sent a SETTINGS frame and haven't heard back
  6708		goAway          *http2GoAwayFrame             // if non-nil, the GoAwayFrame we received
  6709		goAwayDebug     string                        // goAway frame's debug data, retained as a string
  6710		streams         map[uint32]*http2clientStream // client-initiated
  6711		nextStreamID    uint32
  6712		pendingRequests int                       // requests blocked and waiting to be sent because len(streams) == maxConcurrentStreams
  6713		pings           map[[8]byte]chan struct{} // in flight ping data to notification channel
  6714		bw              *bufio.Writer
  6715		br              *bufio.Reader
  6716		fr              *http2Framer
  6717		lastActive      time.Time
  6718		// Settings from peer: (also guarded by mu)
  6719		maxFrameSize          uint32
  6720		maxConcurrentStreams  uint32
  6721		peerMaxHeaderListSize uint64
  6722		initialWindowSize     uint32
  6723	
  6724		hbuf    bytes.Buffer // HPACK encoder writes into this
  6725		henc    *hpack.Encoder
  6726		freeBuf [][]byte
  6727	
  6728		wmu  sync.Mutex // held while writing; acquire AFTER mu if holding both
  6729		werr error      // first write error that has occurred
  6730	}
  6731	
  6732	// clientStream is the state for a single HTTP/2 stream. One of these
  6733	// is created for each Transport.RoundTrip call.
  6734	type http2clientStream struct {
  6735		cc            *http2ClientConn
  6736		req           *Request
  6737		trace         *httptrace.ClientTrace // or nil
  6738		ID            uint32
  6739		resc          chan http2resAndError
  6740		bufPipe       http2pipe // buffered pipe with the flow-controlled response payload
  6741		startedWrite  bool      // started request body write; guarded by cc.mu
  6742		requestedGzip bool
  6743		on100         func() // optional code to run if get a 100 continue response
  6744	
  6745		flow        http2flow // guarded by cc.mu
  6746		inflow      http2flow // guarded by cc.mu
  6747		bytesRemain int64     // -1 means unknown; owned by transportResponseBody.Read
  6748		readErr     error     // sticky read error; owned by transportResponseBody.Read
  6749		stopReqBody error     // if non-nil, stop writing req body; guarded by cc.mu
  6750		didReset    bool      // whether we sent a RST_STREAM to the server; guarded by cc.mu
  6751	
  6752		peerReset chan struct{} // closed on peer reset
  6753		resetErr  error         // populated before peerReset is closed
  6754	
  6755		done chan struct{} // closed when stream remove from cc.streams map; close calls guarded by cc.mu
  6756	
  6757		// owned by clientConnReadLoop:
  6758		firstByte    bool  // got the first response byte
  6759		pastHeaders  bool  // got first MetaHeadersFrame (actual headers)
  6760		pastTrailers bool  // got optional second MetaHeadersFrame (trailers)
  6761		num1xx       uint8 // number of 1xx responses seen
  6762	
  6763		trailer    Header  // accumulated trailers
  6764		resTrailer *Header // client's Response.Trailer
  6765	}
  6766	
  6767	// awaitRequestCancel waits for the user to cancel a request or for the done
  6768	// channel to be signaled. A non-nil error is returned only if the request was
  6769	// canceled.
  6770	func http2awaitRequestCancel(req *Request, done <-chan struct{}) error {
  6771		ctx := req.Context()
  6772		if req.Cancel == nil && ctx.Done() == nil {
  6773			return nil
  6774		}
  6775		select {
  6776		case <-req.Cancel:
  6777			return http2errRequestCanceled
  6778		case <-ctx.Done():
  6779			return ctx.Err()
  6780		case <-done:
  6781			return nil
  6782		}
  6783	}
  6784	
  6785	var http2got1xxFuncForTests func(int, textproto.MIMEHeader) error
  6786	
  6787	// get1xxTraceFunc returns the value of request's httptrace.ClientTrace.Got1xxResponse func,
  6788	// if any. It returns nil if not set or if the Go version is too old.
  6789	func (cs *http2clientStream) get1xxTraceFunc() func(int, textproto.MIMEHeader) error {
  6790		if fn := http2got1xxFuncForTests; fn != nil {
  6791			return fn
  6792		}
  6793		return http2traceGot1xxResponseFunc(cs.trace)
  6794	}
  6795	
  6796	// awaitRequestCancel waits for the user to cancel a request, its context to
  6797	// expire, or for the request to be done (any way it might be removed from the
  6798	// cc.streams map: peer reset, successful completion, TCP connection breakage,
  6799	// etc). If the request is canceled, then cs will be canceled and closed.
  6800	func (cs *http2clientStream) awaitRequestCancel(req *Request) {
  6801		if err := http2awaitRequestCancel(req, cs.done); err != nil {
  6802			cs.cancelStream()
  6803			cs.bufPipe.CloseWithError(err)
  6804		}
  6805	}
  6806	
  6807	func (cs *http2clientStream) cancelStream() {
  6808		cc := cs.cc
  6809		cc.mu.Lock()
  6810		didReset := cs.didReset
  6811		cs.didReset = true
  6812		cc.mu.Unlock()
  6813	
  6814		if !didReset {
  6815			cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  6816			cc.forgetStreamID(cs.ID)
  6817		}
  6818	}
  6819	
  6820	// checkResetOrDone reports any error sent in a RST_STREAM frame by the
  6821	// server, or errStreamClosed if the stream is complete.
  6822	func (cs *http2clientStream) checkResetOrDone() error {
  6823		select {
  6824		case <-cs.peerReset:
  6825			return cs.resetErr
  6826		case <-cs.done:
  6827			return http2errStreamClosed
  6828		default:
  6829			return nil
  6830		}
  6831	}
  6832	
  6833	func (cs *http2clientStream) getStartedWrite() bool {
  6834		cc := cs.cc
  6835		cc.mu.Lock()
  6836		defer cc.mu.Unlock()
  6837		return cs.startedWrite
  6838	}
  6839	
  6840	func (cs *http2clientStream) abortRequestBodyWrite(err error) {
  6841		if err == nil {
  6842			panic("nil error")
  6843		}
  6844		cc := cs.cc
  6845		cc.mu.Lock()
  6846		cs.stopReqBody = err
  6847		cc.cond.Broadcast()
  6848		cc.mu.Unlock()
  6849	}
  6850	
  6851	type http2stickyErrWriter struct {
  6852		w   io.Writer
  6853		err *error
  6854	}
  6855	
  6856	func (sew http2stickyErrWriter) Write(p []byte) (n int, err error) {
  6857		if *sew.err != nil {
  6858			return 0, *sew.err
  6859		}
  6860		n, err = sew.w.Write(p)
  6861		*sew.err = err
  6862		return
  6863	}
  6864	
  6865	// noCachedConnError is the concrete type of ErrNoCachedConn, which
  6866	// needs to be detected by net/http regardless of whether it's its
  6867	// bundled version (in h2_bundle.go with a rewritten type name) or
  6868	// from a user's x/net/http2. As such, as it has a unique method name
  6869	// (IsHTTP2NoCachedConnError) that net/http sniffs for via func
  6870	// isNoCachedConnError.
  6871	type http2noCachedConnError struct{}
  6872	
  6873	func (http2noCachedConnError) IsHTTP2NoCachedConnError() {}
  6874	
  6875	func (http2noCachedConnError) Error() string { return "http2: no cached connection was available" }
  6876	
  6877	// isNoCachedConnError reports whether err is of type noCachedConnError
  6878	// or its equivalent renamed type in net/http2's h2_bundle.go. Both types
  6879	// may coexist in the same running program.
  6880	func http2isNoCachedConnError(err error) bool {
  6881		_, ok := err.(interface{ IsHTTP2NoCachedConnError() })
  6882		return ok
  6883	}
  6884	
  6885	var http2ErrNoCachedConn error = http2noCachedConnError{}
  6886	
  6887	// RoundTripOpt are options for the Transport.RoundTripOpt method.
  6888	type http2RoundTripOpt struct {
  6889		// OnlyCachedConn controls whether RoundTripOpt may
  6890		// create a new TCP connection. If set true and
  6891		// no cached connection is available, RoundTripOpt
  6892		// will return ErrNoCachedConn.
  6893		OnlyCachedConn bool
  6894	}
  6895	
  6896	func (t *http2Transport) RoundTrip(req *Request) (*Response, error) {
  6897		return t.RoundTripOpt(req, http2RoundTripOpt{})
  6898	}
  6899	
  6900	// authorityAddr returns a given authority (a host/IP, or host:port / ip:port)
  6901	// and returns a host:port. The port 443 is added if needed.
  6902	func http2authorityAddr(scheme string, authority string) (addr string) {
  6903		host, port, err := net.SplitHostPort(authority)
  6904		if err != nil { // authority didn't have a port
  6905			port = "443"
  6906			if scheme == "http" {
  6907				port = "80"
  6908			}
  6909			host = authority
  6910		}
  6911		if a, err := idna.ToASCII(host); err == nil {
  6912			host = a
  6913		}
  6914		// IPv6 address literal, without a port:
  6915		if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") {
  6916			return host + ":" + port
  6917		}
  6918		return net.JoinHostPort(host, port)
  6919	}
  6920	
  6921	// RoundTripOpt is like RoundTrip, but takes options.
  6922	func (t *http2Transport) RoundTripOpt(req *Request, opt http2RoundTripOpt) (*Response, error) {
  6923		if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) {
  6924			return nil, errors.New("http2: unsupported scheme")
  6925		}
  6926	
  6927		addr := http2authorityAddr(req.URL.Scheme, req.URL.Host)
  6928		for retry := 0; ; retry++ {
  6929			cc, err := t.connPool().GetClientConn(req, addr)
  6930			if err != nil {
  6931				t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err)
  6932				return nil, err
  6933			}
  6934			reused := !atomic.CompareAndSwapUint32(&cc.reused, 0, 1)
  6935			http2traceGotConn(req, cc, reused)
  6936			res, gotErrAfterReqBodyWrite, err := cc.roundTrip(req)
  6937			if err != nil && retry <= 6 {
  6938				if req, err = http2shouldRetryRequest(req, err, gotErrAfterReqBodyWrite); err == nil {
  6939					// After the first retry, do exponential backoff with 10% jitter.
  6940					if retry == 0 {
  6941						continue
  6942					}
  6943					backoff := float64(uint(1) << (uint(retry) - 1))
  6944					backoff += backoff * (0.1 * mathrand.Float64())
  6945					select {
  6946					case <-time.After(time.Second * time.Duration(backoff)):
  6947						continue
  6948					case <-req.Context().Done():
  6949						return nil, req.Context().Err()
  6950					}
  6951				}
  6952			}
  6953			if err != nil {
  6954				t.vlogf("RoundTrip failure: %v", err)
  6955				return nil, err
  6956			}
  6957			return res, nil
  6958		}
  6959	}
  6960	
  6961	// CloseIdleConnections closes any connections which were previously
  6962	// connected from previous requests but are now sitting idle.
  6963	// It does not interrupt any connections currently in use.
  6964	func (t *http2Transport) CloseIdleConnections() {
  6965		if cp, ok := t.connPool().(http2clientConnPoolIdleCloser); ok {
  6966			cp.closeIdleConnections()
  6967		}
  6968	}
  6969	
  6970	var (
  6971		http2errClientConnClosed    = errors.New("http2: client conn is closed")
  6972		http2errClientConnUnusable  = errors.New("http2: client conn not usable")
  6973		http2errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY")
  6974	)
  6975	
  6976	// shouldRetryRequest is called by RoundTrip when a request fails to get
  6977	// response headers. It is always called with a non-nil error.
  6978	// It returns either a request to retry (either the same request, or a
  6979	// modified clone), or an error if the request can't be replayed.
  6980	func http2shouldRetryRequest(req *Request, err error, afterBodyWrite bool) (*Request, error) {
  6981		if !http2canRetryError(err) {
  6982			return nil, err
  6983		}
  6984		// If the Body is nil (or http.NoBody), it's safe to reuse
  6985		// this request and its Body.
  6986		if req.Body == nil || req.Body == NoBody {
  6987			return req, nil
  6988		}
  6989	
  6990		// If the request body can be reset back to its original
  6991		// state via the optional req.GetBody, do that.
  6992		if req.GetBody != nil {
  6993			// TODO: consider a req.Body.Close here? or audit that all caller paths do?
  6994			body, err := req.GetBody()
  6995			if err != nil {
  6996				return nil, err
  6997			}
  6998			newReq := *req
  6999			newReq.Body = body
  7000			return &newReq, nil
  7001		}
  7002	
  7003		// The Request.Body can't reset back to the beginning, but we
  7004		// don't seem to have started to read from it yet, so reuse
  7005		// the request directly. The "afterBodyWrite" means the
  7006		// bodyWrite process has started, which becomes true before
  7007		// the first Read.
  7008		if !afterBodyWrite {
  7009			return req, nil
  7010		}
  7011	
  7012		return nil, fmt.Errorf("http2: Transport: cannot retry err [%v] after Request.Body was written; define Request.GetBody to avoid this error", err)
  7013	}
  7014	
  7015	func http2canRetryError(err error) bool {
  7016		if err == http2errClientConnUnusable || err == http2errClientConnGotGoAway {
  7017			return true
  7018		}
  7019		if se, ok := err.(http2StreamError); ok {
  7020			return se.Code == http2ErrCodeRefusedStream
  7021		}
  7022		return false
  7023	}
  7024	
  7025	func (t *http2Transport) dialClientConn(addr string, singleUse bool) (*http2ClientConn, error) {
  7026		host, _, err := net.SplitHostPort(addr)
  7027		if err != nil {
  7028			return nil, err
  7029		}
  7030		tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host))
  7031		if err != nil {
  7032			return nil, err
  7033		}
  7034		return t.newClientConn(tconn, singleUse)
  7035	}
  7036	
  7037	func (t *http2Transport) newTLSConfig(host string) *tls.Config {
  7038		cfg := new(tls.Config)
  7039		if t.TLSClientConfig != nil {
  7040			*cfg = *t.TLSClientConfig.Clone()
  7041		}
  7042		if !http2strSliceContains(cfg.NextProtos, http2NextProtoTLS) {
  7043			cfg.NextProtos = append([]string{http2NextProtoTLS}, cfg.NextProtos...)
  7044		}
  7045		if cfg.ServerName == "" {
  7046			cfg.ServerName = host
  7047		}
  7048		return cfg
  7049	}
  7050	
  7051	func (t *http2Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) {
  7052		if t.DialTLS != nil {
  7053			return t.DialTLS
  7054		}
  7055		return t.dialTLSDefault
  7056	}
  7057	
  7058	func (t *http2Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) {
  7059		cn, err := tls.Dial(network, addr, cfg)
  7060		if err != nil {
  7061			return nil, err
  7062		}
  7063		if err := cn.Handshake(); err != nil {
  7064			return nil, err
  7065		}
  7066		if !cfg.InsecureSkipVerify {
  7067			if err := cn.VerifyHostname(cfg.ServerName); err != nil {
  7068				return nil, err
  7069			}
  7070		}
  7071		state := cn.ConnectionState()
  7072		if p := state.NegotiatedProtocol; p != http2NextProtoTLS {
  7073			return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, http2NextProtoTLS)
  7074		}
  7075		if !state.NegotiatedProtocolIsMutual {
  7076			return nil, errors.New("http2: could not negotiate protocol mutually")
  7077		}
  7078		return cn, nil
  7079	}
  7080	
  7081	// disableKeepAlives reports whether connections should be closed as
  7082	// soon as possible after handling the first request.
  7083	func (t *http2Transport) disableKeepAlives() bool {
  7084		return t.t1 != nil && t.t1.DisableKeepAlives
  7085	}
  7086	
  7087	func (t *http2Transport) expectContinueTimeout() time.Duration {
  7088		if t.t1 == nil {
  7089			return 0
  7090		}
  7091		return t.t1.ExpectContinueTimeout
  7092	}
  7093	
  7094	func (t *http2Transport) NewClientConn(c net.Conn) (*http2ClientConn, error) {
  7095		return t.newClientConn(c, false)
  7096	}
  7097	
  7098	func (t *http2Transport) newClientConn(c net.Conn, singleUse bool) (*http2ClientConn, error) {
  7099		cc := &http2ClientConn{
  7100			t:                     t,
  7101			tconn:                 c,
  7102			readerDone:            make(chan struct{}),
  7103			nextStreamID:          1,
  7104			maxFrameSize:          16 << 10,           // spec default
  7105			initialWindowSize:     65535,              // spec default
  7106			maxConcurrentStreams:  1000,               // "infinite", per spec. 1000 seems good enough.
  7107			peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead.
  7108			streams:               make(map[uint32]*http2clientStream),
  7109			singleUse:             singleUse,
  7110			wantSettingsAck:       true,
  7111			pings:                 make(map[[8]byte]chan struct{}),
  7112		}
  7113		if d := t.idleConnTimeout(); d != 0 {
  7114			cc.idleTimeout = d
  7115			cc.idleTimer = time.AfterFunc(d, cc.onIdleTimeout)
  7116		}
  7117		if http2VerboseLogs {
  7118			t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr())
  7119		}
  7120	
  7121		cc.cond = sync.NewCond(&cc.mu)
  7122		cc.flow.add(int32(http2initialWindowSize))
  7123	
  7124		// TODO: adjust this writer size to account for frame size +
  7125		// MTU + crypto/tls record padding.
  7126		cc.bw = bufio.NewWriter(http2stickyErrWriter{c, &cc.werr})
  7127		cc.br = bufio.NewReader(c)
  7128		cc.fr = http2NewFramer(cc.bw, cc.br)
  7129		cc.fr.ReadMetaHeaders = hpack.NewDecoder(http2initialHeaderTableSize, nil)
  7130		cc.fr.MaxHeaderListSize = t.maxHeaderListSize()
  7131	
  7132		// TODO: SetMaxDynamicTableSize, SetMaxDynamicTableSizeLimit on
  7133		// henc in response to SETTINGS frames?
  7134		cc.henc = hpack.NewEncoder(&cc.hbuf)
  7135	
  7136		if t.AllowHTTP {
  7137			cc.nextStreamID = 3
  7138		}
  7139	
  7140		if cs, ok := c.(http2connectionStater); ok {
  7141			state := cs.ConnectionState()
  7142			cc.tlsState = &state
  7143		}
  7144	
  7145		initialSettings := []http2Setting{
  7146			{ID: http2SettingEnablePush, Val: 0},
  7147			{ID: http2SettingInitialWindowSize, Val: http2transportDefaultStreamFlow},
  7148		}
  7149		if max := t.maxHeaderListSize(); max != 0 {
  7150			initialSettings = append(initialSettings, http2Setting{ID: http2SettingMaxHeaderListSize, Val: max})
  7151		}
  7152	
  7153		cc.bw.Write(http2clientPreface)
  7154		cc.fr.WriteSettings(initialSettings...)
  7155		cc.fr.WriteWindowUpdate(0, http2transportDefaultConnFlow)
  7156		cc.inflow.add(http2transportDefaultConnFlow + http2initialWindowSize)
  7157		cc.bw.Flush()
  7158		if cc.werr != nil {
  7159			return nil, cc.werr
  7160		}
  7161	
  7162		go cc.readLoop()
  7163		return cc, nil
  7164	}
  7165	
  7166	func (cc *http2ClientConn) setGoAway(f *http2GoAwayFrame) {
  7167		cc.mu.Lock()
  7168		defer cc.mu.Unlock()
  7169	
  7170		old := cc.goAway
  7171		cc.goAway = f
  7172	
  7173		// Merge the previous and current GoAway error frames.
  7174		if cc.goAwayDebug == "" {
  7175			cc.goAwayDebug = string(f.DebugData())
  7176		}
  7177		if old != nil && old.ErrCode != http2ErrCodeNo {
  7178			cc.goAway.ErrCode = old.ErrCode
  7179		}
  7180		last := f.LastStreamID
  7181		for streamID, cs := range cc.streams {
  7182			if streamID > last {
  7183				select {
  7184				case cs.resc <- http2resAndError{err: http2errClientConnGotGoAway}:
  7185				default:
  7186				}
  7187			}
  7188		}
  7189	}
  7190	
  7191	// CanTakeNewRequest reports whether the connection can take a new request,
  7192	// meaning it has not been closed or received or sent a GOAWAY.
  7193	func (cc *http2ClientConn) CanTakeNewRequest() bool {
  7194		cc.mu.Lock()
  7195		defer cc.mu.Unlock()
  7196		return cc.canTakeNewRequestLocked()
  7197	}
  7198	
  7199	// clientConnIdleState describes the suitability of a client
  7200	// connection to initiate a new RoundTrip request.
  7201	type http2clientConnIdleState struct {
  7202		canTakeNewRequest bool
  7203		freshConn         bool // whether it's unused by any previous request
  7204	}
  7205	
  7206	func (cc *http2ClientConn) idleState() http2clientConnIdleState {
  7207		cc.mu.Lock()
  7208		defer cc.mu.Unlock()
  7209		return cc.idleStateLocked()
  7210	}
  7211	
  7212	func (cc *http2ClientConn) idleStateLocked() (st http2clientConnIdleState) {
  7213		if cc.singleUse && cc.nextStreamID > 1 {
  7214			return
  7215		}
  7216		var maxConcurrentOkay bool
  7217		if cc.t.StrictMaxConcurrentStreams {
  7218			// We'll tell the caller we can take a new request to
  7219			// prevent the caller from dialing a new TCP
  7220			// connection, but then we'll block later before
  7221			// writing it.
  7222			maxConcurrentOkay = true
  7223		} else {
  7224			maxConcurrentOkay = int64(len(cc.streams)+1) < int64(cc.maxConcurrentStreams)
  7225		}
  7226	
  7227		st.canTakeNewRequest = cc.goAway == nil && !cc.closed && !cc.closing && maxConcurrentOkay &&
  7228			int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32
  7229		st.freshConn = cc.nextStreamID == 1 && st.canTakeNewRequest
  7230		return
  7231	}
  7232	
  7233	func (cc *http2ClientConn) canTakeNewRequestLocked() bool {
  7234		st := cc.idleStateLocked()
  7235		return st.canTakeNewRequest
  7236	}
  7237	
  7238	// onIdleTimeout is called from a time.AfterFunc goroutine. It will
  7239	// only be called when we're idle, but because we're coming from a new
  7240	// goroutine, there could be a new request coming in at the same time,
  7241	// so this simply calls the synchronized closeIfIdle to shut down this
  7242	// connection. The timer could just call closeIfIdle, but this is more
  7243	// clear.
  7244	func (cc *http2ClientConn) onIdleTimeout() {
  7245		cc.closeIfIdle()
  7246	}
  7247	
  7248	func (cc *http2ClientConn) closeIfIdle() {
  7249		cc.mu.Lock()
  7250		if len(cc.streams) > 0 {
  7251			cc.mu.Unlock()
  7252			return
  7253		}
  7254		cc.closed = true
  7255		nextID := cc.nextStreamID
  7256		// TODO: do clients send GOAWAY too? maybe? Just Close:
  7257		cc.mu.Unlock()
  7258	
  7259		if http2VerboseLogs {
  7260			cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, nextID-2)
  7261		}
  7262		cc.tconn.Close()
  7263	}
  7264	
  7265	var http2shutdownEnterWaitStateHook = func() {}
  7266	
  7267	// Shutdown gracefully close the client connection, waiting for running streams to complete.
  7268	func (cc *http2ClientConn) Shutdown(ctx context.Context) error {
  7269		if err := cc.sendGoAway(); err != nil {
  7270			return err
  7271		}
  7272		// Wait for all in-flight streams to complete or connection to close
  7273		done := make(chan error, 1)
  7274		cancelled := false // guarded by cc.mu
  7275		go func() {
  7276			cc.mu.Lock()
  7277			defer cc.mu.Unlock()
  7278			for {
  7279				if len(cc.streams) == 0 || cc.closed {
  7280					cc.closed = true
  7281					done <- cc.tconn.Close()
  7282					break
  7283				}
  7284				if cancelled {
  7285					break
  7286				}
  7287				cc.cond.Wait()
  7288			}
  7289		}()
  7290		http2shutdownEnterWaitStateHook()
  7291		select {
  7292		case err := <-done:
  7293			return err
  7294		case <-ctx.Done():
  7295			cc.mu.Lock()
  7296			// Free the goroutine above
  7297			cancelled = true
  7298			cc.cond.Broadcast()
  7299			cc.mu.Unlock()
  7300			return ctx.Err()
  7301		}
  7302	}
  7303	
  7304	func (cc *http2ClientConn) sendGoAway() error {
  7305		cc.mu.Lock()
  7306		defer cc.mu.Unlock()
  7307		cc.wmu.Lock()
  7308		defer cc.wmu.Unlock()
  7309		if cc.closing {
  7310			// GOAWAY sent already
  7311			return nil
  7312		}
  7313		// Send a graceful shutdown frame to server
  7314		maxStreamID := cc.nextStreamID
  7315		if err := cc.fr.WriteGoAway(maxStreamID, http2ErrCodeNo, nil); err != nil {
  7316			return err
  7317		}
  7318		if err := cc.bw.Flush(); err != nil {
  7319			return err
  7320		}
  7321		// Prevent new requests
  7322		cc.closing = true
  7323		return nil
  7324	}
  7325	
  7326	// Close closes the client connection immediately.
  7327	//
  7328	// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead.
  7329	func (cc *http2ClientConn) Close() error {
  7330		cc.mu.Lock()
  7331		defer cc.cond.Broadcast()
  7332		defer cc.mu.Unlock()
  7333		err := errors.New("http2: client connection force closed via ClientConn.Close")
  7334		for id, cs := range cc.streams {
  7335			select {
  7336			case cs.resc <- http2resAndError{err: err}:
  7337			default:
  7338			}
  7339			cs.bufPipe.CloseWithError(err)
  7340			delete(cc.streams, id)
  7341		}
  7342		cc.closed = true
  7343		return cc.tconn.Close()
  7344	}
  7345	
  7346	const http2maxAllocFrameSize = 512 << 10
  7347	
  7348	// frameBuffer returns a scratch buffer suitable for writing DATA frames.
  7349	// They're capped at the min of the peer's max frame size or 512KB
  7350	// (kinda arbitrarily), but definitely capped so we don't allocate 4GB
  7351	// bufers.
  7352	func (cc *http2ClientConn) frameScratchBuffer() []byte {
  7353		cc.mu.Lock()
  7354		size := cc.maxFrameSize
  7355		if size > http2maxAllocFrameSize {
  7356			size = http2maxAllocFrameSize
  7357		}
  7358		for i, buf := range cc.freeBuf {
  7359			if len(buf) >= int(size) {
  7360				cc.freeBuf[i] = nil
  7361				cc.mu.Unlock()
  7362				return buf[:size]
  7363			}
  7364		}
  7365		cc.mu.Unlock()
  7366		return make([]byte, size)
  7367	}
  7368	
  7369	func (cc *http2ClientConn) putFrameScratchBuffer(buf []byte) {
  7370		cc.mu.Lock()
  7371		defer cc.mu.Unlock()
  7372		const maxBufs = 4 // arbitrary; 4 concurrent requests per conn? investigate.
  7373		if len(cc.freeBuf) < maxBufs {
  7374			cc.freeBuf = append(cc.freeBuf, buf)
  7375			return
  7376		}
  7377		for i, old := range cc.freeBuf {
  7378			if old == nil {
  7379				cc.freeBuf[i] = buf
  7380				return
  7381			}
  7382		}
  7383		// forget about it.
  7384	}
  7385	
  7386	// errRequestCanceled is a copy of net/http's errRequestCanceled because it's not
  7387	// exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests.
  7388	var http2errRequestCanceled = errors.New("net/http: request canceled")
  7389	
  7390	func http2commaSeparatedTrailers(req *Request) (string, error) {
  7391		keys := make([]string, 0, len(req.Trailer))
  7392		for k := range req.Trailer {
  7393			k = CanonicalHeaderKey(k)
  7394			switch k {
  7395			case "Transfer-Encoding", "Trailer", "Content-Length":
  7396				return "", &http2badStringError{"invalid Trailer key", k}
  7397			}
  7398			keys = append(keys, k)
  7399		}
  7400		if len(keys) > 0 {
  7401			sort.Strings(keys)
  7402			return strings.Join(keys, ","), nil
  7403		}
  7404		return "", nil
  7405	}
  7406	
  7407	func (cc *http2ClientConn) responseHeaderTimeout() time.Duration {
  7408		if cc.t.t1 != nil {
  7409			return cc.t.t1.ResponseHeaderTimeout
  7410		}
  7411		// No way to do this (yet?) with just an http2.Transport. Probably
  7412		// no need. Request.Cancel this is the new way. We only need to support
  7413		// this for compatibility with the old http.Transport fields when
  7414		// we're doing transparent http2.
  7415		return 0
  7416	}
  7417	
  7418	// checkConnHeaders checks whether req has any invalid connection-level headers.
  7419	// per RFC 7540 section 8.1.2.2: Connection-Specific Header Fields.
  7420	// Certain headers are special-cased as okay but not transmitted later.
  7421	func http2checkConnHeaders(req *Request) error {
  7422		if v := req.Header.Get("Upgrade"); v != "" {
  7423			return fmt.Errorf("http2: invalid Upgrade request header: %q", req.Header["Upgrade"])
  7424		}
  7425		if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") {
  7426			return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv)
  7427		}
  7428		if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && !strings.EqualFold(vv[0], "close") && !strings.EqualFold(vv[0], "keep-alive")) {
  7429			return fmt.Errorf("http2: invalid Connection request header: %q", vv)
  7430		}
  7431		return nil
  7432	}
  7433	
  7434	// actualContentLength returns a sanitized version of
  7435	// req.ContentLength, where 0 actually means zero (not unknown) and -1
  7436	// means unknown.
  7437	func http2actualContentLength(req *Request) int64 {
  7438		if req.Body == nil || req.Body == NoBody {
  7439			return 0
  7440		}
  7441		if req.ContentLength != 0 {
  7442			return req.ContentLength
  7443		}
  7444		return -1
  7445	}
  7446	
  7447	func (cc *http2ClientConn) RoundTrip(req *Request) (*Response, error) {
  7448		resp, _, err := cc.roundTrip(req)
  7449		return resp, err
  7450	}
  7451	
  7452	func (cc *http2ClientConn) roundTrip(req *Request) (res *Response, gotErrAfterReqBodyWrite bool, err error) {
  7453		if err := http2checkConnHeaders(req); err != nil {
  7454			return nil, false, err
  7455		}
  7456		if cc.idleTimer != nil {
  7457			cc.idleTimer.Stop()
  7458		}
  7459	
  7460		trailers, err := http2commaSeparatedTrailers(req)
  7461		if err != nil {
  7462			return nil, false, err
  7463		}
  7464		hasTrailers := trailers != ""
  7465	
  7466		cc.mu.Lock()
  7467		if err := cc.awaitOpenSlotForRequest(req); err != nil {
  7468			cc.mu.Unlock()
  7469			return nil, false, err
  7470		}
  7471	
  7472		body := req.Body
  7473		contentLen := http2actualContentLength(req)
  7474		hasBody := contentLen != 0
  7475	
  7476		// TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere?
  7477		var requestedGzip bool
  7478		if !cc.t.disableCompression() &&
  7479			req.Header.Get("Accept-Encoding") == "" &&
  7480			req.Header.Get("Range") == "" &&
  7481			req.Method != "HEAD" {
  7482			// Request gzip only, not deflate. Deflate is ambiguous and
  7483			// not as universally supported anyway.
  7484			// See: https://zlib.net/zlib_faq.html#faq39
  7485			//
  7486			// Note that we don't request this for HEAD requests,
  7487			// due to a bug in nginx:
  7488			//   http://trac.nginx.org/nginx/ticket/358
  7489			//   https://golang.org/issue/5522
  7490			//
  7491			// We don't request gzip if the request is for a range, since
  7492			// auto-decoding a portion of a gzipped document will just fail
  7493			// anyway. See https://golang.org/issue/8923
  7494			requestedGzip = true
  7495		}
  7496	
  7497		// we send: HEADERS{1}, CONTINUATION{0,} + DATA{0,} (DATA is
  7498		// sent by writeRequestBody below, along with any Trailers,
  7499		// again in form HEADERS{1}, CONTINUATION{0,})
  7500		hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen)
  7501		if err != nil {
  7502			cc.mu.Unlock()
  7503			return nil, false, err
  7504		}
  7505	
  7506		cs := cc.newStream()
  7507		cs.req = req
  7508		cs.trace = httptrace.ContextClientTrace(req.Context())
  7509		cs.requestedGzip = requestedGzip
  7510		bodyWriter := cc.t.getBodyWriterState(cs, body)
  7511		cs.on100 = bodyWriter.on100
  7512	
  7513		cc.wmu.Lock()
  7514		endStream := !hasBody && !hasTrailers
  7515		werr := cc.writeHeaders(cs.ID, endStream, int(cc.maxFrameSize), hdrs)
  7516		cc.wmu.Unlock()
  7517		http2traceWroteHeaders(cs.trace)
  7518		cc.mu.Unlock()
  7519	
  7520		if werr != nil {
  7521			if hasBody {
  7522				req.Body.Close() // per RoundTripper contract
  7523				bodyWriter.cancel()
  7524			}
  7525			cc.forgetStreamID(cs.ID)
  7526			// Don't bother sending a RST_STREAM (our write already failed;
  7527			// no need to keep writing)
  7528			http2traceWroteRequest(cs.trace, werr)
  7529			return nil, false, werr
  7530		}
  7531	
  7532		var respHeaderTimer <-chan time.Time
  7533		if hasBody {
  7534			bodyWriter.scheduleBodyWrite()
  7535		} else {
  7536			http2traceWroteRequest(cs.trace, nil)
  7537			if d := cc.responseHeaderTimeout(); d != 0 {
  7538				timer := time.NewTimer(d)
  7539				defer timer.Stop()
  7540				respHeaderTimer = timer.C
  7541			}
  7542		}
  7543	
  7544		readLoopResCh := cs.resc
  7545		bodyWritten := false
  7546		ctx := req.Context()
  7547	
  7548		handleReadLoopResponse := func(re http2resAndError) (*Response, bool, error) {
  7549			res := re.res
  7550			if re.err != nil || res.StatusCode > 299 {
  7551				// On error or status code 3xx, 4xx, 5xx, etc abort any
  7552				// ongoing write, assuming that the server doesn't care
  7553				// about our request body. If the server replied with 1xx or
  7554				// 2xx, however, then assume the server DOES potentially
  7555				// want our body (e.g. full-duplex streaming:
  7556				// golang.org/issue/13444). If it turns out the server
  7557				// doesn't, they'll RST_STREAM us soon enough. This is a
  7558				// heuristic to avoid adding knobs to Transport. Hopefully
  7559				// we can keep it.
  7560				bodyWriter.cancel()
  7561				cs.abortRequestBodyWrite(http2errStopReqBodyWrite)
  7562			}
  7563			if re.err != nil {
  7564				cc.forgetStreamID(cs.ID)
  7565				return nil, cs.getStartedWrite(), re.err
  7566			}
  7567			res.Request = req
  7568			res.TLS = cc.tlsState
  7569			return res, false, nil
  7570		}
  7571	
  7572		for {
  7573			select {
  7574			case re := <-readLoopResCh:
  7575				return handleReadLoopResponse(re)
  7576			case <-respHeaderTimer:
  7577				if !hasBody || bodyWritten {
  7578					cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  7579				} else {
  7580					bodyWriter.cancel()
  7581					cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
  7582				}
  7583				cc.forgetStreamID(cs.ID)
  7584				return nil, cs.getStartedWrite(), http2errTimeout
  7585			case <-ctx.Done():
  7586				if !hasBody || bodyWritten {
  7587					cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  7588				} else {
  7589					bodyWriter.cancel()
  7590					cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
  7591				}
  7592				cc.forgetStreamID(cs.ID)
  7593				return nil, cs.getStartedWrite(), ctx.Err()
  7594			case <-req.Cancel:
  7595				if !hasBody || bodyWritten {
  7596					cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  7597				} else {
  7598					bodyWriter.cancel()
  7599					cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
  7600				}
  7601				cc.forgetStreamID(cs.ID)
  7602				return nil, cs.getStartedWrite(), http2errRequestCanceled
  7603			case <-cs.peerReset:
  7604				// processResetStream already removed the
  7605				// stream from the streams map; no need for
  7606				// forgetStreamID.
  7607				return nil, cs.getStartedWrite(), cs.resetErr
  7608			case err := <-bodyWriter.resc:
  7609				// Prefer the read loop's response, if available. Issue 16102.
  7610				select {
  7611				case re := <-readLoopResCh:
  7612					return handleReadLoopResponse(re)
  7613				default:
  7614				}
  7615				if err != nil {
  7616					cc.forgetStreamID(cs.ID)
  7617					return nil, cs.getStartedWrite(), err
  7618				}
  7619				bodyWritten = true
  7620				if d := cc.responseHeaderTimeout(); d != 0 {
  7621					timer := time.NewTimer(d)
  7622					defer timer.Stop()
  7623					respHeaderTimer = timer.C
  7624				}
  7625			}
  7626		}
  7627	}
  7628	
  7629	// awaitOpenSlotForRequest waits until len(streams) < maxConcurrentStreams.
  7630	// Must hold cc.mu.
  7631	func (cc *http2ClientConn) awaitOpenSlotForRequest(req *Request) error {
  7632		var waitingForConn chan struct{}
  7633		var waitingForConnErr error // guarded by cc.mu
  7634		for {
  7635			cc.lastActive = time.Now()
  7636			if cc.closed || !cc.canTakeNewRequestLocked() {
  7637				if waitingForConn != nil {
  7638					close(waitingForConn)
  7639				}
  7640				return http2errClientConnUnusable
  7641			}
  7642			if int64(len(cc.streams))+1 <= int64(cc.maxConcurrentStreams) {
  7643				if waitingForConn != nil {
  7644					close(waitingForConn)
  7645				}
  7646				return nil
  7647			}
  7648			// Unfortunately, we cannot wait on a condition variable and channel at
  7649			// the same time, so instead, we spin up a goroutine to check if the
  7650			// request is canceled while we wait for a slot to open in the connection.
  7651			if waitingForConn == nil {
  7652				waitingForConn = make(chan struct{})
  7653				go func() {
  7654					if err := http2awaitRequestCancel(req, waitingForConn); err != nil {
  7655						cc.mu.Lock()
  7656						waitingForConnErr = err
  7657						cc.cond.Broadcast()
  7658						cc.mu.Unlock()
  7659					}
  7660				}()
  7661			}
  7662			cc.pendingRequests++
  7663			cc.cond.Wait()
  7664			cc.pendingRequests--
  7665			if waitingForConnErr != nil {
  7666				return waitingForConnErr
  7667			}
  7668		}
  7669	}
  7670	
  7671	// requires cc.wmu be held
  7672	func (cc *http2ClientConn) writeHeaders(streamID uint32, endStream bool, maxFrameSize int, hdrs []byte) error {
  7673		first := true // first frame written (HEADERS is first, then CONTINUATION)
  7674		for len(hdrs) > 0 && cc.werr == nil {
  7675			chunk := hdrs
  7676			if len(chunk) > maxFrameSize {
  7677				chunk = chunk[:maxFrameSize]
  7678			}
  7679			hdrs = hdrs[len(chunk):]
  7680			endHeaders := len(hdrs) == 0
  7681			if first {
  7682				cc.fr.WriteHeaders(http2HeadersFrameParam{
  7683					StreamID:      streamID,
  7684					BlockFragment: chunk,
  7685					EndStream:     endStream,
  7686					EndHeaders:    endHeaders,
  7687				})
  7688				first = false
  7689			} else {
  7690				cc.fr.WriteContinuation(streamID, endHeaders, chunk)
  7691			}
  7692		}
  7693		// TODO(bradfitz): this Flush could potentially block (as
  7694		// could the WriteHeaders call(s) above), which means they
  7695		// wouldn't respond to Request.Cancel being readable. That's
  7696		// rare, but this should probably be in a goroutine.
  7697		cc.bw.Flush()
  7698		return cc.werr
  7699	}
  7700	
  7701	// internal error values; they don't escape to callers
  7702	var (
  7703		// abort request body write; don't send cancel
  7704		http2errStopReqBodyWrite = errors.New("http2: aborting request body write")
  7705	
  7706		// abort request body write, but send stream reset of cancel.
  7707		http2errStopReqBodyWriteAndCancel = errors.New("http2: canceling request")
  7708	)
  7709	
  7710	func (cs *http2clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) {
  7711		cc := cs.cc
  7712		sentEnd := false // whether we sent the final DATA frame w/ END_STREAM
  7713		buf := cc.frameScratchBuffer()
  7714		defer cc.putFrameScratchBuffer(buf)
  7715	
  7716		defer func() {
  7717			http2traceWroteRequest(cs.trace, err)
  7718			// TODO: write h12Compare test showing whether
  7719			// Request.Body is closed by the Transport,
  7720			// and in multiple cases: server replies <=299 and >299
  7721			// while still writing request body
  7722			cerr := bodyCloser.Close()
  7723			if err == nil {
  7724				err = cerr
  7725			}
  7726		}()
  7727	
  7728		req := cs.req
  7729		hasTrailers := req.Trailer != nil
  7730	
  7731		var sawEOF bool
  7732		for !sawEOF {
  7733			n, err := body.Read(buf)
  7734			if err == io.EOF {
  7735				sawEOF = true
  7736				err = nil
  7737			} else if err != nil {
  7738				cc.writeStreamReset(cs.ID, http2ErrCodeCancel, err)
  7739				return err
  7740			}
  7741	
  7742			remain := buf[:n]
  7743			for len(remain) > 0 && err == nil {
  7744				var allowed int32
  7745				allowed, err = cs.awaitFlowControl(len(remain))
  7746				switch {
  7747				case err == http2errStopReqBodyWrite:
  7748					return err
  7749				case err == http2errStopReqBodyWriteAndCancel:
  7750					cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  7751					return err
  7752				case err != nil:
  7753					return err
  7754				}
  7755				cc.wmu.Lock()
  7756				data := remain[:allowed]
  7757				remain = remain[allowed:]
  7758				sentEnd = sawEOF && len(remain) == 0 && !hasTrailers
  7759				err = cc.fr.WriteData(cs.ID, sentEnd, data)
  7760				if err == nil {
  7761					// TODO(bradfitz): this flush is for latency, not bandwidth.
  7762					// Most requests won't need this. Make this opt-in or
  7763					// opt-out?  Use some heuristic on the body type? Nagel-like
  7764					// timers?  Based on 'n'? Only last chunk of this for loop,
  7765					// unless flow control tokens are low? For now, always.
  7766					// If we change this, see comment below.
  7767					err = cc.bw.Flush()
  7768				}
  7769				cc.wmu.Unlock()
  7770			}
  7771			if err != nil {
  7772				return err
  7773			}
  7774		}
  7775	
  7776		if sentEnd {
  7777			// Already sent END_STREAM (which implies we have no
  7778			// trailers) and flushed, because currently all
  7779			// WriteData frames above get a flush. So we're done.
  7780			return nil
  7781		}
  7782	
  7783		var trls []byte
  7784		if hasTrailers {
  7785			cc.mu.Lock()
  7786			trls, err = cc.encodeTrailers(req)
  7787			cc.mu.Unlock()
  7788			if err != nil {
  7789				cc.writeStreamReset(cs.ID, http2ErrCodeInternal, err)
  7790				cc.forgetStreamID(cs.ID)
  7791				return err
  7792			}
  7793		}
  7794	
  7795		cc.mu.Lock()
  7796		maxFrameSize := int(cc.maxFrameSize)
  7797		cc.mu.Unlock()
  7798	
  7799		cc.wmu.Lock()
  7800		defer cc.wmu.Unlock()
  7801	
  7802		// Two ways to send END_STREAM: either with trailers, or
  7803		// with an empty DATA frame.
  7804		if len(trls) > 0 {
  7805			err = cc.writeHeaders(cs.ID, true, maxFrameSize, trls)
  7806		} else {
  7807			err = cc.fr.WriteData(cs.ID, true, nil)
  7808		}
  7809		if ferr := cc.bw.Flush(); ferr != nil && err == nil {
  7810			err = ferr
  7811		}
  7812		return err
  7813	}
  7814	
  7815	// awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow
  7816	// control tokens from the server.
  7817	// It returns either the non-zero number of tokens taken or an error
  7818	// if the stream is dead.
  7819	func (cs *http2clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) {
  7820		cc := cs.cc
  7821		cc.mu.Lock()
  7822		defer cc.mu.Unlock()
  7823		for {
  7824			if cc.closed {
  7825				return 0, http2errClientConnClosed
  7826			}
  7827			if cs.stopReqBody != nil {
  7828				return 0, cs.stopReqBody
  7829			}
  7830			if err := cs.checkResetOrDone(); err != nil {
  7831				return 0, err
  7832			}
  7833			if a := cs.flow.available(); a > 0 {
  7834				take := a
  7835				if int(take) > maxBytes {
  7836	
  7837					take = int32(maxBytes) // can't truncate int; take is int32
  7838				}
  7839				if take > int32(cc.maxFrameSize) {
  7840					take = int32(cc.maxFrameSize)
  7841				}
  7842				cs.flow.take(take)
  7843				return take, nil
  7844			}
  7845			cc.cond.Wait()
  7846		}
  7847	}
  7848	
  7849	type http2badStringError struct {
  7850		what string
  7851		str  string
  7852	}
  7853	
  7854	func (e *http2badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) }
  7855	
  7856	// requires cc.mu be held.
  7857	func (cc *http2ClientConn) encodeHeaders(req *Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) {
  7858		cc.hbuf.Reset()
  7859	
  7860		host := req.Host
  7861		if host == "" {
  7862			host = req.URL.Host
  7863		}
  7864		host, err := httpguts.PunycodeHostPort(host)
  7865		if err != nil {
  7866			return nil, err
  7867		}
  7868	
  7869		var path string
  7870		if req.Method != "CONNECT" {
  7871			path = req.URL.RequestURI()
  7872			if !http2validPseudoPath(path) {
  7873				orig := path
  7874				path = strings.TrimPrefix(path, req.URL.Scheme+"://"+host)
  7875				if !http2validPseudoPath(path) {
  7876					if req.URL.Opaque != "" {
  7877						return nil, fmt.Errorf("invalid request :path %q from URL.Opaque = %q", orig, req.URL.Opaque)
  7878					} else {
  7879						return nil, fmt.Errorf("invalid request :path %q", orig)
  7880					}
  7881				}
  7882			}
  7883		}
  7884	
  7885		// Check for any invalid headers and return an error before we
  7886		// potentially pollute our hpack state. (We want to be able to
  7887		// continue to reuse the hpack encoder for future requests)
  7888		for k, vv := range req.Header {
  7889			if !httpguts.ValidHeaderFieldName(k) {
  7890				return nil, fmt.Errorf("invalid HTTP header name %q", k)
  7891			}
  7892			for _, v := range vv {
  7893				if !httpguts.ValidHeaderFieldValue(v) {
  7894					return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k)
  7895				}
  7896			}
  7897		}
  7898	
  7899		enumerateHeaders := func(f func(name, value string)) {
  7900			// 8.1.2.3 Request Pseudo-Header Fields
  7901			// The :path pseudo-header field includes the path and query parts of the
  7902			// target URI (the path-absolute production and optionally a '?' character
  7903			// followed by the query production (see Sections 3.3 and 3.4 of
  7904			// [RFC3986]).
  7905			f(":authority", host)
  7906			m := req.Method
  7907			if m == "" {
  7908				m = MethodGet
  7909			}
  7910			f(":method", m)
  7911			if req.Method != "CONNECT" {
  7912				f(":path", path)
  7913				f(":scheme", req.URL.Scheme)
  7914			}
  7915			if trailers != "" {
  7916				f("trailer", trailers)
  7917			}
  7918	
  7919			var didUA bool
  7920			for k, vv := range req.Header {
  7921				if strings.EqualFold(k, "host") || strings.EqualFold(k, "content-length") {
  7922					// Host is :authority, already sent.
  7923					// Content-Length is automatic, set below.
  7924					continue
  7925				} else if strings.EqualFold(k, "connection") || strings.EqualFold(k, "proxy-connection") ||
  7926					strings.EqualFold(k, "transfer-encoding") || strings.EqualFold(k, "upgrade") ||
  7927					strings.EqualFold(k, "keep-alive") {
  7928					// Per 8.1.2.2 Connection-Specific Header
  7929					// Fields, don't send connection-specific
  7930					// fields. We have already checked if any
  7931					// are error-worthy so just ignore the rest.
  7932					continue
  7933				} else if strings.EqualFold(k, "user-agent") {
  7934					// Match Go's http1 behavior: at most one
  7935					// User-Agent. If set to nil or empty string,
  7936					// then omit it. Otherwise if not mentioned,
  7937					// include the default (below).
  7938					didUA = true
  7939					if len(vv) < 1 {
  7940						continue
  7941					}
  7942					vv = vv[:1]
  7943					if vv[0] == "" {
  7944						continue
  7945					}
  7946	
  7947				}
  7948	
  7949				for _, v := range vv {
  7950					f(k, v)
  7951				}
  7952			}
  7953			if http2shouldSendReqContentLength(req.Method, contentLength) {
  7954				f("content-length", strconv.FormatInt(contentLength, 10))
  7955			}
  7956			if addGzipHeader {
  7957				f("accept-encoding", "gzip")
  7958			}
  7959			if !didUA {
  7960				f("user-agent", http2defaultUserAgent)
  7961			}
  7962		}
  7963	
  7964		// Do a first pass over the headers counting bytes to ensure
  7965		// we don't exceed cc.peerMaxHeaderListSize. This is done as a
  7966		// separate pass before encoding the headers to prevent
  7967		// modifying the hpack state.
  7968		hlSize := uint64(0)
  7969		enumerateHeaders(func(name, value string) {
  7970			hf := hpack.HeaderField{Name: name, Value: value}
  7971			hlSize += uint64(hf.Size())
  7972		})
  7973	
  7974		if hlSize > cc.peerMaxHeaderListSize {
  7975			return nil, http2errRequestHeaderListSize
  7976		}
  7977	
  7978		trace := httptrace.ContextClientTrace(req.Context())
  7979		traceHeaders := http2traceHasWroteHeaderField(trace)
  7980	
  7981		// Header list size is ok. Write the headers.
  7982		enumerateHeaders(func(name, value string) {
  7983			name = strings.ToLower(name)
  7984			cc.writeHeader(name, value)
  7985			if traceHeaders {
  7986				http2traceWroteHeaderField(trace, name, value)
  7987			}
  7988		})
  7989	
  7990		return cc.hbuf.Bytes(), nil
  7991	}
  7992	
  7993	// shouldSendReqContentLength reports whether the http2.Transport should send
  7994	// a "content-length" request header. This logic is basically a copy of the net/http
  7995	// transferWriter.shouldSendContentLength.
  7996	// The contentLength is the corrected contentLength (so 0 means actually 0, not unknown).
  7997	// -1 means unknown.
  7998	func http2shouldSendReqContentLength(method string, contentLength int64) bool {
  7999		if contentLength > 0 {
  8000			return true
  8001		}
  8002		if contentLength < 0 {
  8003			return false
  8004		}
  8005		// For zero bodies, whether we send a content-length depends on the method.
  8006		// It also kinda doesn't matter for http2 either way, with END_STREAM.
  8007		switch method {
  8008		case "POST", "PUT", "PATCH":
  8009			return true
  8010		default:
  8011			return false
  8012		}
  8013	}
  8014	
  8015	// requires cc.mu be held.
  8016	func (cc *http2ClientConn) encodeTrailers(req *Request) ([]byte, error) {
  8017		cc.hbuf.Reset()
  8018	
  8019		hlSize := uint64(0)
  8020		for k, vv := range req.Trailer {
  8021			for _, v := range vv {
  8022				hf := hpack.HeaderField{Name: k, Value: v}
  8023				hlSize += uint64(hf.Size())
  8024			}
  8025		}
  8026		if hlSize > cc.peerMaxHeaderListSize {
  8027			return nil, http2errRequestHeaderListSize
  8028		}
  8029	
  8030		for k, vv := range req.Trailer {
  8031			// Transfer-Encoding, etc.. have already been filtered at the
  8032			// start of RoundTrip
  8033			lowKey := strings.ToLower(k)
  8034			for _, v := range vv {
  8035				cc.writeHeader(lowKey, v)
  8036			}
  8037		}
  8038		return cc.hbuf.Bytes(), nil
  8039	}
  8040	
  8041	func (cc *http2ClientConn) writeHeader(name, value string) {
  8042		if http2VerboseLogs {
  8043			log.Printf("http2: Transport encoding header %q = %q", name, value)
  8044		}
  8045		cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value})
  8046	}
  8047	
  8048	type http2resAndError struct {
  8049		res *Response
  8050		err error
  8051	}
  8052	
  8053	// requires cc.mu be held.
  8054	func (cc *http2ClientConn) newStream() *http2clientStream {
  8055		cs := &http2clientStream{
  8056			cc:        cc,
  8057			ID:        cc.nextStreamID,
  8058			resc:      make(chan http2resAndError, 1),
  8059			peerReset: make(chan struct{}),
  8060			done:      make(chan struct{}),
  8061		}
  8062		cs.flow.add(int32(cc.initialWindowSize))
  8063		cs.flow.setConnFlow(&cc.flow)
  8064		cs.inflow.add(http2transportDefaultStreamFlow)
  8065		cs.inflow.setConnFlow(&cc.inflow)
  8066		cc.nextStreamID += 2
  8067		cc.streams[cs.ID] = cs
  8068		return cs
  8069	}
  8070	
  8071	func (cc *http2ClientConn) forgetStreamID(id uint32) {
  8072		cc.streamByID(id, true)
  8073	}
  8074	
  8075	func (cc *http2ClientConn) streamByID(id uint32, andRemove bool) *http2clientStream {
  8076		cc.mu.Lock()
  8077		defer cc.mu.Unlock()
  8078		cs := cc.streams[id]
  8079		if andRemove && cs != nil && !cc.closed {
  8080			cc.lastActive = time.Now()
  8081			delete(cc.streams, id)
  8082			if len(cc.streams) == 0 && cc.idleTimer != nil {
  8083				cc.idleTimer.Reset(cc.idleTimeout)
  8084			}
  8085			close(cs.done)
  8086			// Wake up checkResetOrDone via clientStream.awaitFlowControl and
  8087			// wake up RoundTrip if there is a pending request.
  8088			cc.cond.Broadcast()
  8089		}
  8090		return cs
  8091	}
  8092	
  8093	// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop.
  8094	type http2clientConnReadLoop struct {
  8095		cc            *http2ClientConn
  8096		closeWhenIdle bool
  8097	}
  8098	
  8099	// readLoop runs in its own goroutine and reads and dispatches frames.
  8100	func (cc *http2ClientConn) readLoop() {
  8101		rl := &http2clientConnReadLoop{cc: cc}
  8102		defer rl.cleanup()
  8103		cc.readerErr = rl.run()
  8104		if ce, ok := cc.readerErr.(http2ConnectionError); ok {
  8105			cc.wmu.Lock()
  8106			cc.fr.WriteGoAway(0, http2ErrCode(ce), nil)
  8107			cc.wmu.Unlock()
  8108		}
  8109	}
  8110	
  8111	// GoAwayError is returned by the Transport when the server closes the
  8112	// TCP connection after sending a GOAWAY frame.
  8113	type http2GoAwayError struct {
  8114		LastStreamID uint32
  8115		ErrCode      http2ErrCode
  8116		DebugData    string
  8117	}
  8118	
  8119	func (e http2GoAwayError) Error() string {
  8120		return fmt.Sprintf("http2: server sent GOAWAY and closed the connection; LastStreamID=%v, ErrCode=%v, debug=%q",
  8121			e.LastStreamID, e.ErrCode, e.DebugData)
  8122	}
  8123	
  8124	func http2isEOFOrNetReadError(err error) bool {
  8125		if err == io.EOF {
  8126			return true
  8127		}
  8128		ne, ok := err.(*net.OpError)
  8129		return ok && ne.Op == "read"
  8130	}
  8131	
  8132	func (rl *http2clientConnReadLoop) cleanup() {
  8133		cc := rl.cc
  8134		defer cc.tconn.Close()
  8135		defer cc.t.connPool().MarkDead(cc)
  8136		defer close(cc.readerDone)
  8137	
  8138		if cc.idleTimer != nil {
  8139			cc.idleTimer.Stop()
  8140		}
  8141	
  8142		// Close any response bodies if the server closes prematurely.
  8143		// TODO: also do this if we've written the headers but not
  8144		// gotten a response yet.
  8145		err := cc.readerErr
  8146		cc.mu.Lock()
  8147		if cc.goAway != nil && http2isEOFOrNetReadError(err) {
  8148			err = http2GoAwayError{
  8149				LastStreamID: cc.goAway.LastStreamID,
  8150				ErrCode:      cc.goAway.ErrCode,
  8151				DebugData:    cc.goAwayDebug,
  8152			}
  8153		} else if err == io.EOF {
  8154			err = io.ErrUnexpectedEOF
  8155		}
  8156		for _, cs := range cc.streams {
  8157			cs.bufPipe.CloseWithError(err) // no-op if already closed
  8158			select {
  8159			case cs.resc <- http2resAndError{err: err}:
  8160			default:
  8161			}
  8162			close(cs.done)
  8163		}
  8164		cc.closed = true
  8165		cc.cond.Broadcast()
  8166		cc.mu.Unlock()
  8167	}
  8168	
  8169	func (rl *http2clientConnReadLoop) run() error {
  8170		cc := rl.cc
  8171		rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse
  8172		gotReply := false // ever saw a HEADERS reply
  8173		gotSettings := false
  8174		for {
  8175			f, err := cc.fr.ReadFrame()
  8176			if err != nil {
  8177				cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err)
  8178			}
  8179			if se, ok := err.(http2StreamError); ok {
  8180				if cs := cc.streamByID(se.StreamID, false); cs != nil {
  8181					cs.cc.writeStreamReset(cs.ID, se.Code, err)
  8182					cs.cc.forgetStreamID(cs.ID)
  8183					if se.Cause == nil {
  8184						se.Cause = cc.fr.errDetail
  8185					}
  8186					rl.endStreamError(cs, se)
  8187				}
  8188				continue
  8189			} else if err != nil {
  8190				return err
  8191			}
  8192			if http2VerboseLogs {
  8193				cc.vlogf("http2: Transport received %s", http2summarizeFrame(f))
  8194			}
  8195			if !gotSettings {
  8196				if _, ok := f.(*http2SettingsFrame); !ok {
  8197					cc.logf("protocol error: received %T before a SETTINGS frame", f)
  8198					return http2ConnectionError(http2ErrCodeProtocol)
  8199				}
  8200				gotSettings = true
  8201			}
  8202			maybeIdle := false // whether frame might transition us to idle
  8203	
  8204			switch f := f.(type) {
  8205			case *http2MetaHeadersFrame:
  8206				err = rl.processHeaders(f)
  8207				maybeIdle = true
  8208				gotReply = true
  8209			case *http2DataFrame:
  8210				err = rl.processData(f)
  8211				maybeIdle = true
  8212			case *http2GoAwayFrame:
  8213				err = rl.processGoAway(f)
  8214				maybeIdle = true
  8215			case *http2RSTStreamFrame:
  8216				err = rl.processResetStream(f)
  8217				maybeIdle = true
  8218			case *http2SettingsFrame:
  8219				err = rl.processSettings(f)
  8220			case *http2PushPromiseFrame:
  8221				err = rl.processPushPromise(f)
  8222			case *http2WindowUpdateFrame:
  8223				err = rl.processWindowUpdate(f)
  8224			case *http2PingFrame:
  8225				err = rl.processPing(f)
  8226			default:
  8227				cc.logf("Transport: unhandled response frame type %T", f)
  8228			}
  8229			if err != nil {
  8230				if http2VerboseLogs {
  8231					cc.vlogf("http2: Transport conn %p received error from processing frame %v: %v", cc, http2summarizeFrame(f), err)
  8232				}
  8233				return err
  8234			}
  8235			if rl.closeWhenIdle && gotReply && maybeIdle {
  8236				cc.closeIfIdle()
  8237			}
  8238		}
  8239	}
  8240	
  8241	func (rl *http2clientConnReadLoop) processHeaders(f *http2MetaHeadersFrame) error {
  8242		cc := rl.cc
  8243		cs := cc.streamByID(f.StreamID, false)
  8244		if cs == nil {
  8245			// We'd get here if we canceled a request while the
  8246			// server had its response still in flight. So if this
  8247			// was just something we canceled, ignore it.
  8248			return nil
  8249		}
  8250		if f.StreamEnded() {
  8251			// Issue 20521: If the stream has ended, streamByID() causes
  8252			// clientStream.done to be closed, which causes the request's bodyWriter
  8253			// to be closed with an errStreamClosed, which may be received by
  8254			// clientConn.RoundTrip before the result of processing these headers.
  8255			// Deferring stream closure allows the header processing to occur first.
  8256			// clientConn.RoundTrip may still receive the bodyWriter error first, but
  8257			// the fix for issue 16102 prioritises any response.
  8258			//
  8259			// Issue 22413: If there is no request body, we should close the
  8260			// stream before writing to cs.resc so that the stream is closed
  8261			// immediately once RoundTrip returns.
  8262			if cs.req.Body != nil {
  8263				defer cc.forgetStreamID(f.StreamID)
  8264			} else {
  8265				cc.forgetStreamID(f.StreamID)
  8266			}
  8267		}
  8268		if !cs.firstByte {
  8269			if cs.trace != nil {
  8270				// TODO(bradfitz): move first response byte earlier,
  8271				// when we first read the 9 byte header, not waiting
  8272				// until all the HEADERS+CONTINUATION frames have been
  8273				// merged. This works for now.
  8274				http2traceFirstResponseByte(cs.trace)
  8275			}
  8276			cs.firstByte = true
  8277		}
  8278		if !cs.pastHeaders {
  8279			cs.pastHeaders = true
  8280		} else {
  8281			return rl.processTrailers(cs, f)
  8282		}
  8283	
  8284		res, err := rl.handleResponse(cs, f)
  8285		if err != nil {
  8286			if _, ok := err.(http2ConnectionError); ok {
  8287				return err
  8288			}
  8289			// Any other error type is a stream error.
  8290			cs.cc.writeStreamReset(f.StreamID, http2ErrCodeProtocol, err)
  8291			cc.forgetStreamID(cs.ID)
  8292			cs.resc <- http2resAndError{err: err}
  8293			return nil // return nil from process* funcs to keep conn alive
  8294		}
  8295		if res == nil {
  8296			// (nil, nil) special case. See handleResponse docs.
  8297			return nil
  8298		}
  8299		cs.resTrailer = &res.Trailer
  8300		cs.resc <- http2resAndError{res: res}
  8301		return nil
  8302	}
  8303	
  8304	// may return error types nil, or ConnectionError. Any other error value
  8305	// is a StreamError of type ErrCodeProtocol. The returned error in that case
  8306	// is the detail.
  8307	//
  8308	// As a special case, handleResponse may return (nil, nil) to skip the
  8309	// frame (currently only used for 1xx responses).
  8310	func (rl *http2clientConnReadLoop) handleResponse(cs *http2clientStream, f *http2MetaHeadersFrame) (*Response, error) {
  8311		if f.Truncated {
  8312			return nil, http2errResponseHeaderListSize
  8313		}
  8314	
  8315		status := f.PseudoValue("status")
  8316		if status == "" {
  8317			return nil, errors.New("malformed response from server: missing status pseudo header")
  8318		}
  8319		statusCode, err := strconv.Atoi(status)
  8320		if err != nil {
  8321			return nil, errors.New("malformed response from server: malformed non-numeric status pseudo header")
  8322		}
  8323	
  8324		header := make(Header)
  8325		res := &Response{
  8326			Proto:      "HTTP/2.0",
  8327			ProtoMajor: 2,
  8328			Header:     header,
  8329			StatusCode: statusCode,
  8330			Status:     status + " " + StatusText(statusCode),
  8331		}
  8332		for _, hf := range f.RegularFields() {
  8333			key := CanonicalHeaderKey(hf.Name)
  8334			if key == "Trailer" {
  8335				t := res.Trailer
  8336				if t == nil {
  8337					t = make(Header)
  8338					res.Trailer = t
  8339				}
  8340				http2foreachHeaderElement(hf.Value, func(v string) {
  8341					t[CanonicalHeaderKey(v)] = nil
  8342				})
  8343			} else {
  8344				header[key] = append(header[key], hf.Value)
  8345			}
  8346		}
  8347	
  8348		if statusCode >= 100 && statusCode <= 199 {
  8349			cs.num1xx++
  8350			const max1xxResponses = 5 // arbitrary bound on number of informational responses, same as net/http
  8351			if cs.num1xx > max1xxResponses {
  8352				return nil, errors.New("http2: too many 1xx informational responses")
  8353			}
  8354			if fn := cs.get1xxTraceFunc(); fn != nil {
  8355				if err := fn(statusCode, textproto.MIMEHeader(header)); err != nil {
  8356					return nil, err
  8357				}
  8358			}
  8359			if statusCode == 100 {
  8360				http2traceGot100Continue(cs.trace)
  8361				if cs.on100 != nil {
  8362					cs.on100() // forces any write delay timer to fire
  8363				}
  8364			}
  8365			cs.pastHeaders = false // do it all again
  8366			return nil, nil
  8367		}
  8368	
  8369		streamEnded := f.StreamEnded()
  8370		isHead := cs.req.Method == "HEAD"
  8371		if !streamEnded || isHead {
  8372			res.ContentLength = -1
  8373			if clens := res.Header["Content-Length"]; len(clens) == 1 {
  8374				if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil {
  8375					res.ContentLength = clen64
  8376				} else {
  8377					// TODO: care? unlike http/1, it won't mess up our framing, so it's
  8378					// more safe smuggling-wise to ignore.
  8379				}
  8380			} else if len(clens) > 1 {
  8381				// TODO: care? unlike http/1, it won't mess up our framing, so it's
  8382				// more safe smuggling-wise to ignore.
  8383			}
  8384		}
  8385	
  8386		if streamEnded || isHead {
  8387			res.Body = http2noBody
  8388			return res, nil
  8389		}
  8390	
  8391		cs.bufPipe = http2pipe{b: &http2dataBuffer{expected: res.ContentLength}}
  8392		cs.bytesRemain = res.ContentLength
  8393		res.Body = http2transportResponseBody{cs}
  8394		go cs.awaitRequestCancel(cs.req)
  8395	
  8396		if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" {
  8397			res.Header.Del("Content-Encoding")
  8398			res.Header.Del("Content-Length")
  8399			res.ContentLength = -1
  8400			res.Body = &http2gzipReader{body: res.Body}
  8401			res.Uncompressed = true
  8402		}
  8403		return res, nil
  8404	}
  8405	
  8406	func (rl *http2clientConnReadLoop) processTrailers(cs *http2clientStream, f *http2MetaHeadersFrame) error {
  8407		if cs.pastTrailers {
  8408			// Too many HEADERS frames for this stream.
  8409			return http2ConnectionError(http2ErrCodeProtocol)
  8410		}
  8411		cs.pastTrailers = true
  8412		if !f.StreamEnded() {
  8413			// We expect that any headers for trailers also
  8414			// has END_STREAM.
  8415			return http2ConnectionError(http2ErrCodeProtocol)
  8416		}
  8417		if len(f.PseudoFields()) > 0 {
  8418			// No pseudo header fields are defined for trailers.
  8419			// TODO: ConnectionError might be overly harsh? Check.
  8420			return http2ConnectionError(http2ErrCodeProtocol)
  8421		}
  8422	
  8423		trailer := make(Header)
  8424		for _, hf := range f.RegularFields() {
  8425			key := CanonicalHeaderKey(hf.Name)
  8426			trailer[key] = append(trailer[key], hf.Value)
  8427		}
  8428		cs.trailer = trailer
  8429	
  8430		rl.endStream(cs)
  8431		return nil
  8432	}
  8433	
  8434	// transportResponseBody is the concrete type of Transport.RoundTrip's
  8435	// Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body.
  8436	// On Close it sends RST_STREAM if EOF wasn't already seen.
  8437	type http2transportResponseBody struct {
  8438		cs *http2clientStream
  8439	}
  8440	
  8441	func (b http2transportResponseBody) Read(p []byte) (n int, err error) {
  8442		cs := b.cs
  8443		cc := cs.cc
  8444	
  8445		if cs.readErr != nil {
  8446			return 0, cs.readErr
  8447		}
  8448		n, err = b.cs.bufPipe.Read(p)
  8449		if cs.bytesRemain != -1 {
  8450			if int64(n) > cs.bytesRemain {
  8451				n = int(cs.bytesRemain)
  8452				if err == nil {
  8453					err = errors.New("net/http: server replied with more than declared Content-Length; truncated")
  8454					cc.writeStreamReset(cs.ID, http2ErrCodeProtocol, err)
  8455				}
  8456				cs.readErr = err
  8457				return int(cs.bytesRemain), err
  8458			}
  8459			cs.bytesRemain -= int64(n)
  8460			if err == io.EOF && cs.bytesRemain > 0 {
  8461				err = io.ErrUnexpectedEOF
  8462				cs.readErr = err
  8463				return n, err
  8464			}
  8465		}
  8466		if n == 0 {
  8467			// No flow control tokens to send back.
  8468			return
  8469		}
  8470	
  8471		cc.mu.Lock()
  8472		defer cc.mu.Unlock()
  8473	
  8474		var connAdd, streamAdd int32
  8475		// Check the conn-level first, before the stream-level.
  8476		if v := cc.inflow.available(); v < http2transportDefaultConnFlow/2 {
  8477			connAdd = http2transportDefaultConnFlow - v
  8478			cc.inflow.add(connAdd)
  8479		}
  8480		if err == nil { // No need to refresh if the stream is over or failed.
  8481			// Consider any buffered body data (read from the conn but not
  8482			// consumed by the client) when computing flow control for this
  8483			// stream.
  8484			v := int(cs.inflow.available()) + cs.bufPipe.Len()
  8485			if v < http2transportDefaultStreamFlow-http2transportDefaultStreamMinRefresh {
  8486				streamAdd = int32(http2transportDefaultStreamFlow - v)
  8487				cs.inflow.add(streamAdd)
  8488			}
  8489		}
  8490		if connAdd != 0 || streamAdd != 0 {
  8491			cc.wmu.Lock()
  8492			defer cc.wmu.Unlock()
  8493			if connAdd != 0 {
  8494				cc.fr.WriteWindowUpdate(0, http2mustUint31(connAdd))
  8495			}
  8496			if streamAdd != 0 {
  8497				cc.fr.WriteWindowUpdate(cs.ID, http2mustUint31(streamAdd))
  8498			}
  8499			cc.bw.Flush()
  8500		}
  8501		return
  8502	}
  8503	
  8504	var http2errClosedResponseBody = errors.New("http2: response body closed")
  8505	
  8506	func (b http2transportResponseBody) Close() error {
  8507		cs := b.cs
  8508		cc := cs.cc
  8509	
  8510		serverSentStreamEnd := cs.bufPipe.Err() == io.EOF
  8511		unread := cs.bufPipe.Len()
  8512	
  8513		if unread > 0 || !serverSentStreamEnd {
  8514			cc.mu.Lock()
  8515			cc.wmu.Lock()
  8516			if !serverSentStreamEnd {
  8517				cc.fr.WriteRSTStream(cs.ID, http2ErrCodeCancel)
  8518				cs.didReset = true
  8519			}
  8520			// Return connection-level flow control.
  8521			if unread > 0 {
  8522				cc.inflow.add(int32(unread))
  8523				cc.fr.WriteWindowUpdate(0, uint32(unread))
  8524			}
  8525			cc.bw.Flush()
  8526			cc.wmu.Unlock()
  8527			cc.mu.Unlock()
  8528		}
  8529	
  8530		cs.bufPipe.BreakWithError(http2errClosedResponseBody)
  8531		cc.forgetStreamID(cs.ID)
  8532		return nil
  8533	}
  8534	
  8535	func (rl *http2clientConnReadLoop) processData(f *http2DataFrame) error {
  8536		cc := rl.cc
  8537		cs := cc.streamByID(f.StreamID, f.StreamEnded())
  8538		data := f.Data()
  8539		if cs == nil {
  8540			cc.mu.Lock()
  8541			neverSent := cc.nextStreamID
  8542			cc.mu.Unlock()
  8543			if f.StreamID >= neverSent {
  8544				// We never asked for this.
  8545				cc.logf("http2: Transport received unsolicited DATA frame; closing connection")
  8546				return http2ConnectionError(http2ErrCodeProtocol)
  8547			}
  8548			// We probably did ask for this, but canceled. Just ignore it.
  8549			// TODO: be stricter here? only silently ignore things which
  8550			// we canceled, but not things which were closed normally
  8551			// by the peer? Tough without accumulating too much state.
  8552	
  8553			// But at least return their flow control:
  8554			if f.Length > 0 {
  8555				cc.mu.Lock()
  8556				cc.inflow.add(int32(f.Length))
  8557				cc.mu.Unlock()
  8558	
  8559				cc.wmu.Lock()
  8560				cc.fr.WriteWindowUpdate(0, uint32(f.Length))
  8561				cc.bw.Flush()
  8562				cc.wmu.Unlock()
  8563			}
  8564			return nil
  8565		}
  8566		if !cs.firstByte {
  8567			cc.logf("protocol error: received DATA before a HEADERS frame")
  8568			rl.endStreamError(cs, http2StreamError{
  8569				StreamID: f.StreamID,
  8570				Code:     http2ErrCodeProtocol,
  8571			})
  8572			return nil
  8573		}
  8574		if f.Length > 0 {
  8575			if cs.req.Method == "HEAD" && len(data) > 0 {
  8576				cc.logf("protocol error: received DATA on a HEAD request")
  8577				rl.endStreamError(cs, http2StreamError{
  8578					StreamID: f.StreamID,
  8579					Code:     http2ErrCodeProtocol,
  8580				})
  8581				return nil
  8582			}
  8583			// Check connection-level flow control.
  8584			cc.mu.Lock()
  8585			if cs.inflow.available() >= int32(f.Length) {
  8586				cs.inflow.take(int32(f.Length))
  8587			} else {
  8588				cc.mu.Unlock()
  8589				return http2ConnectionError(http2ErrCodeFlowControl)
  8590			}
  8591			// Return any padded flow control now, since we won't
  8592			// refund it later on body reads.
  8593			var refund int
  8594			if pad := int(f.Length) - len(data); pad > 0 {
  8595				refund += pad
  8596			}
  8597			// Return len(data) now if the stream is already closed,
  8598			// since data will never be read.
  8599			didReset := cs.didReset
  8600			if didReset {
  8601				refund += len(data)
  8602			}
  8603			if refund > 0 {
  8604				cc.inflow.add(int32(refund))
  8605				cc.wmu.Lock()
  8606				cc.fr.WriteWindowUpdate(0, uint32(refund))
  8607				if !didReset {
  8608					cs.inflow.add(int32(refund))
  8609					cc.fr.WriteWindowUpdate(cs.ID, uint32(refund))
  8610				}
  8611				cc.bw.Flush()
  8612				cc.wmu.Unlock()
  8613			}
  8614			cc.mu.Unlock()
  8615	
  8616			if len(data) > 0 && !didReset {
  8617				if _, err := cs.bufPipe.Write(data); err != nil {
  8618					rl.endStreamError(cs, err)
  8619					return err
  8620				}
  8621			}
  8622		}
  8623	
  8624		if f.StreamEnded() {
  8625			rl.endStream(cs)
  8626		}
  8627		return nil
  8628	}
  8629	
  8630	var http2errInvalidTrailers = errors.New("http2: invalid trailers")
  8631	
  8632	func (rl *http2clientConnReadLoop) endStream(cs *http2clientStream) {
  8633		// TODO: check that any declared content-length matches, like
  8634		// server.go's (*stream).endStream method.
  8635		rl.endStreamError(cs, nil)
  8636	}
  8637	
  8638	func (rl *http2clientConnReadLoop) endStreamError(cs *http2clientStream, err error) {
  8639		var code func()
  8640		if err == nil {
  8641			err = io.EOF
  8642			code = cs.copyTrailers
  8643		}
  8644		if http2isConnectionCloseRequest(cs.req) {
  8645			rl.closeWhenIdle = true
  8646		}
  8647		cs.bufPipe.closeWithErrorAndCode(err, code)
  8648	
  8649		select {
  8650		case cs.resc <- http2resAndError{err: err}:
  8651		default:
  8652		}
  8653	}
  8654	
  8655	func (cs *http2clientStream) copyTrailers() {
  8656		for k, vv := range cs.trailer {
  8657			t := cs.resTrailer
  8658			if *t == nil {
  8659				*t = make(Header)
  8660			}
  8661			(*t)[k] = vv
  8662		}
  8663	}
  8664	
  8665	func (rl *http2clientConnReadLoop) processGoAway(f *http2GoAwayFrame) error {
  8666		cc := rl.cc
  8667		cc.t.connPool().MarkDead(cc)
  8668		if f.ErrCode != 0 {
  8669			// TODO: deal with GOAWAY more. particularly the error code
  8670			cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode)
  8671		}
  8672		cc.setGoAway(f)
  8673		return nil
  8674	}
  8675	
  8676	func (rl *http2clientConnReadLoop) processSettings(f *http2SettingsFrame) error {
  8677		cc := rl.cc
  8678		cc.mu.Lock()
  8679		defer cc.mu.Unlock()
  8680	
  8681		if f.IsAck() {
  8682			if cc.wantSettingsAck {
  8683				cc.wantSettingsAck = false
  8684				return nil
  8685			}
  8686			return http2ConnectionError(http2ErrCodeProtocol)
  8687		}
  8688	
  8689		err := f.ForeachSetting(func(s http2Setting) error {
  8690			switch s.ID {
  8691			case http2SettingMaxFrameSize:
  8692				cc.maxFrameSize = s.Val
  8693			case http2SettingMaxConcurrentStreams:
  8694				cc.maxConcurrentStreams = s.Val
  8695			case http2SettingMaxHeaderListSize:
  8696				cc.peerMaxHeaderListSize = uint64(s.Val)
  8697			case http2SettingInitialWindowSize:
  8698				// Values above the maximum flow-control
  8699				// window size of 2^31-1 MUST be treated as a
  8700				// connection error (Section 5.4.1) of type
  8701				// FLOW_CONTROL_ERROR.
  8702				if s.Val > math.MaxInt32 {
  8703					return http2ConnectionError(http2ErrCodeFlowControl)
  8704				}
  8705	
  8706				// Adjust flow control of currently-open
  8707				// frames by the difference of the old initial
  8708				// window size and this one.
  8709				delta := int32(s.Val) - int32(cc.initialWindowSize)
  8710				for _, cs := range cc.streams {
  8711					cs.flow.add(delta)
  8712				}
  8713				cc.cond.Broadcast()
  8714	
  8715				cc.initialWindowSize = s.Val
  8716			default:
  8717				// TODO(bradfitz): handle more settings? SETTINGS_HEADER_TABLE_SIZE probably.
  8718				cc.vlogf("Unhandled Setting: %v", s)
  8719			}
  8720			return nil
  8721		})
  8722		if err != nil {
  8723			return err
  8724		}
  8725	
  8726		cc.wmu.Lock()
  8727		defer cc.wmu.Unlock()
  8728	
  8729		cc.fr.WriteSettingsAck()
  8730		cc.bw.Flush()
  8731		return cc.werr
  8732	}
  8733	
  8734	func (rl *http2clientConnReadLoop) processWindowUpdate(f *http2WindowUpdateFrame) error {
  8735		cc := rl.cc
  8736		cs := cc.streamByID(f.StreamID, false)
  8737		if f.StreamID != 0 && cs == nil {
  8738			return nil
  8739		}
  8740	
  8741		cc.mu.Lock()
  8742		defer cc.mu.Unlock()
  8743	
  8744		fl := &cc.flow
  8745		if cs != nil {
  8746			fl = &cs.flow
  8747		}
  8748		if !fl.add(int32(f.Increment)) {
  8749			return http2ConnectionError(http2ErrCodeFlowControl)
  8750		}
  8751		cc.cond.Broadcast()
  8752		return nil
  8753	}
  8754	
  8755	func (rl *http2clientConnReadLoop) processResetStream(f *http2RSTStreamFrame) error {
  8756		cs := rl.cc.streamByID(f.StreamID, true)
  8757		if cs == nil {
  8758			// TODO: return error if server tries to RST_STEAM an idle stream
  8759			return nil
  8760		}
  8761		select {
  8762		case <-cs.peerReset:
  8763			// Already reset.
  8764			// This is the only goroutine
  8765			// which closes this, so there
  8766			// isn't a race.
  8767		default:
  8768			err := http2streamError(cs.ID, f.ErrCode)
  8769			cs.resetErr = err
  8770			close(cs.peerReset)
  8771			cs.bufPipe.CloseWithError(err)
  8772			cs.cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl
  8773		}
  8774		return nil
  8775	}
  8776	
  8777	// Ping sends a PING frame to the server and waits for the ack.
  8778	func (cc *http2ClientConn) Ping(ctx context.Context) error {
  8779		c := make(chan struct{})
  8780		// Generate a random payload
  8781		var p [8]byte
  8782		for {
  8783			if _, err := rand.Read(p[:]); err != nil {
  8784				return err
  8785			}
  8786			cc.mu.Lock()
  8787			// check for dup before insert
  8788			if _, found := cc.pings[p]; !found {
  8789				cc.pings[p] = c
  8790				cc.mu.Unlock()
  8791				break
  8792			}
  8793			cc.mu.Unlock()
  8794		}
  8795		cc.wmu.Lock()
  8796		if err := cc.fr.WritePing(false, p); err != nil {
  8797			cc.wmu.Unlock()
  8798			return err
  8799		}
  8800		if err := cc.bw.Flush(); err != nil {
  8801			cc.wmu.Unlock()
  8802			return err
  8803		}
  8804		cc.wmu.Unlock()
  8805		select {
  8806		case <-c:
  8807			return nil
  8808		case <-ctx.Done():
  8809			return ctx.Err()
  8810		case <-cc.readerDone:
  8811			// connection closed
  8812			return cc.readerErr
  8813		}
  8814	}
  8815	
  8816	func (rl *http2clientConnReadLoop) processPing(f *http2PingFrame) error {
  8817		if f.IsAck() {
  8818			cc := rl.cc
  8819			cc.mu.Lock()
  8820			defer cc.mu.Unlock()
  8821			// If ack, notify listener if any
  8822			if c, ok := cc.pings[f.Data]; ok {
  8823				close(c)
  8824				delete(cc.pings, f.Data)
  8825			}
  8826			return nil
  8827		}
  8828		cc := rl.cc
  8829		cc.wmu.Lock()
  8830		defer cc.wmu.Unlock()
  8831		if err := cc.fr.WritePing(true, f.Data); err != nil {
  8832			return err
  8833		}
  8834		return cc.bw.Flush()
  8835	}
  8836	
  8837	func (rl *http2clientConnReadLoop) processPushPromise(f *http2PushPromiseFrame) error {
  8838		// We told the peer we don't want them.
  8839		// Spec says:
  8840		// "PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH
  8841		// setting of the peer endpoint is set to 0. An endpoint that
  8842		// has set this setting and has received acknowledgement MUST
  8843		// treat the receipt of a PUSH_PROMISE frame as a connection
  8844		// error (Section 5.4.1) of type PROTOCOL_ERROR."
  8845		return http2ConnectionError(http2ErrCodeProtocol)
  8846	}
  8847	
  8848	func (cc *http2ClientConn) writeStreamReset(streamID uint32, code http2ErrCode, err error) {
  8849		// TODO: map err to more interesting error codes, once the
  8850		// HTTP community comes up with some. But currently for
  8851		// RST_STREAM there's no equivalent to GOAWAY frame's debug
  8852		// data, and the error codes are all pretty vague ("cancel").
  8853		cc.wmu.Lock()
  8854		cc.fr.WriteRSTStream(streamID, code)
  8855		cc.bw.Flush()
  8856		cc.wmu.Unlock()
  8857	}
  8858	
  8859	var (
  8860		http2errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit")
  8861		http2errRequestHeaderListSize  = errors.New("http2: request header list larger than peer's advertised limit")
  8862		http2errPseudoTrailers         = errors.New("http2: invalid pseudo header in trailers")
  8863	)
  8864	
  8865	func (cc *http2ClientConn) logf(format string, args ...interface{}) {
  8866		cc.t.logf(format, args...)
  8867	}
  8868	
  8869	func (cc *http2ClientConn) vlogf(format string, args ...interface{}) {
  8870		cc.t.vlogf(format, args...)
  8871	}
  8872	
  8873	func (t *http2Transport) vlogf(format string, args ...interface{}) {
  8874		if http2VerboseLogs {
  8875			t.logf(format, args...)
  8876		}
  8877	}
  8878	
  8879	func (t *http2Transport) logf(format string, args ...interface{}) {
  8880		log.Printf(format, args...)
  8881	}
  8882	
  8883	var http2noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil))
  8884	
  8885	func http2strSliceContains(ss []string, s string) bool {
  8886		for _, v := range ss {
  8887			if v == s {
  8888				return true
  8889			}
  8890		}
  8891		return false
  8892	}
  8893	
  8894	type http2erringRoundTripper struct{ err error }
  8895	
  8896	func (rt http2erringRoundTripper) RoundTrip(*Request) (*Response, error) { return nil, rt.err }
  8897	
  8898	// gzipReader wraps a response body so it can lazily
  8899	// call gzip.NewReader on the first call to Read
  8900	type http2gzipReader struct {
  8901		body io.ReadCloser // underlying Response.Body
  8902		zr   *gzip.Reader  // lazily-initialized gzip reader
  8903		zerr error         // sticky error
  8904	}
  8905	
  8906	func (gz *http2gzipReader) Read(p []byte) (n int, err error) {
  8907		if gz.zerr != nil {
  8908			return 0, gz.zerr
  8909		}
  8910		if gz.zr == nil {
  8911			gz.zr, err = gzip.NewReader(gz.body)
  8912			if err != nil {
  8913				gz.zerr = err
  8914				return 0, err
  8915			}
  8916		}
  8917		return gz.zr.Read(p)
  8918	}
  8919	
  8920	func (gz *http2gzipReader) Close() error {
  8921		return gz.body.Close()
  8922	}
  8923	
  8924	type http2errorReader struct{ err error }
  8925	
  8926	func (r http2errorReader) Read(p []byte) (int, error) { return 0, r.err }
  8927	
  8928	// bodyWriterState encapsulates various state around the Transport's writing
  8929	// of the request body, particularly regarding doing delayed writes of the body
  8930	// when the request contains "Expect: 100-continue".
  8931	type http2bodyWriterState struct {
  8932		cs     *http2clientStream
  8933		timer  *time.Timer   // if non-nil, we're doing a delayed write
  8934		fnonce *sync.Once    // to call fn with
  8935		fn     func()        // the code to run in the goroutine, writing the body
  8936		resc   chan error    // result of fn's execution
  8937		delay  time.Duration // how long we should delay a delayed write for
  8938	}
  8939	
  8940	func (t *http2Transport) getBodyWriterState(cs *http2clientStream, body io.Reader) (s http2bodyWriterState) {
  8941		s.cs = cs
  8942		if body == nil {
  8943			return
  8944		}
  8945		resc := make(chan error, 1)
  8946		s.resc = resc
  8947		s.fn = func() {
  8948			cs.cc.mu.Lock()
  8949			cs.startedWrite = true
  8950			cs.cc.mu.Unlock()
  8951			resc <- cs.writeRequestBody(body, cs.req.Body)
  8952		}
  8953		s.delay = t.expectContinueTimeout()
  8954		if s.delay == 0 ||
  8955			!httpguts.HeaderValuesContainsToken(
  8956				cs.req.Header["Expect"],
  8957				"100-continue") {
  8958			return
  8959		}
  8960		s.fnonce = new(sync.Once)
  8961	
  8962		// Arm the timer with a very large duration, which we'll
  8963		// intentionally lower later. It has to be large now because
  8964		// we need a handle to it before writing the headers, but the
  8965		// s.delay value is defined to not start until after the
  8966		// request headers were written.
  8967		const hugeDuration = 365 * 24 * time.Hour
  8968		s.timer = time.AfterFunc(hugeDuration, func() {
  8969			s.fnonce.Do(s.fn)
  8970		})
  8971		return
  8972	}
  8973	
  8974	func (s http2bodyWriterState) cancel() {
  8975		if s.timer != nil {
  8976			s.timer.Stop()
  8977		}
  8978	}
  8979	
  8980	func (s http2bodyWriterState) on100() {
  8981		if s.timer == nil {
  8982			// If we didn't do a delayed write, ignore the server's
  8983			// bogus 100 continue response.
  8984			return
  8985		}
  8986		s.timer.Stop()
  8987		go func() { s.fnonce.Do(s.fn) }()
  8988	}
  8989	
  8990	// scheduleBodyWrite starts writing the body, either immediately (in
  8991	// the common case) or after the delay timeout. It should not be
  8992	// called until after the headers have been written.
  8993	func (s http2bodyWriterState) scheduleBodyWrite() {
  8994		if s.timer == nil {
  8995			// We're not doing a delayed write (see
  8996			// getBodyWriterState), so just start the writing
  8997			// goroutine immediately.
  8998			go s.fn()
  8999			return
  9000		}
  9001		http2traceWait100Continue(s.cs.trace)
  9002		if s.timer.Stop() {
  9003			s.timer.Reset(s.delay)
  9004		}
  9005	}
  9006	
  9007	// isConnectionCloseRequest reports whether req should use its own
  9008	// connection for a single request and then close the connection.
  9009	func http2isConnectionCloseRequest(req *Request) bool {
  9010		return req.Close || httpguts.HeaderValuesContainsToken(req.Header["Connection"], "close")
  9011	}
  9012	
  9013	// registerHTTPSProtocol calls Transport.RegisterProtocol but
  9014	// converting panics into errors.
  9015	func http2registerHTTPSProtocol(t *Transport, rt http2noDialH2RoundTripper) (err error) {
  9016		defer func() {
  9017			if e := recover(); e != nil {
  9018				err = fmt.Errorf("%v", e)
  9019			}
  9020		}()
  9021		t.RegisterProtocol("https", rt)
  9022		return nil
  9023	}
  9024	
  9025	// noDialH2RoundTripper is a RoundTripper which only tries to complete the request
  9026	// if there's already has a cached connection to the host.
  9027	// (The field is exported so it can be accessed via reflect from net/http; tested
  9028	// by TestNoDialH2RoundTripperType)
  9029	type http2noDialH2RoundTripper struct{ *http2Transport }
  9030	
  9031	func (rt http2noDialH2RoundTripper) RoundTrip(req *Request) (*Response, error) {
  9032		res, err := rt.http2Transport.RoundTrip(req)
  9033		if http2isNoCachedConnError(err) {
  9034			return nil, ErrSkipAltProtocol
  9035		}
  9036		return res, err
  9037	}
  9038	
  9039	func (t *http2Transport) idleConnTimeout() time.Duration {
  9040		if t.t1 != nil {
  9041			return t.t1.IdleConnTimeout
  9042		}
  9043		return 0
  9044	}
  9045	
  9046	func http2traceGetConn(req *Request, hostPort string) {
  9047		trace := httptrace.ContextClientTrace(req.Context())
  9048		if trace == nil || trace.GetConn == nil {
  9049			return
  9050		}
  9051		trace.GetConn(hostPort)
  9052	}
  9053	
  9054	func http2traceGotConn(req *Request, cc *http2ClientConn, reused bool) {
  9055		trace := httptrace.ContextClientTrace(req.Context())
  9056		if trace == nil || trace.GotConn == nil {
  9057			return
  9058		}
  9059		ci := httptrace.GotConnInfo{Conn: cc.tconn}
  9060		ci.Reused = reused
  9061		cc.mu.Lock()
  9062		ci.WasIdle = len(cc.streams) == 0 && reused
  9063		if ci.WasIdle && !cc.lastActive.IsZero() {
  9064			ci.IdleTime = time.Now().Sub(cc.lastActive)
  9065		}
  9066		cc.mu.Unlock()
  9067	
  9068		trace.GotConn(ci)
  9069	}
  9070	
  9071	func http2traceWroteHeaders(trace *httptrace.ClientTrace) {
  9072		if trace != nil && trace.WroteHeaders != nil {
  9073			trace.WroteHeaders()
  9074		}
  9075	}
  9076	
  9077	func http2traceGot100Continue(trace *httptrace.ClientTrace) {
  9078		if trace != nil && trace.Got100Continue != nil {
  9079			trace.Got100Continue()
  9080		}
  9081	}
  9082	
  9083	func http2traceWait100Continue(trace *httptrace.ClientTrace) {
  9084		if trace != nil && trace.Wait100Continue != nil {
  9085			trace.Wait100Continue()
  9086		}
  9087	}
  9088	
  9089	func http2traceWroteRequest(trace *httptrace.ClientTrace, err error) {
  9090		if trace != nil && trace.WroteRequest != nil {
  9091			trace.WroteRequest(httptrace.WroteRequestInfo{Err: err})
  9092		}
  9093	}
  9094	
  9095	func http2traceFirstResponseByte(trace *httptrace.ClientTrace) {
  9096		if trace != nil && trace.GotFirstResponseByte != nil {
  9097			trace.GotFirstResponseByte()
  9098		}
  9099	}
  9100	
  9101	// writeFramer is implemented by any type that is used to write frames.
  9102	type http2writeFramer interface {
  9103		writeFrame(http2writeContext) error
  9104	
  9105		// staysWithinBuffer reports whether this writer promises that
  9106		// it will only write less than or equal to size bytes, and it
  9107		// won't Flush the write context.
  9108		staysWithinBuffer(size int) bool
  9109	}
  9110	
  9111	// writeContext is the interface needed by the various frame writer
  9112	// types below. All the writeFrame methods below are scheduled via the
  9113	// frame writing scheduler (see writeScheduler in writesched.go).
  9114	//
  9115	// This interface is implemented by *serverConn.
  9116	//
  9117	// TODO: decide whether to a) use this in the client code (which didn't
  9118	// end up using this yet, because it has a simpler design, not
  9119	// currently implementing priorities), or b) delete this and
  9120	// make the server code a bit more concrete.
  9121	type http2writeContext interface {
  9122		Framer() *http2Framer
  9123		Flush() error
  9124		CloseConn() error
  9125		// HeaderEncoder returns an HPACK encoder that writes to the
  9126		// returned buffer.
  9127		HeaderEncoder() (*hpack.Encoder, *bytes.Buffer)
  9128	}
  9129	
  9130	// writeEndsStream reports whether w writes a frame that will transition
  9131	// the stream to a half-closed local state. This returns false for RST_STREAM,
  9132	// which closes the entire stream (not just the local half).
  9133	func http2writeEndsStream(w http2writeFramer) bool {
  9134		switch v := w.(type) {
  9135		case *http2writeData:
  9136			return v.endStream
  9137		case *http2writeResHeaders:
  9138			return v.endStream
  9139		case nil:
  9140			// This can only happen if the caller reuses w after it's
  9141			// been intentionally nil'ed out to prevent use. Keep this
  9142			// here to catch future refactoring breaking it.
  9143			panic("writeEndsStream called on nil writeFramer")
  9144		}
  9145		return false
  9146	}
  9147	
  9148	type http2flushFrameWriter struct{}
  9149	
  9150	func (http2flushFrameWriter) writeFrame(ctx http2writeContext) error {
  9151		return ctx.Flush()
  9152	}
  9153	
  9154	func (http2flushFrameWriter) staysWithinBuffer(max int) bool { return false }
  9155	
  9156	type http2writeSettings []http2Setting
  9157	
  9158	func (s http2writeSettings) staysWithinBuffer(max int) bool {
  9159		const settingSize = 6 // uint16 + uint32
  9160		return http2frameHeaderLen+settingSize*len(s) <= max
  9161	
  9162	}
  9163	
  9164	func (s http2writeSettings) writeFrame(ctx http2writeContext) error {
  9165		return ctx.Framer().WriteSettings([]http2Setting(s)...)
  9166	}
  9167	
  9168	type http2writeGoAway struct {
  9169		maxStreamID uint32
  9170		code        http2ErrCode
  9171	}
  9172	
  9173	func (p *http2writeGoAway) writeFrame(ctx http2writeContext) error {
  9174		err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil)
  9175		ctx.Flush() // ignore error: we're hanging up on them anyway
  9176		return err
  9177	}
  9178	
  9179	func (*http2writeGoAway) staysWithinBuffer(max int) bool { return false } // flushes
  9180	
  9181	type http2writeData struct {
  9182		streamID  uint32
  9183		p         []byte
  9184		endStream bool
  9185	}
  9186	
  9187	func (w *http2writeData) String() string {
  9188		return fmt.Sprintf("writeData(stream=%d, p=%d, endStream=%v)", w.streamID, len(w.p), w.endStream)
  9189	}
  9190	
  9191	func (w *http2writeData) writeFrame(ctx http2writeContext) error {
  9192		return ctx.Framer().WriteData(w.streamID, w.endStream, w.p)
  9193	}
  9194	
  9195	func (w *http2writeData) staysWithinBuffer(max int) bool {
  9196		return http2frameHeaderLen+len(w.p) <= max
  9197	}
  9198	
  9199	// handlerPanicRST is the message sent from handler goroutines when
  9200	// the handler panics.
  9201	type http2handlerPanicRST struct {
  9202		StreamID uint32
  9203	}
  9204	
  9205	func (hp http2handlerPanicRST) writeFrame(ctx http2writeContext) error {
  9206		return ctx.Framer().WriteRSTStream(hp.StreamID, http2ErrCodeInternal)
  9207	}
  9208	
  9209	func (hp http2handlerPanicRST) staysWithinBuffer(max int) bool { return http2frameHeaderLen+4 <= max }
  9210	
  9211	func (se http2StreamError) writeFrame(ctx http2writeContext) error {
  9212		return ctx.Framer().WriteRSTStream(se.StreamID, se.Code)
  9213	}
  9214	
  9215	func (se http2StreamError) staysWithinBuffer(max int) bool { return http2frameHeaderLen+4 <= max }
  9216	
  9217	type http2writePingAck struct{ pf *http2PingFrame }
  9218	
  9219	func (w http2writePingAck) writeFrame(ctx http2writeContext) error {
  9220		return ctx.Framer().WritePing(true, w.pf.Data)
  9221	}
  9222	
  9223	func (w http2writePingAck) staysWithinBuffer(max int) bool {
  9224		return http2frameHeaderLen+len(w.pf.Data) <= max
  9225	}
  9226	
  9227	type http2writeSettingsAck struct{}
  9228	
  9229	func (http2writeSettingsAck) writeFrame(ctx http2writeContext) error {
  9230		return ctx.Framer().WriteSettingsAck()
  9231	}
  9232	
  9233	func (http2writeSettingsAck) staysWithinBuffer(max int) bool { return http2frameHeaderLen <= max }
  9234	
  9235	// splitHeaderBlock splits headerBlock into fragments so that each fragment fits
  9236	// in a single frame, then calls fn for each fragment. firstFrag/lastFrag are true
  9237	// for the first/last fragment, respectively.
  9238	func http2splitHeaderBlock(ctx http2writeContext, headerBlock []byte, fn func(ctx http2writeContext, frag []byte, firstFrag, lastFrag bool) error) error {
  9239		// For now we're lazy and just pick the minimum MAX_FRAME_SIZE
  9240		// that all peers must support (16KB). Later we could care
  9241		// more and send larger frames if the peer advertised it, but
  9242		// there's little point. Most headers are small anyway (so we
  9243		// generally won't have CONTINUATION frames), and extra frames
  9244		// only waste 9 bytes anyway.
  9245		const maxFrameSize = 16384
  9246	
  9247		first := true
  9248		for len(headerBlock) > 0 {
  9249			frag := headerBlock
  9250			if len(frag) > maxFrameSize {
  9251				frag = frag[:maxFrameSize]
  9252			}
  9253			headerBlock = headerBlock[len(frag):]
  9254			if err := fn(ctx, frag, first, len(headerBlock) == 0); err != nil {
  9255				return err
  9256			}
  9257			first = false
  9258		}
  9259		return nil
  9260	}
  9261	
  9262	// writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames
  9263	// for HTTP response headers or trailers from a server handler.
  9264	type http2writeResHeaders struct {
  9265		streamID    uint32
  9266		httpResCode int      // 0 means no ":status" line
  9267		h           Header   // may be nil
  9268		trailers    []string // if non-nil, which keys of h to write. nil means all.
  9269		endStream   bool
  9270	
  9271		date          string
  9272		contentType   string
  9273		contentLength string
  9274	}
  9275	
  9276	func http2encKV(enc *hpack.Encoder, k, v string) {
  9277		if http2VerboseLogs {
  9278			log.Printf("http2: server encoding header %q = %q", k, v)
  9279		}
  9280		enc.WriteField(hpack.HeaderField{Name: k, Value: v})
  9281	}
  9282	
  9283	func (w *http2writeResHeaders) staysWithinBuffer(max int) bool {
  9284		// TODO: this is a common one. It'd be nice to return true
  9285		// here and get into the fast path if we could be clever and
  9286		// calculate the size fast enough, or at least a conservative
  9287		// upper bound that usually fires. (Maybe if w.h and
  9288		// w.trailers are nil, so we don't need to enumerate it.)
  9289		// Otherwise I'm afraid that just calculating the length to
  9290		// answer this question would be slower than the ~2µs benefit.
  9291		return false
  9292	}
  9293	
  9294	func (w *http2writeResHeaders) writeFrame(ctx http2writeContext) error {
  9295		enc, buf := ctx.HeaderEncoder()
  9296		buf.Reset()
  9297	
  9298		if w.httpResCode != 0 {
  9299			http2encKV(enc, ":status", http2httpCodeString(w.httpResCode))
  9300		}
  9301	
  9302		http2encodeHeaders(enc, w.h, w.trailers)
  9303	
  9304		if w.contentType != "" {
  9305			http2encKV(enc, "content-type", w.contentType)
  9306		}
  9307		if w.contentLength != "" {
  9308			http2encKV(enc, "content-length", w.contentLength)
  9309		}
  9310		if w.date != "" {
  9311			http2encKV(enc, "date", w.date)
  9312		}
  9313	
  9314		headerBlock := buf.Bytes()
  9315		if len(headerBlock) == 0 && w.trailers == nil {
  9316			panic("unexpected empty hpack")
  9317		}
  9318	
  9319		return http2splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock)
  9320	}
  9321	
  9322	func (w *http2writeResHeaders) writeHeaderBlock(ctx http2writeContext, frag []byte, firstFrag, lastFrag bool) error {
  9323		if firstFrag {
  9324			return ctx.Framer().WriteHeaders(http2HeadersFrameParam{
  9325				StreamID:      w.streamID,
  9326				BlockFragment: frag,
  9327				EndStream:     w.endStream,
  9328				EndHeaders:    lastFrag,
  9329			})
  9330		} else {
  9331			return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag)
  9332		}
  9333	}
  9334	
  9335	// writePushPromise is a request to write a PUSH_PROMISE and 0+ CONTINUATION frames.
  9336	type http2writePushPromise struct {
  9337		streamID uint32   // pusher stream
  9338		method   string   // for :method
  9339		url      *url.URL // for :scheme, :authority, :path
  9340		h        Header
  9341	
  9342		// Creates an ID for a pushed stream. This runs on serveG just before
  9343		// the frame is written. The returned ID is copied to promisedID.
  9344		allocatePromisedID func() (uint32, error)
  9345		promisedID         uint32
  9346	}
  9347	
  9348	func (w *http2writePushPromise) staysWithinBuffer(max int) bool {
  9349		// TODO: see writeResHeaders.staysWithinBuffer
  9350		return false
  9351	}
  9352	
  9353	func (w *http2writePushPromise) writeFrame(ctx http2writeContext) error {
  9354		enc, buf := ctx.HeaderEncoder()
  9355		buf.Reset()
  9356	
  9357		http2encKV(enc, ":method", w.method)
  9358		http2encKV(enc, ":scheme", w.url.Scheme)
  9359		http2encKV(enc, ":authority", w.url.Host)
  9360		http2encKV(enc, ":path", w.url.RequestURI())
  9361		http2encodeHeaders(enc, w.h, nil)
  9362	
  9363		headerBlock := buf.Bytes()
  9364		if len(headerBlock) == 0 {
  9365			panic("unexpected empty hpack")
  9366		}
  9367	
  9368		return http2splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock)
  9369	}
  9370	
  9371	func (w *http2writePushPromise) writeHeaderBlock(ctx http2writeContext, frag []byte, firstFrag, lastFrag bool) error {
  9372		if firstFrag {
  9373			return ctx.Framer().WritePushPromise(http2PushPromiseParam{
  9374				StreamID:      w.streamID,
  9375				PromiseID:     w.promisedID,
  9376				BlockFragment: frag,
  9377				EndHeaders:    lastFrag,
  9378			})
  9379		} else {
  9380			return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag)
  9381		}
  9382	}
  9383	
  9384	type http2write100ContinueHeadersFrame struct {
  9385		streamID uint32
  9386	}
  9387	
  9388	func (w http2write100ContinueHeadersFrame) writeFrame(ctx http2writeContext) error {
  9389		enc, buf := ctx.HeaderEncoder()
  9390		buf.Reset()
  9391		http2encKV(enc, ":status", "100")
  9392		return ctx.Framer().WriteHeaders(http2HeadersFrameParam{
  9393			StreamID:      w.streamID,
  9394			BlockFragment: buf.Bytes(),
  9395			EndStream:     false,
  9396			EndHeaders:    true,
  9397		})
  9398	}
  9399	
  9400	func (w http2write100ContinueHeadersFrame) staysWithinBuffer(max int) bool {
  9401		// Sloppy but conservative:
  9402		return 9+2*(len(":status")+len("100")) <= max
  9403	}
  9404	
  9405	type http2writeWindowUpdate struct {
  9406		streamID uint32 // or 0 for conn-level
  9407		n        uint32
  9408	}
  9409	
  9410	func (wu http2writeWindowUpdate) staysWithinBuffer(max int) bool { return http2frameHeaderLen+4 <= max }
  9411	
  9412	func (wu http2writeWindowUpdate) writeFrame(ctx http2writeContext) error {
  9413		return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n)
  9414	}
  9415	
  9416	// encodeHeaders encodes an http.Header. If keys is not nil, then (k, h[k])
  9417	// is encoded only if k is in keys.
  9418	func http2encodeHeaders(enc *hpack.Encoder, h Header, keys []string) {
  9419		if keys == nil {
  9420			sorter := http2sorterPool.Get().(*http2sorter)
  9421			// Using defer here, since the returned keys from the
  9422			// sorter.Keys method is only valid until the sorter
  9423			// is returned:
  9424			defer http2sorterPool.Put(sorter)
  9425			keys = sorter.Keys(h)
  9426		}
  9427		for _, k := range keys {
  9428			vv := h[k]
  9429			k = http2lowerHeader(k)
  9430			if !http2validWireHeaderFieldName(k) {
  9431				// Skip it as backup paranoia. Per
  9432				// golang.org/issue/14048, these should
  9433				// already be rejected at a higher level.
  9434				continue
  9435			}
  9436			isTE := k == "transfer-encoding"
  9437			for _, v := range vv {
  9438				if !httpguts.ValidHeaderFieldValue(v) {
  9439					// TODO: return an error? golang.org/issue/14048
  9440					// For now just omit it.
  9441					continue
  9442				}
  9443				// TODO: more of "8.1.2.2 Connection-Specific Header Fields"
  9444				if isTE && v != "trailers" {
  9445					continue
  9446				}
  9447				http2encKV(enc, k, v)
  9448			}
  9449		}
  9450	}
  9451	
  9452	// WriteScheduler is the interface implemented by HTTP/2 write schedulers.
  9453	// Methods are never called concurrently.
  9454	type http2WriteScheduler interface {
  9455		// OpenStream opens a new stream in the write scheduler.
  9456		// It is illegal to call this with streamID=0 or with a streamID that is
  9457		// already open -- the call may panic.
  9458		OpenStream(streamID uint32, options http2OpenStreamOptions)
  9459	
  9460		// CloseStream closes a stream in the write scheduler. Any frames queued on
  9461		// this stream should be discarded. It is illegal to call this on a stream
  9462		// that is not open -- the call may panic.
  9463		CloseStream(streamID uint32)
  9464	
  9465		// AdjustStream adjusts the priority of the given stream. This may be called
  9466		// on a stream that has not yet been opened or has been closed. Note that
  9467		// RFC 7540 allows PRIORITY frames to be sent on streams in any state. See:
  9468		// https://tools.ietf.org/html/rfc7540#section-5.1
  9469		AdjustStream(streamID uint32, priority http2PriorityParam)
  9470	
  9471		// Push queues a frame in the scheduler. In most cases, this will not be
  9472		// called with wr.StreamID()!=0 unless that stream is currently open. The one
  9473		// exception is RST_STREAM frames, which may be sent on idle or closed streams.
  9474		Push(wr http2FrameWriteRequest)
  9475	
  9476		// Pop dequeues the next frame to write. Returns false if no frames can
  9477		// be written. Frames with a given wr.StreamID() are Pop'd in the same
  9478		// order they are Push'd. No frames should be discarded except by CloseStream.
  9479		Pop() (wr http2FrameWriteRequest, ok bool)
  9480	}
  9481	
  9482	// OpenStreamOptions specifies extra options for WriteScheduler.OpenStream.
  9483	type http2OpenStreamOptions struct {
  9484		// PusherID is zero if the stream was initiated by the client. Otherwise,
  9485		// PusherID names the stream that pushed the newly opened stream.
  9486		PusherID uint32
  9487	}
  9488	
  9489	// FrameWriteRequest is a request to write a frame.
  9490	type http2FrameWriteRequest struct {
  9491		// write is the interface value that does the writing, once the
  9492		// WriteScheduler has selected this frame to write. The write
  9493		// functions are all defined in write.go.
  9494		write http2writeFramer
  9495	
  9496		// stream is the stream on which this frame will be written.
  9497		// nil for non-stream frames like PING and SETTINGS.
  9498		stream *http2stream
  9499	
  9500		// done, if non-nil, must be a buffered channel with space for
  9501		// 1 message and is sent the return value from write (or an
  9502		// earlier error) when the frame has been written.
  9503		done chan error
  9504	}
  9505	
  9506	// StreamID returns the id of the stream this frame will be written to.
  9507	// 0 is used for non-stream frames such as PING and SETTINGS.
  9508	func (wr http2FrameWriteRequest) StreamID() uint32 {
  9509		if wr.stream == nil {
  9510			if se, ok := wr.write.(http2StreamError); ok {
  9511				// (*serverConn).resetStream doesn't set
  9512				// stream because it doesn't necessarily have
  9513				// one. So special case this type of write
  9514				// message.
  9515				return se.StreamID
  9516			}
  9517			return 0
  9518		}
  9519		return wr.stream.id
  9520	}
  9521	
  9522	// isControl reports whether wr is a control frame for MaxQueuedControlFrames
  9523	// purposes. That includes non-stream frames and RST_STREAM frames.
  9524	func (wr http2FrameWriteRequest) isControl() bool {
  9525		return wr.stream == nil
  9526	}
  9527	
  9528	// DataSize returns the number of flow control bytes that must be consumed
  9529	// to write this entire frame. This is 0 for non-DATA frames.
  9530	func (wr http2FrameWriteRequest) DataSize() int {
  9531		if wd, ok := wr.write.(*http2writeData); ok {
  9532			return len(wd.p)
  9533		}
  9534		return 0
  9535	}
  9536	
  9537	// Consume consumes min(n, available) bytes from this frame, where available
  9538	// is the number of flow control bytes available on the stream. Consume returns
  9539	// 0, 1, or 2 frames, where the integer return value gives the number of frames
  9540	// returned.
  9541	//
  9542	// If flow control prevents consuming any bytes, this returns (_, _, 0). If
  9543	// the entire frame was consumed, this returns (wr, _, 1). Otherwise, this
  9544	// returns (consumed, rest, 2), where 'consumed' contains the consumed bytes and
  9545	// 'rest' contains the remaining bytes. The consumed bytes are deducted from the
  9546	// underlying stream's flow control budget.
  9547	func (wr http2FrameWriteRequest) Consume(n int32) (http2FrameWriteRequest, http2FrameWriteRequest, int) {
  9548		var empty http2FrameWriteRequest
  9549	
  9550		// Non-DATA frames are always consumed whole.
  9551		wd, ok := wr.write.(*http2writeData)
  9552		if !ok || len(wd.p) == 0 {
  9553			return wr, empty, 1
  9554		}
  9555	
  9556		// Might need to split after applying limits.
  9557		allowed := wr.stream.flow.available()
  9558		if n < allowed {
  9559			allowed = n
  9560		}
  9561		if wr.stream.sc.maxFrameSize < allowed {
  9562			allowed = wr.stream.sc.maxFrameSize
  9563		}
  9564		if allowed <= 0 {
  9565			return empty, empty, 0
  9566		}
  9567		if len(wd.p) > int(allowed) {
  9568			wr.stream.flow.take(allowed)
  9569			consumed := http2FrameWriteRequest{
  9570				stream: wr.stream,
  9571				write: &http2writeData{
  9572					streamID: wd.streamID,
  9573					p:        wd.p[:allowed],
  9574					// Even if the original had endStream set, there
  9575					// are bytes remaining because len(wd.p) > allowed,
  9576					// so we know endStream is false.
  9577					endStream: false,
  9578				},
  9579				// Our caller is blocking on the final DATA frame, not
  9580				// this intermediate frame, so no need to wait.
  9581				done: nil,
  9582			}
  9583			rest := http2FrameWriteRequest{
  9584				stream: wr.stream,
  9585				write: &http2writeData{
  9586					streamID:  wd.streamID,
  9587					p:         wd.p[allowed:],
  9588					endStream: wd.endStream,
  9589				},
  9590				done: wr.done,
  9591			}
  9592			return consumed, rest, 2
  9593		}
  9594	
  9595		// The frame is consumed whole.
  9596		// NB: This cast cannot overflow because allowed is <= math.MaxInt32.
  9597		wr.stream.flow.take(int32(len(wd.p)))
  9598		return wr, empty, 1
  9599	}
  9600	
  9601	// String is for debugging only.
  9602	func (wr http2FrameWriteRequest) String() string {
  9603		var des string
  9604		if s, ok := wr.write.(fmt.Stringer); ok {
  9605			des = s.String()
  9606		} else {
  9607			des = fmt.Sprintf("%T", wr.write)
  9608		}
  9609		return fmt.Sprintf("[FrameWriteRequest stream=%d, ch=%v, writer=%v]", wr.StreamID(), wr.done != nil, des)
  9610	}
  9611	
  9612	// replyToWriter sends err to wr.done and panics if the send must block
  9613	// This does nothing if wr.done is nil.
  9614	func (wr *http2FrameWriteRequest) replyToWriter(err error) {
  9615		if wr.done == nil {
  9616			return
  9617		}
  9618		select {
  9619		case wr.done <- err:
  9620		default:
  9621			panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wr.write))
  9622		}
  9623		wr.write = nil // prevent use (assume it's tainted after wr.done send)
  9624	}
  9625	
  9626	// writeQueue is used by implementations of WriteScheduler.
  9627	type http2writeQueue struct {
  9628		s []http2FrameWriteRequest
  9629	}
  9630	
  9631	func (q *http2writeQueue) empty() bool { return len(q.s) == 0 }
  9632	
  9633	func (q *http2writeQueue) push(wr http2FrameWriteRequest) {
  9634		q.s = append(q.s, wr)
  9635	}
  9636	
  9637	func (q *http2writeQueue) shift() http2FrameWriteRequest {
  9638		if len(q.s) == 0 {
  9639			panic("invalid use of queue")
  9640		}
  9641		wr := q.s[0]
  9642		// TODO: less copy-happy queue.
  9643		copy(q.s, q.s[1:])
  9644		q.s[len(q.s)-1] = http2FrameWriteRequest{}
  9645		q.s = q.s[:len(q.s)-1]
  9646		return wr
  9647	}
  9648	
  9649	// consume consumes up to n bytes from q.s[0]. If the frame is
  9650	// entirely consumed, it is removed from the queue. If the frame
  9651	// is partially consumed, the frame is kept with the consumed
  9652	// bytes removed. Returns true iff any bytes were consumed.
  9653	func (q *http2writeQueue) consume(n int32) (http2FrameWriteRequest, bool) {
  9654		if len(q.s) == 0 {
  9655			return http2FrameWriteRequest{}, false
  9656		}
  9657		consumed, rest, numresult := q.s[0].Consume(n)
  9658		switch numresult {
  9659		case 0:
  9660			return http2FrameWriteRequest{}, false
  9661		case 1:
  9662			q.shift()
  9663		case 2:
  9664			q.s[0] = rest
  9665		}
  9666		return consumed, true
  9667	}
  9668	
  9669	type http2writeQueuePool []*http2writeQueue
  9670	
  9671	// put inserts an unused writeQueue into the pool.
  9672	
  9673	// put inserts an unused writeQueue into the pool.
  9674	func (p *http2writeQueuePool) put(q *http2writeQueue) {
  9675		for i := range q.s {
  9676			q.s[i] = http2FrameWriteRequest{}
  9677		}
  9678		q.s = q.s[:0]
  9679		*p = append(*p, q)
  9680	}
  9681	
  9682	// get returns an empty writeQueue.
  9683	func (p *http2writeQueuePool) get() *http2writeQueue {
  9684		ln := len(*p)
  9685		if ln == 0 {
  9686			return new(http2writeQueue)
  9687		}
  9688		x := ln - 1
  9689		q := (*p)[x]
  9690		(*p)[x] = nil
  9691		*p = (*p)[:x]
  9692		return q
  9693	}
  9694	
  9695	// RFC 7540, Section 5.3.5: the default weight is 16.
  9696	const http2priorityDefaultWeight = 15 // 16 = 15 + 1
  9697	
  9698	// PriorityWriteSchedulerConfig configures a priorityWriteScheduler.
  9699	type http2PriorityWriteSchedulerConfig struct {
  9700		// MaxClosedNodesInTree controls the maximum number of closed streams to
  9701		// retain in the priority tree. Setting this to zero saves a small amount
  9702		// of memory at the cost of performance.
  9703		//
  9704		// See RFC 7540, Section 5.3.4:
  9705		//   "It is possible for a stream to become closed while prioritization
  9706		//   information ... is in transit. ... This potentially creates suboptimal
  9707		//   prioritization, since the stream could be given a priority that is
  9708		//   different from what is intended. To avoid these problems, an endpoint
  9709		//   SHOULD retain stream prioritization state for a period after streams
  9710		//   become closed. The longer state is retained, the lower the chance that
  9711		//   streams are assigned incorrect or default priority values."
  9712		MaxClosedNodesInTree int
  9713	
  9714		// MaxIdleNodesInTree controls the maximum number of idle streams to
  9715		// retain in the priority tree. Setting this to zero saves a small amount
  9716		// of memory at the cost of performance.
  9717		//
  9718		// See RFC 7540, Section 5.3.4:
  9719		//   Similarly, streams that are in the "idle" state can be assigned
  9720		//   priority or become a parent of other streams. This allows for the
  9721		//   creation of a grouping node in the dependency tree, which enables
  9722		//   more flexible expressions of priority. Idle streams begin with a
  9723		//   default priority (Section 5.3.5).
  9724		MaxIdleNodesInTree int
  9725	
  9726		// ThrottleOutOfOrderWrites enables write throttling to help ensure that
  9727		// data is delivered in priority order. This works around a race where
  9728		// stream B depends on stream A and both streams are about to call Write
  9729		// to queue DATA frames. If B wins the race, a naive scheduler would eagerly
  9730		// write as much data from B as possible, but this is suboptimal because A
  9731		// is a higher-priority stream. With throttling enabled, we write a small
  9732		// amount of data from B to minimize the amount of bandwidth that B can
  9733		// steal from A.
  9734		ThrottleOutOfOrderWrites bool
  9735	}
  9736	
  9737	// NewPriorityWriteScheduler constructs a WriteScheduler that schedules
  9738	// frames by following HTTP/2 priorities as described in RFC 7540 Section 5.3.
  9739	// If cfg is nil, default options are used.
  9740	func http2NewPriorityWriteScheduler(cfg *http2PriorityWriteSchedulerConfig) http2WriteScheduler {
  9741		if cfg == nil {
  9742			// For justification of these defaults, see:
  9743			// https://docs.google.com/document/d/1oLhNg1skaWD4_DtaoCxdSRN5erEXrH-KnLrMwEpOtFY
  9744			cfg = &http2PriorityWriteSchedulerConfig{
  9745				MaxClosedNodesInTree:     10,
  9746				MaxIdleNodesInTree:       10,
  9747				ThrottleOutOfOrderWrites: false,
  9748			}
  9749		}
  9750	
  9751		ws := &http2priorityWriteScheduler{
  9752			nodes:                make(map[uint32]*http2priorityNode),
  9753			maxClosedNodesInTree: cfg.MaxClosedNodesInTree,
  9754			maxIdleNodesInTree:   cfg.MaxIdleNodesInTree,
  9755			enableWriteThrottle:  cfg.ThrottleOutOfOrderWrites,
  9756		}
  9757		ws.nodes[0] = &ws.root
  9758		if cfg.ThrottleOutOfOrderWrites {
  9759			ws.writeThrottleLimit = 1024
  9760		} else {
  9761			ws.writeThrottleLimit = math.MaxInt32
  9762		}
  9763		return ws
  9764	}
  9765	
  9766	type http2priorityNodeState int
  9767	
  9768	const (
  9769		http2priorityNodeOpen http2priorityNodeState = iota
  9770		http2priorityNodeClosed
  9771		http2priorityNodeIdle
  9772	)
  9773	
  9774	// priorityNode is a node in an HTTP/2 priority tree.
  9775	// Each node is associated with a single stream ID.
  9776	// See RFC 7540, Section 5.3.
  9777	type http2priorityNode struct {
  9778		q            http2writeQueue        // queue of pending frames to write
  9779		id           uint32                 // id of the stream, or 0 for the root of the tree
  9780		weight       uint8                  // the actual weight is weight+1, so the value is in [1,256]
  9781		state        http2priorityNodeState // open | closed | idle
  9782		bytes        int64                  // number of bytes written by this node, or 0 if closed
  9783		subtreeBytes int64                  // sum(node.bytes) of all nodes in this subtree
  9784	
  9785		// These links form the priority tree.
  9786		parent     *http2priorityNode
  9787		kids       *http2priorityNode // start of the kids list
  9788		prev, next *http2priorityNode // doubly-linked list of siblings
  9789	}
  9790	
  9791	func (n *http2priorityNode) setParent(parent *http2priorityNode) {
  9792		if n == parent {
  9793			panic("setParent to self")
  9794		}
  9795		if n.parent == parent {
  9796			return
  9797		}
  9798		// Unlink from current parent.
  9799		if parent := n.parent; parent != nil {
  9800			if n.prev == nil {
  9801				parent.kids = n.next
  9802			} else {
  9803				n.prev.next = n.next
  9804			}
  9805			if n.next != nil {
  9806				n.next.prev = n.prev
  9807			}
  9808		}
  9809		// Link to new parent.
  9810		// If parent=nil, remove n from the tree.
  9811		// Always insert at the head of parent.kids (this is assumed by walkReadyInOrder).
  9812		n.parent = parent
  9813		if parent == nil {
  9814			n.next = nil
  9815			n.prev = nil
  9816		} else {
  9817			n.next = parent.kids
  9818			n.prev = nil
  9819			if n.next != nil {
  9820				n.next.prev = n
  9821			}
  9822			parent.kids = n
  9823		}
  9824	}
  9825	
  9826	func (n *http2priorityNode) addBytes(b int64) {
  9827		n.bytes += b
  9828		for ; n != nil; n = n.parent {
  9829			n.subtreeBytes += b
  9830		}
  9831	}
  9832	
  9833	// walkReadyInOrder iterates over the tree in priority order, calling f for each node
  9834	// with a non-empty write queue. When f returns true, this funcion returns true and the
  9835	// walk halts. tmp is used as scratch space for sorting.
  9836	//
  9837	// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true
  9838	// if any ancestor p of n is still open (ignoring the root node).
  9839	func (n *http2priorityNode) walkReadyInOrder(openParent bool, tmp *[]*http2priorityNode, f func(*http2priorityNode, bool) bool) bool {
  9840		if !n.q.empty() && f(n, openParent) {
  9841			return true
  9842		}
  9843		if n.kids == nil {
  9844			return false
  9845		}
  9846	
  9847		// Don't consider the root "open" when updating openParent since
  9848		// we can't send data frames on the root stream (only control frames).
  9849		if n.id != 0 {
  9850			openParent = openParent || (n.state == http2priorityNodeOpen)
  9851		}
  9852	
  9853		// Common case: only one kid or all kids have the same weight.
  9854		// Some clients don't use weights; other clients (like web browsers)
  9855		// use mostly-linear priority trees.
  9856		w := n.kids.weight
  9857		needSort := false
  9858		for k := n.kids.next; k != nil; k = k.next {
  9859			if k.weight != w {
  9860				needSort = true
  9861				break
  9862			}
  9863		}
  9864		if !needSort {
  9865			for k := n.kids; k != nil; k = k.next {
  9866				if k.walkReadyInOrder(openParent, tmp, f) {
  9867					return true
  9868				}
  9869			}
  9870			return false
  9871		}
  9872	
  9873		// Uncommon case: sort the child nodes. We remove the kids from the parent,
  9874		// then re-insert after sorting so we can reuse tmp for future sort calls.
  9875		*tmp = (*tmp)[:0]
  9876		for n.kids != nil {
  9877			*tmp = append(*tmp, n.kids)
  9878			n.kids.setParent(nil)
  9879		}
  9880		sort.Sort(http2sortPriorityNodeSiblings(*tmp))
  9881		for i := len(*tmp) - 1; i >= 0; i-- {
  9882			(*tmp)[i].setParent(n) // setParent inserts at the head of n.kids
  9883		}
  9884		for k := n.kids; k != nil; k = k.next {
  9885			if k.walkReadyInOrder(openParent, tmp, f) {
  9886				return true
  9887			}
  9888		}
  9889		return false
  9890	}
  9891	
  9892	type http2sortPriorityNodeSiblings []*http2priorityNode
  9893	
  9894	func (z http2sortPriorityNodeSiblings) Len() int { return len(z) }
  9895	
  9896	func (z http2sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] }
  9897	
  9898	func (z http2sortPriorityNodeSiblings) Less(i, k int) bool {
  9899		// Prefer the subtree that has sent fewer bytes relative to its weight.
  9900		// See sections 5.3.2 and 5.3.4.
  9901		wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes)
  9902		wk, bk := float64(z[k].weight+1), float64(z[k].subtreeBytes)
  9903		if bi == 0 && bk == 0 {
  9904			return wi >= wk
  9905		}
  9906		if bk == 0 {
  9907			return false
  9908		}
  9909		return bi/bk <= wi/wk
  9910	}
  9911	
  9912	type http2priorityWriteScheduler struct {
  9913		// root is the root of the priority tree, where root.id = 0.
  9914		// The root queues control frames that are not associated with any stream.
  9915		root http2priorityNode
  9916	
  9917		// nodes maps stream ids to priority tree nodes.
  9918		nodes map[uint32]*http2priorityNode
  9919	
  9920		// maxID is the maximum stream id in nodes.
  9921		maxID uint32
  9922	
  9923		// lists of nodes that have been closed or are idle, but are kept in
  9924		// the tree for improved prioritization. When the lengths exceed either
  9925		// maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded.
  9926		closedNodes, idleNodes []*http2priorityNode
  9927	
  9928		// From the config.
  9929		maxClosedNodesInTree int
  9930		maxIdleNodesInTree   int
  9931		writeThrottleLimit   int32
  9932		enableWriteThrottle  bool
  9933	
  9934		// tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations.
  9935		tmp []*http2priorityNode
  9936	
  9937		// pool of empty queues for reuse.
  9938		queuePool http2writeQueuePool
  9939	}
  9940	
  9941	func (ws *http2priorityWriteScheduler) OpenStream(streamID uint32, options http2OpenStreamOptions) {
  9942		// The stream may be currently idle but cannot be opened or closed.
  9943		if curr := ws.nodes[streamID]; curr != nil {
  9944			if curr.state != http2priorityNodeIdle {
  9945				panic(fmt.Sprintf("stream %d already opened", streamID))
  9946			}
  9947			curr.state = http2priorityNodeOpen
  9948			return
  9949		}
  9950	
  9951		// RFC 7540, Section 5.3.5:
  9952		//  "All streams are initially assigned a non-exclusive dependency on stream 0x0.
  9953		//  Pushed streams initially depend on their associated stream. In both cases,
  9954		//  streams are assigned a default weight of 16."
  9955		parent := ws.nodes[options.PusherID]
  9956		if parent == nil {
  9957			parent = &ws.root
  9958		}
  9959		n := &http2priorityNode{
  9960			q:      *ws.queuePool.get(),
  9961			id:     streamID,
  9962			weight: http2priorityDefaultWeight,
  9963			state:  http2priorityNodeOpen,
  9964		}
  9965		n.setParent(parent)
  9966		ws.nodes[streamID] = n
  9967		if streamID > ws.maxID {
  9968			ws.maxID = streamID
  9969		}
  9970	}
  9971	
  9972	func (ws *http2priorityWriteScheduler) CloseStream(streamID uint32) {
  9973		if streamID == 0 {
  9974			panic("violation of WriteScheduler interface: cannot close stream 0")
  9975		}
  9976		if ws.nodes[streamID] == nil {
  9977			panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID))
  9978		}
  9979		if ws.nodes[streamID].state != http2priorityNodeOpen {
  9980			panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID))
  9981		}
  9982	
  9983		n := ws.nodes[streamID]
  9984		n.state = http2priorityNodeClosed
  9985		n.addBytes(-n.bytes)
  9986	
  9987		q := n.q
  9988		ws.queuePool.put(&q)
  9989		n.q.s = nil
  9990		if ws.maxClosedNodesInTree > 0 {
  9991			ws.addClosedOrIdleNode(&ws.closedNodes, ws.maxClosedNodesInTree, n)
  9992		} else {
  9993			ws.removeNode(n)
  9994		}
  9995	}
  9996	
  9997	func (ws *http2priorityWriteScheduler) AdjustStream(streamID uint32, priority http2PriorityParam) {
  9998		if streamID == 0 {
  9999			panic("adjustPriority on root")
 10000		}
 10001	
 10002		// If streamID does not exist, there are two cases:
 10003		// - A closed stream that has been removed (this will have ID <= maxID)
 10004		// - An idle stream that is being used for "grouping" (this will have ID > maxID)
 10005		n := ws.nodes[streamID]
 10006		if n == nil {
 10007			if streamID <= ws.maxID || ws.maxIdleNodesInTree == 0 {
 10008				return
 10009			}
 10010			ws.maxID = streamID
 10011			n = &http2priorityNode{
 10012				q:      *ws.queuePool.get(),
 10013				id:     streamID,
 10014				weight: http2priorityDefaultWeight,
 10015				state:  http2priorityNodeIdle,
 10016			}
 10017			n.setParent(&ws.root)
 10018			ws.nodes[streamID] = n
 10019			ws.addClosedOrIdleNode(&ws.idleNodes, ws.maxIdleNodesInTree, n)
 10020		}
 10021	
 10022		// Section 5.3.1: A dependency on a stream that is not currently in the tree
 10023		// results in that stream being given a default priority (Section 5.3.5).
 10024		parent := ws.nodes[priority.StreamDep]
 10025		if parent == nil {
 10026			n.setParent(&ws.root)
 10027			n.weight = http2priorityDefaultWeight
 10028			return
 10029		}
 10030	
 10031		// Ignore if the client tries to make a node its own parent.
 10032		if n == parent {
 10033			return
 10034		}
 10035	
 10036		// Section 5.3.3:
 10037		//   "If a stream is made dependent on one of its own dependencies, the
 10038		//   formerly dependent stream is first moved to be dependent on the
 10039		//   reprioritized stream's previous parent. The moved dependency retains
 10040		//   its weight."
 10041		//
 10042		// That is: if parent depends on n, move parent to depend on n.parent.
 10043		for x := parent.parent; x != nil; x = x.parent {
 10044			if x == n {
 10045				parent.setParent(n.parent)
 10046				break
 10047			}
 10048		}
 10049	
 10050		// Section 5.3.3: The exclusive flag causes the stream to become the sole
 10051		// dependency of its parent stream, causing other dependencies to become
 10052		// dependent on the exclusive stream.
 10053		if priority.Exclusive {
 10054			k := parent.kids
 10055			for k != nil {
 10056				next := k.next
 10057				if k != n {
 10058					k.setParent(n)
 10059				}
 10060				k = next
 10061			}
 10062		}
 10063	
 10064		n.setParent(parent)
 10065		n.weight = priority.Weight
 10066	}
 10067	
 10068	func (ws *http2priorityWriteScheduler) Push(wr http2FrameWriteRequest) {
 10069		var n *http2priorityNode
 10070		if id := wr.StreamID(); id == 0 {
 10071			n = &ws.root
 10072		} else {
 10073			n = ws.nodes[id]
 10074			if n == nil {
 10075				// id is an idle or closed stream. wr should not be a HEADERS or
 10076				// DATA frame. However, wr can be a RST_STREAM. In this case, we
 10077				// push wr onto the root, rather than creating a new priorityNode,
 10078				// since RST_STREAM is tiny and the stream's priority is unknown
 10079				// anyway. See issue #17919.
 10080				if wr.DataSize() > 0 {
 10081					panic("add DATA on non-open stream")
 10082				}
 10083				n = &ws.root
 10084			}
 10085		}
 10086		n.q.push(wr)
 10087	}
 10088	
 10089	func (ws *http2priorityWriteScheduler) Pop() (wr http2FrameWriteRequest, ok bool) {
 10090		ws.root.walkReadyInOrder(false, &ws.tmp, func(n *http2priorityNode, openParent bool) bool {
 10091			limit := int32(math.MaxInt32)
 10092			if openParent {
 10093				limit = ws.writeThrottleLimit
 10094			}
 10095			wr, ok = n.q.consume(limit)
 10096			if !ok {
 10097				return false
 10098			}
 10099			n.addBytes(int64(wr.DataSize()))
 10100			// If B depends on A and B continuously has data available but A
 10101			// does not, gradually increase the throttling limit to allow B to
 10102			// steal more and more bandwidth from A.
 10103			if openParent {
 10104				ws.writeThrottleLimit += 1024
 10105				if ws.writeThrottleLimit < 0 {
 10106					ws.writeThrottleLimit = math.MaxInt32
 10107				}
 10108			} else if ws.enableWriteThrottle {
 10109				ws.writeThrottleLimit = 1024
 10110			}
 10111			return true
 10112		})
 10113		return wr, ok
 10114	}
 10115	
 10116	func (ws *http2priorityWriteScheduler) addClosedOrIdleNode(list *[]*http2priorityNode, maxSize int, n *http2priorityNode) {
 10117		if maxSize == 0 {
 10118			return
 10119		}
 10120		if len(*list) == maxSize {
 10121			// Remove the oldest node, then shift left.
 10122			ws.removeNode((*list)[0])
 10123			x := (*list)[1:]
 10124			copy(*list, x)
 10125			*list = (*list)[:len(x)]
 10126		}
 10127		*list = append(*list, n)
 10128	}
 10129	
 10130	func (ws *http2priorityWriteScheduler) removeNode(n *http2priorityNode) {
 10131		for k := n.kids; k != nil; k = k.next {
 10132			k.setParent(n.parent)
 10133		}
 10134		n.setParent(nil)
 10135		delete(ws.nodes, n.id)
 10136	}
 10137	
 10138	// NewRandomWriteScheduler constructs a WriteScheduler that ignores HTTP/2
 10139	// priorities. Control frames like SETTINGS and PING are written before DATA
 10140	// frames, but if no control frames are queued and multiple streams have queued
 10141	// HEADERS or DATA frames, Pop selects a ready stream arbitrarily.
 10142	func http2NewRandomWriteScheduler() http2WriteScheduler {
 10143		return &http2randomWriteScheduler{sq: make(map[uint32]*http2writeQueue)}
 10144	}
 10145	
 10146	type http2randomWriteScheduler struct {
 10147		// zero are frames not associated with a specific stream.
 10148		zero http2writeQueue
 10149	
 10150		// sq contains the stream-specific queues, keyed by stream ID.
 10151		// When a stream is idle, closed, or emptied, it's deleted
 10152		// from the map.
 10153		sq map[uint32]*http2writeQueue
 10154	
 10155		// pool of empty queues for reuse.
 10156		queuePool http2writeQueuePool
 10157	}
 10158	
 10159	func (ws *http2randomWriteScheduler) OpenStream(streamID uint32, options http2OpenStreamOptions) {
 10160		// no-op: idle streams are not tracked
 10161	}
 10162	
 10163	func (ws *http2randomWriteScheduler) CloseStream(streamID uint32) {
 10164		q, ok := ws.sq[streamID]
 10165		if !ok {
 10166			return
 10167		}
 10168		delete(ws.sq, streamID)
 10169		ws.queuePool.put(q)
 10170	}
 10171	
 10172	func (ws *http2randomWriteScheduler) AdjustStream(streamID uint32, priority http2PriorityParam) {
 10173		// no-op: priorities are ignored
 10174	}
 10175	
 10176	func (ws *http2randomWriteScheduler) Push(wr http2FrameWriteRequest) {
 10177		id := wr.StreamID()
 10178		if id == 0 {
 10179			ws.zero.push(wr)
 10180			return
 10181		}
 10182		q, ok := ws.sq[id]
 10183		if !ok {
 10184			q = ws.queuePool.get()
 10185			ws.sq[id] = q
 10186		}
 10187		q.push(wr)
 10188	}
 10189	
 10190	func (ws *http2randomWriteScheduler) Pop() (http2FrameWriteRequest, bool) {
 10191		// Control frames first.
 10192		if !ws.zero.empty() {
 10193			return ws.zero.shift(), true
 10194		}
 10195		// Iterate over all non-idle streams until finding one that can be consumed.
 10196		for streamID, q := range ws.sq {
 10197			if wr, ok := q.consume(math.MaxInt32); ok {
 10198				if q.empty() {
 10199					delete(ws.sq, streamID)
 10200					ws.queuePool.put(q)
 10201				}
 10202				return wr, true
 10203			}
 10204		}
 10205		return http2FrameWriteRequest{}, false
 10206	}
 10207	

View as plain text