Use h2c from x/net to handle h2c requests
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
This commit is contained in:
parent
c7d336f958
commit
4360ca14c1
224 changed files with 22414 additions and 11768 deletions
8
Gopkg.lock
generated
8
Gopkg.lock
generated
|
@ -1677,7 +1677,7 @@
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:62afa19ba5d4c75369a1d6446688e33ef3c04a40aeedd819cf044a509747b563"
|
digest = "1:4d0fb9f19b2af3461e900a526395330403b39d839f126b66312215f153892ccc"
|
||||||
name = "golang.org/x/net"
|
name = "golang.org/x/net"
|
||||||
packages = [
|
packages = [
|
||||||
"bpf",
|
"bpf",
|
||||||
|
@ -1685,6 +1685,7 @@
|
||||||
"context/ctxhttp",
|
"context/ctxhttp",
|
||||||
"http/httpguts",
|
"http/httpguts",
|
||||||
"http2",
|
"http2",
|
||||||
|
"http2/h2c",
|
||||||
"http2/hpack",
|
"http2/hpack",
|
||||||
"idna",
|
"idna",
|
||||||
"internal/iana",
|
"internal/iana",
|
||||||
|
@ -1699,7 +1700,7 @@
|
||||||
"websocket",
|
"websocket",
|
||||||
]
|
]
|
||||||
pruneopts = "NUT"
|
pruneopts = "NUT"
|
||||||
revision = "e514e69ffb8bc3c76a71ae40de0118d794855992"
|
revision = "da137c7871d730100384dbcf36e6f8fa493aef5b"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
|
@ -2301,9 +2302,8 @@
|
||||||
"github.com/vulcand/oxy/roundrobin",
|
"github.com/vulcand/oxy/roundrobin",
|
||||||
"github.com/vulcand/oxy/utils",
|
"github.com/vulcand/oxy/utils",
|
||||||
"github.com/vulcand/predicate",
|
"github.com/vulcand/predicate",
|
||||||
"golang.org/x/net/http/httpguts",
|
|
||||||
"golang.org/x/net/http2",
|
"golang.org/x/net/http2",
|
||||||
"golang.org/x/net/http2/hpack",
|
"golang.org/x/net/http2/h2c",
|
||||||
"golang.org/x/net/websocket",
|
"golang.org/x/net/websocket",
|
||||||
"google.golang.org/grpc",
|
"google.golang.org/grpc",
|
||||||
"google.golang.org/grpc/credentials",
|
"google.golang.org/grpc/credentials",
|
||||||
|
|
|
@ -10,13 +10,14 @@ import (
|
||||||
|
|
||||||
"github.com/armon/go-proxyproto"
|
"github.com/armon/go-proxyproto"
|
||||||
"github.com/containous/traefik/pkg/config/static"
|
"github.com/containous/traefik/pkg/config/static"
|
||||||
"github.com/containous/traefik/pkg/h2c"
|
|
||||||
"github.com/containous/traefik/pkg/ip"
|
"github.com/containous/traefik/pkg/ip"
|
||||||
"github.com/containous/traefik/pkg/log"
|
"github.com/containous/traefik/pkg/log"
|
||||||
"github.com/containous/traefik/pkg/middlewares"
|
"github.com/containous/traefik/pkg/middlewares"
|
||||||
"github.com/containous/traefik/pkg/middlewares/forwardedheaders"
|
"github.com/containous/traefik/pkg/middlewares/forwardedheaders"
|
||||||
"github.com/containous/traefik/pkg/safe"
|
"github.com/containous/traefik/pkg/safe"
|
||||||
"github.com/containous/traefik/pkg/tcp"
|
"github.com/containous/traefik/pkg/tcp"
|
||||||
|
"golang.org/x/net/http2"
|
||||||
|
"golang.org/x/net/http2/h2c"
|
||||||
)
|
)
|
||||||
|
|
||||||
type httpForwarder struct {
|
type httpForwarder struct {
|
||||||
|
@ -336,7 +337,10 @@ type httpServer struct {
|
||||||
|
|
||||||
func createHTTPServer(ln net.Listener, configuration *static.EntryPoint, withH2c bool) (*httpServer, error) {
|
func createHTTPServer(ln net.Listener, configuration *static.EntryPoint, withH2c bool) (*httpServer, error) {
|
||||||
httpSwitcher := middlewares.NewHandlerSwitcher(buildDefaultHTTPRouter())
|
httpSwitcher := middlewares.NewHandlerSwitcher(buildDefaultHTTPRouter())
|
||||||
handler, err := forwardedheaders.NewXForwarded(
|
|
||||||
|
var handler http.Handler
|
||||||
|
var err error
|
||||||
|
handler, err = forwardedheaders.NewXForwarded(
|
||||||
configuration.ForwardedHeaders.Insecure,
|
configuration.ForwardedHeaders.Insecure,
|
||||||
configuration.ForwardedHeaders.TrustedIPs,
|
configuration.ForwardedHeaders.TrustedIPs,
|
||||||
httpSwitcher)
|
httpSwitcher)
|
||||||
|
@ -344,19 +348,13 @@ func createHTTPServer(ln net.Listener, configuration *static.EntryPoint, withH2c
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var serverHTTP stoppableServer
|
|
||||||
|
|
||||||
if withH2c {
|
if withH2c {
|
||||||
serverHTTP = &h2c.Server{
|
handler = h2c.NewHandler(handler, &http2.Server{})
|
||||||
Server: &http.Server{
|
|
||||||
Handler: handler,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
serverHTTP = &http.Server{
|
serverHTTP := &http.Server{
|
||||||
Handler: handler,
|
Handler: handler,
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
listener := newHTTPForwarder(ln)
|
listener := newHTTPForwarder(ln)
|
||||||
go func() {
|
go func() {
|
||||||
|
|
22
vendor/golang.org/x/net/bpf/constants.go
generated
vendored
22
vendor/golang.org/x/net/bpf/constants.go
generated
vendored
|
@ -38,6 +38,7 @@ const (
|
||||||
type JumpTest uint16
|
type JumpTest uint16
|
||||||
|
|
||||||
// Supported operators for conditional jumps.
|
// Supported operators for conditional jumps.
|
||||||
|
// K can be RegX for JumpIfX
|
||||||
const (
|
const (
|
||||||
// K == A
|
// K == A
|
||||||
JumpEqual JumpTest = iota
|
JumpEqual JumpTest = iota
|
||||||
|
@ -134,12 +135,9 @@ const (
|
||||||
opMaskLoadDest = 0x01
|
opMaskLoadDest = 0x01
|
||||||
opMaskLoadWidth = 0x18
|
opMaskLoadWidth = 0x18
|
||||||
opMaskLoadMode = 0xe0
|
opMaskLoadMode = 0xe0
|
||||||
// opClsALU
|
// opClsALU & opClsJump
|
||||||
opMaskOperandSrc = 0x08
|
opMaskOperand = 0x08
|
||||||
opMaskOperator = 0xf0
|
opMaskOperator = 0xf0
|
||||||
// opClsJump
|
|
||||||
opMaskJumpConst = 0x0f
|
|
||||||
opMaskJumpCond = 0xf0
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -192,15 +190,21 @@ const (
|
||||||
opLoadWidth1
|
opLoadWidth1
|
||||||
)
|
)
|
||||||
|
|
||||||
// Operator defined by ALUOp*
|
// Operand for ALU and Jump instructions
|
||||||
|
type opOperand uint16
|
||||||
|
|
||||||
|
// Supported operand sources.
|
||||||
const (
|
const (
|
||||||
opALUSrcConstant uint16 = iota << 3
|
opOperandConstant opOperand = iota << 3
|
||||||
opALUSrcX
|
opOperandX
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// An jumpOp is a conditional jump condition.
|
||||||
|
type jumpOp uint16
|
||||||
|
|
||||||
|
// Supported jump conditions.
|
||||||
const (
|
const (
|
||||||
opJumpAlways = iota << 4
|
opJumpAlways jumpOp = iota << 4
|
||||||
opJumpEqual
|
opJumpEqual
|
||||||
opJumpGT
|
opJumpGT
|
||||||
opJumpGE
|
opJumpGE
|
||||||
|
|
194
vendor/golang.org/x/net/bpf/instructions.go
generated
vendored
194
vendor/golang.org/x/net/bpf/instructions.go
generated
vendored
|
@ -89,10 +89,14 @@ func (ri RawInstruction) Disassemble() Instruction {
|
||||||
case opClsALU:
|
case opClsALU:
|
||||||
switch op := ALUOp(ri.Op & opMaskOperator); op {
|
switch op := ALUOp(ri.Op & opMaskOperator); op {
|
||||||
case ALUOpAdd, ALUOpSub, ALUOpMul, ALUOpDiv, ALUOpOr, ALUOpAnd, ALUOpShiftLeft, ALUOpShiftRight, ALUOpMod, ALUOpXor:
|
case ALUOpAdd, ALUOpSub, ALUOpMul, ALUOpDiv, ALUOpOr, ALUOpAnd, ALUOpShiftLeft, ALUOpShiftRight, ALUOpMod, ALUOpXor:
|
||||||
if ri.Op&opMaskOperandSrc != 0 {
|
switch operand := opOperand(ri.Op & opMaskOperand); operand {
|
||||||
|
case opOperandX:
|
||||||
return ALUOpX{Op: op}
|
return ALUOpX{Op: op}
|
||||||
}
|
case opOperandConstant:
|
||||||
return ALUOpConstant{Op: op, Val: ri.K}
|
return ALUOpConstant{Op: op, Val: ri.K}
|
||||||
|
default:
|
||||||
|
return ri
|
||||||
|
}
|
||||||
case aluOpNeg:
|
case aluOpNeg:
|
||||||
return NegateA{}
|
return NegateA{}
|
||||||
default:
|
default:
|
||||||
|
@ -100,63 +104,18 @@ func (ri RawInstruction) Disassemble() Instruction {
|
||||||
}
|
}
|
||||||
|
|
||||||
case opClsJump:
|
case opClsJump:
|
||||||
if ri.Op&opMaskJumpConst != opClsJump {
|
switch op := jumpOp(ri.Op & opMaskOperator); op {
|
||||||
return ri
|
|
||||||
}
|
|
||||||
switch ri.Op & opMaskJumpCond {
|
|
||||||
case opJumpAlways:
|
case opJumpAlways:
|
||||||
return Jump{Skip: ri.K}
|
return Jump{Skip: ri.K}
|
||||||
case opJumpEqual:
|
case opJumpEqual, opJumpGT, opJumpGE, opJumpSet:
|
||||||
if ri.Jt == 0 {
|
cond, skipTrue, skipFalse := jumpOpToTest(op, ri.Jt, ri.Jf)
|
||||||
return JumpIf{
|
switch operand := opOperand(ri.Op & opMaskOperand); operand {
|
||||||
Cond: JumpNotEqual,
|
case opOperandX:
|
||||||
Val: ri.K,
|
return JumpIfX{Cond: cond, SkipTrue: skipTrue, SkipFalse: skipFalse}
|
||||||
SkipTrue: ri.Jf,
|
case opOperandConstant:
|
||||||
SkipFalse: 0,
|
return JumpIf{Cond: cond, Val: ri.K, SkipTrue: skipTrue, SkipFalse: skipFalse}
|
||||||
}
|
default:
|
||||||
}
|
return ri
|
||||||
return JumpIf{
|
|
||||||
Cond: JumpEqual,
|
|
||||||
Val: ri.K,
|
|
||||||
SkipTrue: ri.Jt,
|
|
||||||
SkipFalse: ri.Jf,
|
|
||||||
}
|
|
||||||
case opJumpGT:
|
|
||||||
if ri.Jt == 0 {
|
|
||||||
return JumpIf{
|
|
||||||
Cond: JumpLessOrEqual,
|
|
||||||
Val: ri.K,
|
|
||||||
SkipTrue: ri.Jf,
|
|
||||||
SkipFalse: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return JumpIf{
|
|
||||||
Cond: JumpGreaterThan,
|
|
||||||
Val: ri.K,
|
|
||||||
SkipTrue: ri.Jt,
|
|
||||||
SkipFalse: ri.Jf,
|
|
||||||
}
|
|
||||||
case opJumpGE:
|
|
||||||
if ri.Jt == 0 {
|
|
||||||
return JumpIf{
|
|
||||||
Cond: JumpLessThan,
|
|
||||||
Val: ri.K,
|
|
||||||
SkipTrue: ri.Jf,
|
|
||||||
SkipFalse: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return JumpIf{
|
|
||||||
Cond: JumpGreaterOrEqual,
|
|
||||||
Val: ri.K,
|
|
||||||
SkipTrue: ri.Jt,
|
|
||||||
SkipFalse: ri.Jf,
|
|
||||||
}
|
|
||||||
case opJumpSet:
|
|
||||||
return JumpIf{
|
|
||||||
Cond: JumpBitsSet,
|
|
||||||
Val: ri.K,
|
|
||||||
SkipTrue: ri.Jt,
|
|
||||||
SkipFalse: ri.Jf,
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return ri
|
return ri
|
||||||
|
@ -187,6 +146,41 @@ func (ri RawInstruction) Disassemble() Instruction {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func jumpOpToTest(op jumpOp, skipTrue uint8, skipFalse uint8) (JumpTest, uint8, uint8) {
|
||||||
|
var test JumpTest
|
||||||
|
|
||||||
|
// Decode "fake" jump conditions that don't appear in machine code
|
||||||
|
// Ensures the Assemble -> Disassemble stage recreates the same instructions
|
||||||
|
// See https://github.com/golang/go/issues/18470
|
||||||
|
if skipTrue == 0 {
|
||||||
|
switch op {
|
||||||
|
case opJumpEqual:
|
||||||
|
test = JumpNotEqual
|
||||||
|
case opJumpGT:
|
||||||
|
test = JumpLessOrEqual
|
||||||
|
case opJumpGE:
|
||||||
|
test = JumpLessThan
|
||||||
|
case opJumpSet:
|
||||||
|
test = JumpBitsNotSet
|
||||||
|
}
|
||||||
|
|
||||||
|
return test, skipFalse, 0
|
||||||
|
}
|
||||||
|
|
||||||
|
switch op {
|
||||||
|
case opJumpEqual:
|
||||||
|
test = JumpEqual
|
||||||
|
case opJumpGT:
|
||||||
|
test = JumpGreaterThan
|
||||||
|
case opJumpGE:
|
||||||
|
test = JumpGreaterOrEqual
|
||||||
|
case opJumpSet:
|
||||||
|
test = JumpBitsSet
|
||||||
|
}
|
||||||
|
|
||||||
|
return test, skipTrue, skipFalse
|
||||||
|
}
|
||||||
|
|
||||||
// LoadConstant loads Val into register Dst.
|
// LoadConstant loads Val into register Dst.
|
||||||
type LoadConstant struct {
|
type LoadConstant struct {
|
||||||
Dst Register
|
Dst Register
|
||||||
|
@ -413,7 +407,7 @@ type ALUOpConstant struct {
|
||||||
// Assemble implements the Instruction Assemble method.
|
// Assemble implements the Instruction Assemble method.
|
||||||
func (a ALUOpConstant) Assemble() (RawInstruction, error) {
|
func (a ALUOpConstant) Assemble() (RawInstruction, error) {
|
||||||
return RawInstruction{
|
return RawInstruction{
|
||||||
Op: opClsALU | opALUSrcConstant | uint16(a.Op),
|
Op: opClsALU | uint16(opOperandConstant) | uint16(a.Op),
|
||||||
K: a.Val,
|
K: a.Val,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -454,7 +448,7 @@ type ALUOpX struct {
|
||||||
// Assemble implements the Instruction Assemble method.
|
// Assemble implements the Instruction Assemble method.
|
||||||
func (a ALUOpX) Assemble() (RawInstruction, error) {
|
func (a ALUOpX) Assemble() (RawInstruction, error) {
|
||||||
return RawInstruction{
|
return RawInstruction{
|
||||||
Op: opClsALU | opALUSrcX | uint16(a.Op),
|
Op: opClsALU | uint16(opOperandX) | uint16(a.Op),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,7 +503,7 @@ type Jump struct {
|
||||||
// Assemble implements the Instruction Assemble method.
|
// Assemble implements the Instruction Assemble method.
|
||||||
func (a Jump) Assemble() (RawInstruction, error) {
|
func (a Jump) Assemble() (RawInstruction, error) {
|
||||||
return RawInstruction{
|
return RawInstruction{
|
||||||
Op: opClsJump | opJumpAlways,
|
Op: opClsJump | uint16(opJumpAlways),
|
||||||
K: a.Skip,
|
K: a.Skip,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -530,11 +524,39 @@ type JumpIf struct {
|
||||||
|
|
||||||
// Assemble implements the Instruction Assemble method.
|
// Assemble implements the Instruction Assemble method.
|
||||||
func (a JumpIf) Assemble() (RawInstruction, error) {
|
func (a JumpIf) Assemble() (RawInstruction, error) {
|
||||||
|
return jumpToRaw(a.Cond, opOperandConstant, a.Val, a.SkipTrue, a.SkipFalse)
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns the instruction in assembler notation.
|
||||||
|
func (a JumpIf) String() string {
|
||||||
|
return jumpToString(a.Cond, fmt.Sprintf("#%d", a.Val), a.SkipTrue, a.SkipFalse)
|
||||||
|
}
|
||||||
|
|
||||||
|
// JumpIfX skips the following Skip instructions in the program if A
|
||||||
|
// <Cond> X is true.
|
||||||
|
type JumpIfX struct {
|
||||||
|
Cond JumpTest
|
||||||
|
SkipTrue uint8
|
||||||
|
SkipFalse uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assemble implements the Instruction Assemble method.
|
||||||
|
func (a JumpIfX) Assemble() (RawInstruction, error) {
|
||||||
|
return jumpToRaw(a.Cond, opOperandX, 0, a.SkipTrue, a.SkipFalse)
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns the instruction in assembler notation.
|
||||||
|
func (a JumpIfX) String() string {
|
||||||
|
return jumpToString(a.Cond, "x", a.SkipTrue, a.SkipFalse)
|
||||||
|
}
|
||||||
|
|
||||||
|
// jumpToRaw assembles a jump instruction into a RawInstruction
|
||||||
|
func jumpToRaw(test JumpTest, operand opOperand, k uint32, skipTrue, skipFalse uint8) (RawInstruction, error) {
|
||||||
var (
|
var (
|
||||||
cond uint16
|
cond jumpOp
|
||||||
flip bool
|
flip bool
|
||||||
)
|
)
|
||||||
switch a.Cond {
|
switch test {
|
||||||
case JumpEqual:
|
case JumpEqual:
|
||||||
cond = opJumpEqual
|
cond = opJumpEqual
|
||||||
case JumpNotEqual:
|
case JumpNotEqual:
|
||||||
|
@ -552,63 +574,63 @@ func (a JumpIf) Assemble() (RawInstruction, error) {
|
||||||
case JumpBitsNotSet:
|
case JumpBitsNotSet:
|
||||||
cond, flip = opJumpSet, true
|
cond, flip = opJumpSet, true
|
||||||
default:
|
default:
|
||||||
return RawInstruction{}, fmt.Errorf("unknown JumpTest %v", a.Cond)
|
return RawInstruction{}, fmt.Errorf("unknown JumpTest %v", test)
|
||||||
}
|
}
|
||||||
jt, jf := a.SkipTrue, a.SkipFalse
|
jt, jf := skipTrue, skipFalse
|
||||||
if flip {
|
if flip {
|
||||||
jt, jf = jf, jt
|
jt, jf = jf, jt
|
||||||
}
|
}
|
||||||
return RawInstruction{
|
return RawInstruction{
|
||||||
Op: opClsJump | cond,
|
Op: opClsJump | uint16(cond) | uint16(operand),
|
||||||
Jt: jt,
|
Jt: jt,
|
||||||
Jf: jf,
|
Jf: jf,
|
||||||
K: a.Val,
|
K: k,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns the instruction in assembler notation.
|
// jumpToString converts a jump instruction to assembler notation
|
||||||
func (a JumpIf) String() string {
|
func jumpToString(cond JumpTest, operand string, skipTrue, skipFalse uint8) string {
|
||||||
switch a.Cond {
|
switch cond {
|
||||||
// K == A
|
// K == A
|
||||||
case JumpEqual:
|
case JumpEqual:
|
||||||
return conditionalJump(a, "jeq", "jneq")
|
return conditionalJump(operand, skipTrue, skipFalse, "jeq", "jneq")
|
||||||
// K != A
|
// K != A
|
||||||
case JumpNotEqual:
|
case JumpNotEqual:
|
||||||
return fmt.Sprintf("jneq #%d,%d", a.Val, a.SkipTrue)
|
return fmt.Sprintf("jneq %s,%d", operand, skipTrue)
|
||||||
// K > A
|
// K > A
|
||||||
case JumpGreaterThan:
|
case JumpGreaterThan:
|
||||||
return conditionalJump(a, "jgt", "jle")
|
return conditionalJump(operand, skipTrue, skipFalse, "jgt", "jle")
|
||||||
// K < A
|
// K < A
|
||||||
case JumpLessThan:
|
case JumpLessThan:
|
||||||
return fmt.Sprintf("jlt #%d,%d", a.Val, a.SkipTrue)
|
return fmt.Sprintf("jlt %s,%d", operand, skipTrue)
|
||||||
// K >= A
|
// K >= A
|
||||||
case JumpGreaterOrEqual:
|
case JumpGreaterOrEqual:
|
||||||
return conditionalJump(a, "jge", "jlt")
|
return conditionalJump(operand, skipTrue, skipFalse, "jge", "jlt")
|
||||||
// K <= A
|
// K <= A
|
||||||
case JumpLessOrEqual:
|
case JumpLessOrEqual:
|
||||||
return fmt.Sprintf("jle #%d,%d", a.Val, a.SkipTrue)
|
return fmt.Sprintf("jle %s,%d", operand, skipTrue)
|
||||||
// K & A != 0
|
// K & A != 0
|
||||||
case JumpBitsSet:
|
case JumpBitsSet:
|
||||||
if a.SkipFalse > 0 {
|
if skipFalse > 0 {
|
||||||
return fmt.Sprintf("jset #%d,%d,%d", a.Val, a.SkipTrue, a.SkipFalse)
|
return fmt.Sprintf("jset %s,%d,%d", operand, skipTrue, skipFalse)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("jset #%d,%d", a.Val, a.SkipTrue)
|
return fmt.Sprintf("jset %s,%d", operand, skipTrue)
|
||||||
// K & A == 0, there is no assembler instruction for JumpBitNotSet, use JumpBitSet and invert skips
|
// K & A == 0, there is no assembler instruction for JumpBitNotSet, use JumpBitSet and invert skips
|
||||||
case JumpBitsNotSet:
|
case JumpBitsNotSet:
|
||||||
return JumpIf{Cond: JumpBitsSet, SkipTrue: a.SkipFalse, SkipFalse: a.SkipTrue, Val: a.Val}.String()
|
return jumpToString(JumpBitsSet, operand, skipFalse, skipTrue)
|
||||||
default:
|
default:
|
||||||
return fmt.Sprintf("unknown instruction: %#v", a)
|
return fmt.Sprintf("unknown JumpTest %#v", cond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func conditionalJump(inst JumpIf, positiveJump, negativeJump string) string {
|
func conditionalJump(operand string, skipTrue, skipFalse uint8, positiveJump, negativeJump string) string {
|
||||||
if inst.SkipTrue > 0 {
|
if skipTrue > 0 {
|
||||||
if inst.SkipFalse > 0 {
|
if skipFalse > 0 {
|
||||||
return fmt.Sprintf("%s #%d,%d,%d", positiveJump, inst.Val, inst.SkipTrue, inst.SkipFalse)
|
return fmt.Sprintf("%s %s,%d,%d", positiveJump, operand, skipTrue, skipFalse)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%s #%d,%d", positiveJump, inst.Val, inst.SkipTrue)
|
return fmt.Sprintf("%s %s,%d", positiveJump, operand, skipTrue)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%s #%d,%d", negativeJump, inst.Val, inst.SkipFalse)
|
return fmt.Sprintf("%s %s,%d", negativeJump, operand, skipFalse)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RetA exits the BPF program, returning the value of register A.
|
// RetA exits the BPF program, returning the value of register A.
|
||||||
|
|
10
vendor/golang.org/x/net/bpf/vm.go
generated
vendored
10
vendor/golang.org/x/net/bpf/vm.go
generated
vendored
|
@ -35,6 +35,13 @@ func NewVM(filter []Instruction) (*VM, error) {
|
||||||
if check <= int(ins.SkipFalse) {
|
if check <= int(ins.SkipFalse) {
|
||||||
return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse)
|
return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse)
|
||||||
}
|
}
|
||||||
|
case JumpIfX:
|
||||||
|
if check <= int(ins.SkipTrue) {
|
||||||
|
return nil, fmt.Errorf("cannot jump %d instructions in true case; jumping past program bounds", ins.SkipTrue)
|
||||||
|
}
|
||||||
|
if check <= int(ins.SkipFalse) {
|
||||||
|
return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse)
|
||||||
|
}
|
||||||
// Check for division or modulus by zero
|
// Check for division or modulus by zero
|
||||||
case ALUOpConstant:
|
case ALUOpConstant:
|
||||||
if ins.Val != 0 {
|
if ins.Val != 0 {
|
||||||
|
@ -109,6 +116,9 @@ func (v *VM) Run(in []byte) (int, error) {
|
||||||
case JumpIf:
|
case JumpIf:
|
||||||
jump := jumpIf(ins, regA)
|
jump := jumpIf(ins, regA)
|
||||||
i += jump
|
i += jump
|
||||||
|
case JumpIfX:
|
||||||
|
jump := jumpIfX(ins, regA, regX)
|
||||||
|
i += jump
|
||||||
case LoadAbsolute:
|
case LoadAbsolute:
|
||||||
regA, ok = loadAbsolute(ins, in)
|
regA, ok = loadAbsolute(ins, in)
|
||||||
case LoadConstant:
|
case LoadConstant:
|
||||||
|
|
38
vendor/golang.org/x/net/bpf/vm_instructions.go
generated
vendored
38
vendor/golang.org/x/net/bpf/vm_instructions.go
generated
vendored
|
@ -55,34 +55,41 @@ func aluOpCommon(op ALUOp, regA uint32, value uint32) uint32 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func jumpIf(ins JumpIf, value uint32) int {
|
func jumpIf(ins JumpIf, regA uint32) int {
|
||||||
var ok bool
|
return jumpIfCommon(ins.Cond, ins.SkipTrue, ins.SkipFalse, regA, ins.Val)
|
||||||
inV := uint32(ins.Val)
|
}
|
||||||
|
|
||||||
switch ins.Cond {
|
func jumpIfX(ins JumpIfX, regA uint32, regX uint32) int {
|
||||||
|
return jumpIfCommon(ins.Cond, ins.SkipTrue, ins.SkipFalse, regA, regX)
|
||||||
|
}
|
||||||
|
|
||||||
|
func jumpIfCommon(cond JumpTest, skipTrue, skipFalse uint8, regA uint32, value uint32) int {
|
||||||
|
var ok bool
|
||||||
|
|
||||||
|
switch cond {
|
||||||
case JumpEqual:
|
case JumpEqual:
|
||||||
ok = value == inV
|
ok = regA == value
|
||||||
case JumpNotEqual:
|
case JumpNotEqual:
|
||||||
ok = value != inV
|
ok = regA != value
|
||||||
case JumpGreaterThan:
|
case JumpGreaterThan:
|
||||||
ok = value > inV
|
ok = regA > value
|
||||||
case JumpLessThan:
|
case JumpLessThan:
|
||||||
ok = value < inV
|
ok = regA < value
|
||||||
case JumpGreaterOrEqual:
|
case JumpGreaterOrEqual:
|
||||||
ok = value >= inV
|
ok = regA >= value
|
||||||
case JumpLessOrEqual:
|
case JumpLessOrEqual:
|
||||||
ok = value <= inV
|
ok = regA <= value
|
||||||
case JumpBitsSet:
|
case JumpBitsSet:
|
||||||
ok = (value & inV) != 0
|
ok = (regA & value) != 0
|
||||||
case JumpBitsNotSet:
|
case JumpBitsNotSet:
|
||||||
ok = (value & inV) == 0
|
ok = (regA & value) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
return int(ins.SkipTrue)
|
return int(skipTrue)
|
||||||
}
|
}
|
||||||
|
|
||||||
return int(ins.SkipFalse)
|
return int(skipFalse)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadAbsolute(ins LoadAbsolute, in []byte) (uint32, bool) {
|
func loadAbsolute(ins LoadAbsolute, in []byte) (uint32, bool) {
|
||||||
|
@ -122,7 +129,8 @@ func loadIndirect(ins LoadIndirect, in []byte, regX uint32) (uint32, bool) {
|
||||||
func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) {
|
func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) {
|
||||||
offset := int(ins.Off)
|
offset := int(ins.Off)
|
||||||
|
|
||||||
if !inBounds(len(in), offset, 0) {
|
// Size of LoadMemShift is always 1 byte
|
||||||
|
if !inBounds(len(in), offset, 1) {
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
5
vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go
generated
vendored
5
vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go
generated
vendored
|
@ -2,18 +2,15 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build go1.7
|
|
||||||
|
|
||||||
// Package ctxhttp provides helper functions for performing context-aware HTTP requests.
|
// Package ctxhttp provides helper functions for performing context-aware HTTP requests.
|
||||||
package ctxhttp // import "golang.org/x/net/context/ctxhttp"
|
package ctxhttp // import "golang.org/x/net/context/ctxhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Do sends an HTTP request with the provided http.Client and returns
|
// Do sends an HTTP request with the provided http.Client and returns
|
||||||
|
|
147
vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go
generated
vendored
147
vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go
generated
vendored
|
@ -1,147 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !go1.7
|
|
||||||
|
|
||||||
package ctxhttp // import "golang.org/x/net/context/ctxhttp"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
)
|
|
||||||
|
|
||||||
func nop() {}
|
|
||||||
|
|
||||||
var (
|
|
||||||
testHookContextDoneBeforeHeaders = nop
|
|
||||||
testHookDoReturned = nop
|
|
||||||
testHookDidBodyClose = nop
|
|
||||||
)
|
|
||||||
|
|
||||||
// Do sends an HTTP request with the provided http.Client and returns an HTTP response.
|
|
||||||
// If the client is nil, http.DefaultClient is used.
|
|
||||||
// If the context is canceled or times out, ctx.Err() will be returned.
|
|
||||||
func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
|
|
||||||
if client == nil {
|
|
||||||
client = http.DefaultClient
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(djd): Respect any existing value of req.Cancel.
|
|
||||||
cancel := make(chan struct{})
|
|
||||||
req.Cancel = cancel
|
|
||||||
|
|
||||||
type responseAndError struct {
|
|
||||||
resp *http.Response
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
result := make(chan responseAndError, 1)
|
|
||||||
|
|
||||||
// Make local copies of test hooks closed over by goroutines below.
|
|
||||||
// Prevents data races in tests.
|
|
||||||
testHookDoReturned := testHookDoReturned
|
|
||||||
testHookDidBodyClose := testHookDidBodyClose
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
resp, err := client.Do(req)
|
|
||||||
testHookDoReturned()
|
|
||||||
result <- responseAndError{resp, err}
|
|
||||||
}()
|
|
||||||
|
|
||||||
var resp *http.Response
|
|
||||||
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
testHookContextDoneBeforeHeaders()
|
|
||||||
close(cancel)
|
|
||||||
// Clean up after the goroutine calling client.Do:
|
|
||||||
go func() {
|
|
||||||
if r := <-result; r.resp != nil {
|
|
||||||
testHookDidBodyClose()
|
|
||||||
r.resp.Body.Close()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return nil, ctx.Err()
|
|
||||||
case r := <-result:
|
|
||||||
var err error
|
|
||||||
resp, err = r.resp, r.err
|
|
||||||
if err != nil {
|
|
||||||
return resp, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
c := make(chan struct{})
|
|
||||||
go func() {
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
close(cancel)
|
|
||||||
case <-c:
|
|
||||||
// The response's Body is closed.
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
resp.Body = ¬ifyingReader{resp.Body, c}
|
|
||||||
|
|
||||||
return resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get issues a GET request via the Do function.
|
|
||||||
func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
|
|
||||||
req, err := http.NewRequest("GET", url, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return Do(ctx, client, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Head issues a HEAD request via the Do function.
|
|
||||||
func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
|
|
||||||
req, err := http.NewRequest("HEAD", url, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return Do(ctx, client, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Post issues a POST request via the Do function.
|
|
||||||
func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) {
|
|
||||||
req, err := http.NewRequest("POST", url, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
req.Header.Set("Content-Type", bodyType)
|
|
||||||
return Do(ctx, client, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PostForm issues a POST request via the Do function.
|
|
||||||
func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) {
|
|
||||||
return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
|
|
||||||
}
|
|
||||||
|
|
||||||
// notifyingReader is an io.ReadCloser that closes the notify channel after
|
|
||||||
// Close is called or a Read fails on the underlying ReadCloser.
|
|
||||||
type notifyingReader struct {
|
|
||||||
io.ReadCloser
|
|
||||||
notify chan<- struct{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *notifyingReader) Read(p []byte) (int, error) {
|
|
||||||
n, err := r.ReadCloser.Read(p)
|
|
||||||
if err != nil && r.notify != nil {
|
|
||||||
close(r.notify)
|
|
||||||
r.notify = nil
|
|
||||||
}
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *notifyingReader) Close() error {
|
|
||||||
err := r.ReadCloser.Close()
|
|
||||||
if r.notify != nil {
|
|
||||||
close(r.notify)
|
|
||||||
r.notify = nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
28
vendor/golang.org/x/net/http2/client_conn_pool.go
generated
vendored
28
vendor/golang.org/x/net/http2/client_conn_pool.go
generated
vendored
|
@ -52,9 +52,31 @@ const (
|
||||||
noDialOnMiss = false
|
noDialOnMiss = false
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// shouldTraceGetConn reports whether getClientConn should call any
|
||||||
|
// ClientTrace.GetConn hook associated with the http.Request.
|
||||||
|
//
|
||||||
|
// This complexity is needed to avoid double calls of the GetConn hook
|
||||||
|
// during the back-and-forth between net/http and x/net/http2 (when the
|
||||||
|
// net/http.Transport is upgraded to also speak http2), as well as support
|
||||||
|
// the case where x/net/http2 is being used directly.
|
||||||
|
func (p *clientConnPool) shouldTraceGetConn(st clientConnIdleState) bool {
|
||||||
|
// If our Transport wasn't made via ConfigureTransport, always
|
||||||
|
// trace the GetConn hook if provided, because that means the
|
||||||
|
// http2 package is being used directly and it's the one
|
||||||
|
// dialing, as opposed to net/http.
|
||||||
|
if _, ok := p.t.ConnPool.(noDialClientConnPool); !ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// Otherwise, only use the GetConn hook if this connection has
|
||||||
|
// been used previously for other requests. For fresh
|
||||||
|
// connections, the net/http package does the dialing.
|
||||||
|
return !st.freshConn
|
||||||
|
}
|
||||||
|
|
||||||
func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) {
|
func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) {
|
||||||
if isConnectionCloseRequest(req) && dialOnMiss {
|
if isConnectionCloseRequest(req) && dialOnMiss {
|
||||||
// It gets its own connection.
|
// It gets its own connection.
|
||||||
|
traceGetConn(req, addr)
|
||||||
const singleUse = true
|
const singleUse = true
|
||||||
cc, err := p.t.dialClientConn(addr, singleUse)
|
cc, err := p.t.dialClientConn(addr, singleUse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -64,7 +86,10 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis
|
||||||
}
|
}
|
||||||
p.mu.Lock()
|
p.mu.Lock()
|
||||||
for _, cc := range p.conns[addr] {
|
for _, cc := range p.conns[addr] {
|
||||||
if cc.CanTakeNewRequest() {
|
if st := cc.idleState(); st.canTakeNewRequest {
|
||||||
|
if p.shouldTraceGetConn(st) {
|
||||||
|
traceGetConn(req, addr)
|
||||||
|
}
|
||||||
p.mu.Unlock()
|
p.mu.Unlock()
|
||||||
return cc, nil
|
return cc, nil
|
||||||
}
|
}
|
||||||
|
@ -73,6 +98,7 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis
|
||||||
p.mu.Unlock()
|
p.mu.Unlock()
|
||||||
return nil, ErrNoCachedConn
|
return nil, ErrNoCachedConn
|
||||||
}
|
}
|
||||||
|
traceGetConn(req, addr)
|
||||||
call := p.getStartDialLocked(addr)
|
call := p.getStartDialLocked(addr)
|
||||||
p.mu.Unlock()
|
p.mu.Unlock()
|
||||||
<-call.done
|
<-call.done
|
||||||
|
|
80
vendor/golang.org/x/net/http2/configure_transport.go
generated
vendored
80
vendor/golang.org/x/net/http2/configure_transport.go
generated
vendored
|
@ -1,80 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build go1.6
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/tls"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func configureTransport(t1 *http.Transport) (*Transport, error) {
|
|
||||||
connPool := new(clientConnPool)
|
|
||||||
t2 := &Transport{
|
|
||||||
ConnPool: noDialClientConnPool{connPool},
|
|
||||||
t1: t1,
|
|
||||||
}
|
|
||||||
connPool.t = t2
|
|
||||||
if err := registerHTTPSProtocol(t1, noDialH2RoundTripper{t2}); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if t1.TLSClientConfig == nil {
|
|
||||||
t1.TLSClientConfig = new(tls.Config)
|
|
||||||
}
|
|
||||||
if !strSliceContains(t1.TLSClientConfig.NextProtos, "h2") {
|
|
||||||
t1.TLSClientConfig.NextProtos = append([]string{"h2"}, t1.TLSClientConfig.NextProtos...)
|
|
||||||
}
|
|
||||||
if !strSliceContains(t1.TLSClientConfig.NextProtos, "http/1.1") {
|
|
||||||
t1.TLSClientConfig.NextProtos = append(t1.TLSClientConfig.NextProtos, "http/1.1")
|
|
||||||
}
|
|
||||||
upgradeFn := func(authority string, c *tls.Conn) http.RoundTripper {
|
|
||||||
addr := authorityAddr("https", authority)
|
|
||||||
if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil {
|
|
||||||
go c.Close()
|
|
||||||
return erringRoundTripper{err}
|
|
||||||
} else if !used {
|
|
||||||
// Turns out we don't need this c.
|
|
||||||
// For example, two goroutines made requests to the same host
|
|
||||||
// at the same time, both kicking off TCP dials. (since protocol
|
|
||||||
// was unknown)
|
|
||||||
go c.Close()
|
|
||||||
}
|
|
||||||
return t2
|
|
||||||
}
|
|
||||||
if m := t1.TLSNextProto; len(m) == 0 {
|
|
||||||
t1.TLSNextProto = map[string]func(string, *tls.Conn) http.RoundTripper{
|
|
||||||
"h2": upgradeFn,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
m["h2"] = upgradeFn
|
|
||||||
}
|
|
||||||
return t2, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// registerHTTPSProtocol calls Transport.RegisterProtocol but
|
|
||||||
// converting panics into errors.
|
|
||||||
func registerHTTPSProtocol(t *http.Transport, rt http.RoundTripper) (err error) {
|
|
||||||
defer func() {
|
|
||||||
if e := recover(); e != nil {
|
|
||||||
err = fmt.Errorf("%v", e)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
t.RegisterProtocol("https", rt)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// noDialH2RoundTripper is a RoundTripper which only tries to complete the request
|
|
||||||
// if there's already has a cached connection to the host.
|
|
||||||
type noDialH2RoundTripper struct{ t *Transport }
|
|
||||||
|
|
||||||
func (rt noDialH2RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
||||||
res, err := rt.t.RoundTrip(req)
|
|
||||||
if isNoCachedConnError(err) {
|
|
||||||
return nil, http.ErrSkipAltProtocol
|
|
||||||
}
|
|
||||||
return res, err
|
|
||||||
}
|
|
10
vendor/golang.org/x/net/http2/flow.go
generated
vendored
10
vendor/golang.org/x/net/http2/flow.go
generated
vendored
|
@ -41,10 +41,10 @@ func (f *flow) take(n int32) {
|
||||||
// add adds n bytes (positive or negative) to the flow control window.
|
// add adds n bytes (positive or negative) to the flow control window.
|
||||||
// It returns false if the sum would exceed 2^31-1.
|
// It returns false if the sum would exceed 2^31-1.
|
||||||
func (f *flow) add(n int32) bool {
|
func (f *flow) add(n int32) bool {
|
||||||
remain := (1<<31 - 1) - f.n
|
sum := f.n + n
|
||||||
if n > remain {
|
if (sum > n) == (f.n > 0) {
|
||||||
return false
|
f.n = sum
|
||||||
}
|
|
||||||
f.n += n
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
67
vendor/golang.org/x/net/http2/frame.go
generated
vendored
67
vendor/golang.org/x/net/http2/frame.go
generated
vendored
|
@ -643,7 +643,7 @@ func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error {
|
||||||
return f.WriteDataPadded(streamID, endStream, data, nil)
|
return f.WriteDataPadded(streamID, endStream, data, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteData writes a DATA frame with optional padding.
|
// WriteDataPadded writes a DATA frame with optional padding.
|
||||||
//
|
//
|
||||||
// If pad is nil, the padding bit is not sent.
|
// If pad is nil, the padding bit is not sent.
|
||||||
// The length of pad must not exceed 255 bytes.
|
// The length of pad must not exceed 255 bytes.
|
||||||
|
@ -733,32 +733,67 @@ func (f *SettingsFrame) IsAck() bool {
|
||||||
return f.FrameHeader.Flags.Has(FlagSettingsAck)
|
return f.FrameHeader.Flags.Has(FlagSettingsAck)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *SettingsFrame) Value(s SettingID) (v uint32, ok bool) {
|
func (f *SettingsFrame) Value(id SettingID) (v uint32, ok bool) {
|
||||||
f.checkValid()
|
f.checkValid()
|
||||||
buf := f.p
|
for i := 0; i < f.NumSettings(); i++ {
|
||||||
for len(buf) > 0 {
|
if s := f.Setting(i); s.ID == id {
|
||||||
settingID := SettingID(binary.BigEndian.Uint16(buf[:2]))
|
return s.Val, true
|
||||||
if settingID == s {
|
|
||||||
return binary.BigEndian.Uint32(buf[2:6]), true
|
|
||||||
}
|
}
|
||||||
buf = buf[6:]
|
|
||||||
}
|
}
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setting returns the setting from the frame at the given 0-based index.
|
||||||
|
// The index must be >= 0 and less than f.NumSettings().
|
||||||
|
func (f *SettingsFrame) Setting(i int) Setting {
|
||||||
|
buf := f.p
|
||||||
|
return Setting{
|
||||||
|
ID: SettingID(binary.BigEndian.Uint16(buf[i*6 : i*6+2])),
|
||||||
|
Val: binary.BigEndian.Uint32(buf[i*6+2 : i*6+6]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *SettingsFrame) NumSettings() int { return len(f.p) / 6 }
|
||||||
|
|
||||||
|
// HasDuplicates reports whether f contains any duplicate setting IDs.
|
||||||
|
func (f *SettingsFrame) HasDuplicates() bool {
|
||||||
|
num := f.NumSettings()
|
||||||
|
if num == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// If it's small enough (the common case), just do the n^2
|
||||||
|
// thing and avoid a map allocation.
|
||||||
|
if num < 10 {
|
||||||
|
for i := 0; i < num; i++ {
|
||||||
|
idi := f.Setting(i).ID
|
||||||
|
for j := i + 1; j < num; j++ {
|
||||||
|
idj := f.Setting(j).ID
|
||||||
|
if idi == idj {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
seen := map[SettingID]bool{}
|
||||||
|
for i := 0; i < num; i++ {
|
||||||
|
id := f.Setting(i).ID
|
||||||
|
if seen[id] {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
seen[id] = true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// ForeachSetting runs fn for each setting.
|
// ForeachSetting runs fn for each setting.
|
||||||
// It stops and returns the first error.
|
// It stops and returns the first error.
|
||||||
func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error {
|
func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error {
|
||||||
f.checkValid()
|
f.checkValid()
|
||||||
buf := f.p
|
for i := 0; i < f.NumSettings(); i++ {
|
||||||
for len(buf) > 0 {
|
if err := fn(f.Setting(i)); err != nil {
|
||||||
if err := fn(Setting{
|
|
||||||
SettingID(binary.BigEndian.Uint16(buf[:2])),
|
|
||||||
binary.BigEndian.Uint32(buf[2:6]),
|
|
||||||
}); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
buf = buf[6:]
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1442,7 +1477,7 @@ func (fr *Framer) maxHeaderStringLen() int {
|
||||||
}
|
}
|
||||||
|
|
||||||
// readMetaFrame returns 0 or more CONTINUATION frames from fr and
|
// readMetaFrame returns 0 or more CONTINUATION frames from fr and
|
||||||
// merge them into into the provided hf and returns a MetaHeadersFrame
|
// merge them into the provided hf and returns a MetaHeadersFrame
|
||||||
// with the decoded hpack values.
|
// with the decoded hpack values.
|
||||||
func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
|
func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
|
||||||
if fr.AllowIllegalReads {
|
if fr.AllowIllegalReads {
|
||||||
|
|
29
vendor/golang.org/x/net/http2/go111.go
generated
vendored
Normal file
29
vendor/golang.org/x/net/http2/go111.go
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build go1.11
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http/httptrace"
|
||||||
|
"net/textproto"
|
||||||
|
)
|
||||||
|
|
||||||
|
func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool {
|
||||||
|
return trace != nil && trace.WroteHeaderField != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) {
|
||||||
|
if trace != nil && trace.WroteHeaderField != nil {
|
||||||
|
trace.WroteHeaderField(k, []string{v})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error {
|
||||||
|
if trace != nil {
|
||||||
|
return trace.Got1xxResponse
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
16
vendor/golang.org/x/net/http2/go16.go
generated
vendored
16
vendor/golang.org/x/net/http2/go16.go
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build go1.6
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func transportExpectContinueTimeout(t1 *http.Transport) time.Duration {
|
|
||||||
return t1.ExpectContinueTimeout
|
|
||||||
}
|
|
106
vendor/golang.org/x/net/http2/go17.go
generated
vendored
106
vendor/golang.org/x/net/http2/go17.go
generated
vendored
|
@ -1,106 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build go1.7
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net"
|
|
||||||
"net/http"
|
|
||||||
"net/http/httptrace"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type contextContext interface {
|
|
||||||
context.Context
|
|
||||||
}
|
|
||||||
|
|
||||||
func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx contextContext, cancel func()) {
|
|
||||||
ctx, cancel = context.WithCancel(context.Background())
|
|
||||||
ctx = context.WithValue(ctx, http.LocalAddrContextKey, c.LocalAddr())
|
|
||||||
if hs := opts.baseConfig(); hs != nil {
|
|
||||||
ctx = context.WithValue(ctx, http.ServerContextKey, hs)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func contextWithCancel(ctx contextContext) (_ contextContext, cancel func()) {
|
|
||||||
return context.WithCancel(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
func requestWithContext(req *http.Request, ctx contextContext) *http.Request {
|
|
||||||
return req.WithContext(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
type clientTrace httptrace.ClientTrace
|
|
||||||
|
|
||||||
func reqContext(r *http.Request) context.Context { return r.Context() }
|
|
||||||
|
|
||||||
func (t *Transport) idleConnTimeout() time.Duration {
|
|
||||||
if t.t1 != nil {
|
|
||||||
return t.t1.IdleConnTimeout
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func setResponseUncompressed(res *http.Response) { res.Uncompressed = true }
|
|
||||||
|
|
||||||
func traceGotConn(req *http.Request, cc *ClientConn) {
|
|
||||||
trace := httptrace.ContextClientTrace(req.Context())
|
|
||||||
if trace == nil || trace.GotConn == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
ci := httptrace.GotConnInfo{Conn: cc.tconn}
|
|
||||||
cc.mu.Lock()
|
|
||||||
ci.Reused = cc.nextStreamID > 1
|
|
||||||
ci.WasIdle = len(cc.streams) == 0 && ci.Reused
|
|
||||||
if ci.WasIdle && !cc.lastActive.IsZero() {
|
|
||||||
ci.IdleTime = time.Now().Sub(cc.lastActive)
|
|
||||||
}
|
|
||||||
cc.mu.Unlock()
|
|
||||||
|
|
||||||
trace.GotConn(ci)
|
|
||||||
}
|
|
||||||
|
|
||||||
func traceWroteHeaders(trace *clientTrace) {
|
|
||||||
if trace != nil && trace.WroteHeaders != nil {
|
|
||||||
trace.WroteHeaders()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func traceGot100Continue(trace *clientTrace) {
|
|
||||||
if trace != nil && trace.Got100Continue != nil {
|
|
||||||
trace.Got100Continue()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func traceWait100Continue(trace *clientTrace) {
|
|
||||||
if trace != nil && trace.Wait100Continue != nil {
|
|
||||||
trace.Wait100Continue()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func traceWroteRequest(trace *clientTrace, err error) {
|
|
||||||
if trace != nil && trace.WroteRequest != nil {
|
|
||||||
trace.WroteRequest(httptrace.WroteRequestInfo{Err: err})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func traceFirstResponseByte(trace *clientTrace) {
|
|
||||||
if trace != nil && trace.GotFirstResponseByte != nil {
|
|
||||||
trace.GotFirstResponseByte()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func requestTrace(req *http.Request) *clientTrace {
|
|
||||||
trace := httptrace.ContextClientTrace(req.Context())
|
|
||||||
return (*clientTrace)(trace)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ping sends a PING frame to the server and waits for the ack.
|
|
||||||
func (cc *ClientConn) Ping(ctx context.Context) error {
|
|
||||||
return cc.ping(ctx)
|
|
||||||
}
|
|
36
vendor/golang.org/x/net/http2/go17_not18.go
generated
vendored
36
vendor/golang.org/x/net/http2/go17_not18.go
generated
vendored
|
@ -1,36 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build go1.7,!go1.8
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import "crypto/tls"
|
|
||||||
|
|
||||||
// temporary copy of Go 1.7's private tls.Config.clone:
|
|
||||||
func cloneTLSConfig(c *tls.Config) *tls.Config {
|
|
||||||
return &tls.Config{
|
|
||||||
Rand: c.Rand,
|
|
||||||
Time: c.Time,
|
|
||||||
Certificates: c.Certificates,
|
|
||||||
NameToCertificate: c.NameToCertificate,
|
|
||||||
GetCertificate: c.GetCertificate,
|
|
||||||
RootCAs: c.RootCAs,
|
|
||||||
NextProtos: c.NextProtos,
|
|
||||||
ServerName: c.ServerName,
|
|
||||||
ClientAuth: c.ClientAuth,
|
|
||||||
ClientCAs: c.ClientCAs,
|
|
||||||
InsecureSkipVerify: c.InsecureSkipVerify,
|
|
||||||
CipherSuites: c.CipherSuites,
|
|
||||||
PreferServerCipherSuites: c.PreferServerCipherSuites,
|
|
||||||
SessionTicketsDisabled: c.SessionTicketsDisabled,
|
|
||||||
SessionTicketKey: c.SessionTicketKey,
|
|
||||||
ClientSessionCache: c.ClientSessionCache,
|
|
||||||
MinVersion: c.MinVersion,
|
|
||||||
MaxVersion: c.MaxVersion,
|
|
||||||
CurvePreferences: c.CurvePreferences,
|
|
||||||
DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled,
|
|
||||||
Renegotiation: c.Renegotiation,
|
|
||||||
}
|
|
||||||
}
|
|
56
vendor/golang.org/x/net/http2/go18.go
generated
vendored
56
vendor/golang.org/x/net/http2/go18.go
generated
vendored
|
@ -1,56 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build go1.8
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/tls"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func cloneTLSConfig(c *tls.Config) *tls.Config {
|
|
||||||
c2 := c.Clone()
|
|
||||||
c2.GetClientCertificate = c.GetClientCertificate // golang.org/issue/19264
|
|
||||||
return c2
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ http.Pusher = (*responseWriter)(nil)
|
|
||||||
|
|
||||||
// Push implements http.Pusher.
|
|
||||||
func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
|
|
||||||
internalOpts := pushOptions{}
|
|
||||||
if opts != nil {
|
|
||||||
internalOpts.Method = opts.Method
|
|
||||||
internalOpts.Header = opts.Header
|
|
||||||
}
|
|
||||||
return w.push(target, internalOpts)
|
|
||||||
}
|
|
||||||
|
|
||||||
func configureServer18(h1 *http.Server, h2 *Server) error {
|
|
||||||
if h2.IdleTimeout == 0 {
|
|
||||||
if h1.IdleTimeout != 0 {
|
|
||||||
h2.IdleTimeout = h1.IdleTimeout
|
|
||||||
} else {
|
|
||||||
h2.IdleTimeout = h1.ReadTimeout
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func shouldLogPanic(panicValue interface{}) bool {
|
|
||||||
return panicValue != nil && panicValue != http.ErrAbortHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
func reqGetBody(req *http.Request) func() (io.ReadCloser, error) {
|
|
||||||
return req.GetBody
|
|
||||||
}
|
|
||||||
|
|
||||||
func reqBodyIsNoBody(body io.ReadCloser) bool {
|
|
||||||
return body == http.NoBody
|
|
||||||
}
|
|
||||||
|
|
||||||
func go18httpNoBody() io.ReadCloser { return http.NoBody } // for tests only
|
|
16
vendor/golang.org/x/net/http2/go19.go
generated
vendored
16
vendor/golang.org/x/net/http2/go19.go
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build go1.9
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func configureServer19(s *http.Server, conf *Server) error {
|
|
||||||
s.RegisterOnShutdown(conf.state.startGracefulShutdown)
|
|
||||||
return nil
|
|
||||||
}
|
|
97
pkg/h2c/h2c.go → vendor/golang.org/x/net/http2/h2c/h2c.go
generated
vendored
97
pkg/h2c/h2c.go → vendor/golang.org/x/net/http2/h2c/h2c.go
generated
vendored
|
@ -2,10 +2,10 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package h2c implements the h2c part of HTTP/2.
|
// Package h2c implements the unencrypted "h2c" form of HTTP/2.
|
||||||
//
|
//
|
||||||
// The h2c protocol is the non-TLS secured version of HTTP/2 which is not
|
// The h2c protocol is the non-TLS version of HTTP/2 which is not available from
|
||||||
// available from net/http.
|
// net/http or golang.org/x/net/http2.
|
||||||
package h2c
|
package h2c
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -16,14 +16,13 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/containous/traefik/pkg/log"
|
|
||||||
|
|
||||||
"golang.org/x/net/http/httpguts"
|
"golang.org/x/net/http/httpguts"
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
"golang.org/x/net/http2/hpack"
|
"golang.org/x/net/http2/hpack"
|
||||||
|
@ -40,44 +39,64 @@ func init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server implements net.Handler and enables h2c. Users who want h2c just need
|
// h2cHandler is a Handler which implements h2c by hijacking the HTTP/1 traffic
|
||||||
// to provide an http.Server.
|
// that should be h2c traffic. There are two ways to begin a h2c connection
|
||||||
type Server struct {
|
// (RFC 7540 Section 3.2 and 3.4): (1) Starting with Prior Knowledge - this
|
||||||
*http.Server
|
// works by starting an h2c connection with a string of bytes that is valid
|
||||||
|
// HTTP/1, but unlikely to occur in practice and (2) Upgrading from HTTP/1 to
|
||||||
|
// h2c - this works by using the HTTP/1 Upgrade header to request an upgrade to
|
||||||
|
// h2c. When either of those situations occur we hijack the HTTP/1 connection,
|
||||||
|
// convert it to a HTTP/2 connection and pass the net.Conn to http2.ServeConn.
|
||||||
|
type h2cHandler struct {
|
||||||
|
Handler http.Handler
|
||||||
|
s *http2.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serve Put a middleware around the original handler to handle h2c
|
// NewHandler returns an http.Handler that wraps h, intercepting any h2c
|
||||||
func (s Server) Serve(l net.Listener) error {
|
// traffic. If a request is an h2c connection, it's hijacked and redirected to
|
||||||
originalHandler := s.Server.Handler
|
// s.ServeConn. Otherwise the returned Handler just forwards requests to h. This
|
||||||
if originalHandler == nil {
|
// works because h2c is designed to be parseable as valid HTTP/1, but ignored by
|
||||||
originalHandler = http.DefaultServeMux
|
// any HTTP server that does not handle h2c. Therefore we leverage the HTTP/1
|
||||||
|
// compatible parts of the Go http library to parse and recognize h2c requests.
|
||||||
|
// Once a request is recognized as h2c, we hijack the connection and convert it
|
||||||
|
// to an HTTP/2 connection which is understandable to s.ServeConn. (s.ServeConn
|
||||||
|
// understands HTTP/2 except for the h2c part of it.)
|
||||||
|
func NewHandler(h http.Handler, s *http2.Server) http.Handler {
|
||||||
|
return &h2cHandler{
|
||||||
|
Handler: h,
|
||||||
|
s: s,
|
||||||
}
|
}
|
||||||
s.Server.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
}
|
||||||
if r.Method == "PRI" && r.URL.Path == "*" && r.Proto == "HTTP/2.0" {
|
|
||||||
|
// ServeHTTP implement the h2c support that is enabled by h2c.GetH2CHandler.
|
||||||
|
func (s h2cHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// Handle h2c with prior knowledge (RFC 7540 Section 3.4)
|
||||||
|
if r.Method == "PRI" && len(r.Header) == 0 && r.URL.Path == "*" && r.Proto == "HTTP/2.0" {
|
||||||
if http2VerboseLogs {
|
if http2VerboseLogs {
|
||||||
log.Debugf("Attempting h2c with prior knowledge.")
|
log.Print("h2c: attempting h2c with prior knowledge.")
|
||||||
}
|
}
|
||||||
conn, err := initH2CWithPriorKnowledge(w)
|
conn, err := initH2CWithPriorKnowledge(w)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if http2VerboseLogs {
|
if http2VerboseLogs {
|
||||||
log.Debugf("Error h2c with prior knowledge: %v", err)
|
log.Printf("h2c: error h2c with prior knowledge: %v", err)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
h2cSrv := &http2.Server{}
|
|
||||||
h2cSrv.ServeConn(conn, &http2.ServeConnOpts{Handler: originalHandler})
|
s.s.ServeConn(conn, &http2.ServeConnOpts{Handler: s.Handler})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// Handle Upgrade to h2c (RFC 7540 Section 3.2)
|
||||||
if conn, err := h2cUpgrade(w, r); err == nil {
|
if conn, err := h2cUpgrade(w, r); err == nil {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
h2cSrv := &http2.Server{}
|
|
||||||
h2cSrv.ServeConn(conn, &http2.ServeConnOpts{Handler: originalHandler})
|
s.s.ServeConn(conn, &http2.ServeConnOpts{Handler: s.Handler})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
originalHandler.ServeHTTP(w, r)
|
|
||||||
})
|
s.Handler.ServeHTTP(w, r)
|
||||||
return s.Server.Serve(l)
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// initH2CWithPriorKnowledge implements creating a h2c connection with prior
|
// initH2CWithPriorKnowledge implements creating a h2c connection with prior
|
||||||
|
@ -88,25 +107,25 @@ func (s Server) Serve(l net.Listener) error {
|
||||||
func initH2CWithPriorKnowledge(w http.ResponseWriter) (net.Conn, error) {
|
func initH2CWithPriorKnowledge(w http.ResponseWriter) (net.Conn, error) {
|
||||||
hijacker, ok := w.(http.Hijacker)
|
hijacker, ok := w.(http.Hijacker)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("hijack not supported")
|
panic("Hijack not supported.")
|
||||||
}
|
}
|
||||||
conn, rw, err := hijacker.Hijack()
|
conn, rw, err := hijacker.Hijack()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("hijack failed: %v", err)
|
panic(fmt.Sprintf("Hijack failed: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedBody := "SM\r\n\r\n"
|
const expectedBody = "SM\r\n\r\n"
|
||||||
|
|
||||||
buf := make([]byte, len(expectedBody))
|
buf := make([]byte, len(expectedBody))
|
||||||
n, err := io.ReadFull(rw, buf)
|
n, err := io.ReadFull(rw, buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("fail to read body: %v", err)
|
return nil, fmt.Errorf("could not read from the buffer: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if bytes.Equal(buf[0:n], []byte(expectedBody)) {
|
if string(buf[:n]) == expectedBody {
|
||||||
c := &rwConn{
|
c := &rwConn{
|
||||||
Conn: conn,
|
Conn: conn,
|
||||||
Reader: io.MultiReader(bytes.NewBuffer([]byte(http2.ClientPreface)), rw),
|
Reader: io.MultiReader(strings.NewReader(http2.ClientPreface), rw),
|
||||||
BufWriter: rw.Writer,
|
BufWriter: rw.Writer,
|
||||||
}
|
}
|
||||||
return c, nil
|
return c, nil
|
||||||
|
@ -114,8 +133,8 @@ func initH2CWithPriorKnowledge(w http.ResponseWriter) (net.Conn, error) {
|
||||||
|
|
||||||
conn.Close()
|
conn.Close()
|
||||||
if http2VerboseLogs {
|
if http2VerboseLogs {
|
||||||
log.Infof(
|
log.Printf(
|
||||||
"Missing the request body portion of the client preface. Wanted: %v Got: %v",
|
"h2c: missing the request body portion of the client preface. Wanted: %v Got: %v",
|
||||||
[]byte(expectedBody),
|
[]byte(expectedBody),
|
||||||
buf[0:n],
|
buf[0:n],
|
||||||
)
|
)
|
||||||
|
@ -127,13 +146,13 @@ func initH2CWithPriorKnowledge(w http.ResponseWriter) (net.Conn, error) {
|
||||||
// the supplied reader.
|
// the supplied reader.
|
||||||
func drainClientPreface(r io.Reader) error {
|
func drainClientPreface(r io.Reader) error {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
prefaceLen := int64(len([]byte(http2.ClientPreface)))
|
prefaceLen := int64(len(http2.ClientPreface))
|
||||||
n, err := io.CopyN(&buf, r, prefaceLen)
|
n, err := io.CopyN(&buf, r, prefaceLen)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if n != prefaceLen || buf.String() != http2.ClientPreface {
|
if n != prefaceLen || buf.String() != http2.ClientPreface {
|
||||||
return fmt.Errorf("client never sent: %s", http2.ClientPreface)
|
return fmt.Errorf("Client never sent: %s", http2.ClientPreface)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -152,7 +171,7 @@ func h2cUpgrade(w http.ResponseWriter, r *http.Request) (net.Conn, error) {
|
||||||
|
|
||||||
hijacker, ok := w.(http.Hijacker)
|
hijacker, ok := w.(http.Hijacker)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("hijack not supported")
|
return nil, errors.New("hijack not supported.")
|
||||||
}
|
}
|
||||||
conn, rw, err := hijacker.Hijack()
|
conn, rw, err := hijacker.Hijack()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -277,7 +296,7 @@ func (c *rwConn) Write(p []byte) (int, error) {
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// settingsAckSwallowWriter is a writer that normally forwards bytes to it's
|
// settingsAckSwallowWriter is a writer that normally forwards bytes to its
|
||||||
// underlying Writer, but swallows the first SettingsAck frame that it sees.
|
// underlying Writer, but swallows the first SettingsAck frame that it sees.
|
||||||
type settingsAckSwallowWriter struct {
|
type settingsAckSwallowWriter struct {
|
||||||
Writer *bufio.Writer
|
Writer *bufio.Writer
|
||||||
|
@ -313,7 +332,7 @@ func (w *settingsAckSwallowWriter) Write(p []byte) (int, error) {
|
||||||
}
|
}
|
||||||
fSize := fh.Length + 9
|
fSize := fh.Length + 9
|
||||||
if uint32(len(w.buf)) < fSize {
|
if uint32(len(w.buf)) < fSize {
|
||||||
// Have not collected whole frame. Stop processing buf, and withhold on
|
// Have not collected whole frame. Stop processing buf, and withold on
|
||||||
// forward bytes to w.Writer until we get the full frame.
|
// forward bytes to w.Writer until we get the full frame.
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -364,7 +383,7 @@ func getH2Settings(h http.Header) ([]http2.Setting, error) {
|
||||||
}
|
}
|
||||||
settings, err := decodeSettings(vals[0])
|
settings, err := decodeSettings(vals[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("invalid HTTP2-Settings: %q", vals[0])
|
return nil, fmt.Errorf("Invalid HTTP2-Settings: %q", vals[0])
|
||||||
}
|
}
|
||||||
return settings, nil
|
return settings, nil
|
||||||
}
|
}
|
20
vendor/golang.org/x/net/http2/headermap.go
generated
vendored
20
vendor/golang.org/x/net/http2/headermap.go
generated
vendored
|
@ -7,15 +7,21 @@ package http2
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
commonLowerHeader = map[string]string{} // Go-Canonical-Case -> lower-case
|
commonBuildOnce sync.Once
|
||||||
commonCanonHeader = map[string]string{} // lower-case -> Go-Canonical-Case
|
commonLowerHeader map[string]string // Go-Canonical-Case -> lower-case
|
||||||
|
commonCanonHeader map[string]string // lower-case -> Go-Canonical-Case
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func buildCommonHeaderMapsOnce() {
|
||||||
for _, v := range []string{
|
commonBuildOnce.Do(buildCommonHeaderMaps)
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildCommonHeaderMaps() {
|
||||||
|
common := []string{
|
||||||
"accept",
|
"accept",
|
||||||
"accept-charset",
|
"accept-charset",
|
||||||
"accept-encoding",
|
"accept-encoding",
|
||||||
|
@ -63,7 +69,10 @@ func init() {
|
||||||
"vary",
|
"vary",
|
||||||
"via",
|
"via",
|
||||||
"www-authenticate",
|
"www-authenticate",
|
||||||
} {
|
}
|
||||||
|
commonLowerHeader = make(map[string]string, len(common))
|
||||||
|
commonCanonHeader = make(map[string]string, len(common))
|
||||||
|
for _, v := range common {
|
||||||
chk := http.CanonicalHeaderKey(v)
|
chk := http.CanonicalHeaderKey(v)
|
||||||
commonLowerHeader[chk] = v
|
commonLowerHeader[chk] = v
|
||||||
commonCanonHeader[v] = chk
|
commonCanonHeader[v] = chk
|
||||||
|
@ -71,6 +80,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func lowerHeader(v string) string {
|
func lowerHeader(v string) string {
|
||||||
|
buildCommonHeaderMapsOnce()
|
||||||
if s, ok := commonLowerHeader[v]; ok {
|
if s, ok := commonLowerHeader[v]; ok {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
10
vendor/golang.org/x/net/http2/hpack/hpack.go
generated
vendored
10
vendor/golang.org/x/net/http2/hpack/hpack.go
generated
vendored
|
@ -92,6 +92,8 @@ type Decoder struct {
|
||||||
// saveBuf is previous data passed to Write which we weren't able
|
// saveBuf is previous data passed to Write which we weren't able
|
||||||
// to fully parse before. Unlike buf, we own this data.
|
// to fully parse before. Unlike buf, we own this data.
|
||||||
saveBuf bytes.Buffer
|
saveBuf bytes.Buffer
|
||||||
|
|
||||||
|
firstField bool // processing the first field of the header block
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDecoder returns a new decoder with the provided maximum dynamic
|
// NewDecoder returns a new decoder with the provided maximum dynamic
|
||||||
|
@ -101,6 +103,7 @@ func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decod
|
||||||
d := &Decoder{
|
d := &Decoder{
|
||||||
emit: emitFunc,
|
emit: emitFunc,
|
||||||
emitEnabled: true,
|
emitEnabled: true,
|
||||||
|
firstField: true,
|
||||||
}
|
}
|
||||||
d.dynTab.table.init()
|
d.dynTab.table.init()
|
||||||
d.dynTab.allowedMaxSize = maxDynamicTableSize
|
d.dynTab.allowedMaxSize = maxDynamicTableSize
|
||||||
|
@ -226,11 +229,15 @@ func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) {
|
||||||
return hf, nil
|
return hf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close declares that the decoding is complete and resets the Decoder
|
||||||
|
// to be reused again for a new header block. If there is any remaining
|
||||||
|
// data in the decoder's buffer, Close returns an error.
|
||||||
func (d *Decoder) Close() error {
|
func (d *Decoder) Close() error {
|
||||||
if d.saveBuf.Len() > 0 {
|
if d.saveBuf.Len() > 0 {
|
||||||
d.saveBuf.Reset()
|
d.saveBuf.Reset()
|
||||||
return DecodingError{errors.New("truncated headers")}
|
return DecodingError{errors.New("truncated headers")}
|
||||||
}
|
}
|
||||||
|
d.firstField = true
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,6 +273,7 @@ func (d *Decoder) Write(p []byte) (n int, err error) {
|
||||||
d.saveBuf.Write(d.buf)
|
d.saveBuf.Write(d.buf)
|
||||||
return len(p), nil
|
return len(p), nil
|
||||||
}
|
}
|
||||||
|
d.firstField = false
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -391,7 +399,7 @@ func (d *Decoder) callEmit(hf HeaderField) error {
|
||||||
func (d *Decoder) parseDynamicTableSizeUpdate() error {
|
func (d *Decoder) parseDynamicTableSizeUpdate() error {
|
||||||
// RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
|
// RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
|
||||||
// beginning of the first header block following the change to the dynamic table size.
|
// beginning of the first header block following the change to the dynamic table size.
|
||||||
if d.dynTab.size > 0 {
|
if !d.firstField && d.dynTab.size > 0 {
|
||||||
return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
|
return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
20
vendor/golang.org/x/net/http2/hpack/huffman.go
generated
vendored
20
vendor/golang.org/x/net/http2/hpack/huffman.go
generated
vendored
|
@ -47,6 +47,7 @@ var ErrInvalidHuffman = errors.New("hpack: invalid Huffman-encoded data")
|
||||||
// If maxLen is greater than 0, attempts to write more to buf than
|
// If maxLen is greater than 0, attempts to write more to buf than
|
||||||
// maxLen bytes will return ErrStringLength.
|
// maxLen bytes will return ErrStringLength.
|
||||||
func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error {
|
func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error {
|
||||||
|
rootHuffmanNode := getRootHuffmanNode()
|
||||||
n := rootHuffmanNode
|
n := rootHuffmanNode
|
||||||
// cur is the bit buffer that has not been fed into n.
|
// cur is the bit buffer that has not been fed into n.
|
||||||
// cbits is the number of low order bits in cur that are valid.
|
// cbits is the number of low order bits in cur that are valid.
|
||||||
|
@ -106,7 +107,7 @@ func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error {
|
||||||
|
|
||||||
type node struct {
|
type node struct {
|
||||||
// children is non-nil for internal nodes
|
// children is non-nil for internal nodes
|
||||||
children []*node
|
children *[256]*node
|
||||||
|
|
||||||
// The following are only valid if children is nil:
|
// The following are only valid if children is nil:
|
||||||
codeLen uint8 // number of bits that led to the output of sym
|
codeLen uint8 // number of bits that led to the output of sym
|
||||||
|
@ -114,22 +115,31 @@ type node struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newInternalNode() *node {
|
func newInternalNode() *node {
|
||||||
return &node{children: make([]*node, 256)}
|
return &node{children: new([256]*node)}
|
||||||
}
|
}
|
||||||
|
|
||||||
var rootHuffmanNode = newInternalNode()
|
var (
|
||||||
|
buildRootOnce sync.Once
|
||||||
|
lazyRootHuffmanNode *node
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func getRootHuffmanNode() *node {
|
||||||
|
buildRootOnce.Do(buildRootHuffmanNode)
|
||||||
|
return lazyRootHuffmanNode
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildRootHuffmanNode() {
|
||||||
if len(huffmanCodes) != 256 {
|
if len(huffmanCodes) != 256 {
|
||||||
panic("unexpected size")
|
panic("unexpected size")
|
||||||
}
|
}
|
||||||
|
lazyRootHuffmanNode = newInternalNode()
|
||||||
for i, code := range huffmanCodes {
|
for i, code := range huffmanCodes {
|
||||||
addDecoderNode(byte(i), code, huffmanCodeLen[i])
|
addDecoderNode(byte(i), code, huffmanCodeLen[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addDecoderNode(sym byte, code uint32, codeLen uint8) {
|
func addDecoderNode(sym byte, code uint32, codeLen uint8) {
|
||||||
cur := rootHuffmanNode
|
cur := lazyRootHuffmanNode
|
||||||
for codeLen > 8 {
|
for codeLen > 8 {
|
||||||
codeLen -= 8
|
codeLen -= 8
|
||||||
i := uint8(code >> codeLen)
|
i := uint8(code >> codeLen)
|
||||||
|
|
17
vendor/golang.org/x/net/http2/http2.go
generated
vendored
17
vendor/golang.org/x/net/http2/http2.go
generated
vendored
|
@ -201,19 +201,12 @@ func validWireHeaderFieldName(v string) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
var httpCodeStringCommon = map[int]string{} // n -> strconv.Itoa(n)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
for i := 100; i <= 999; i++ {
|
|
||||||
if v := http.StatusText(i); v != "" {
|
|
||||||
httpCodeStringCommon[i] = strconv.Itoa(i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func httpCodeString(code int) string {
|
func httpCodeString(code int) string {
|
||||||
if s, ok := httpCodeStringCommon[code]; ok {
|
switch code {
|
||||||
return s
|
case 200:
|
||||||
|
return "200"
|
||||||
|
case 404:
|
||||||
|
return "404"
|
||||||
}
|
}
|
||||||
return strconv.Itoa(code)
|
return strconv.Itoa(code)
|
||||||
}
|
}
|
||||||
|
|
20
vendor/golang.org/x/net/http2/not_go111.go
generated
vendored
Normal file
20
vendor/golang.org/x/net/http2/not_go111.go
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build !go1.11
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http/httptrace"
|
||||||
|
"net/textproto"
|
||||||
|
)
|
||||||
|
|
||||||
|
func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { return false }
|
||||||
|
|
||||||
|
func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) {}
|
||||||
|
|
||||||
|
func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error {
|
||||||
|
return nil
|
||||||
|
}
|
21
vendor/golang.org/x/net/http2/not_go16.go
generated
vendored
21
vendor/golang.org/x/net/http2/not_go16.go
generated
vendored
|
@ -1,21 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !go1.6
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func configureTransport(t1 *http.Transport) (*Transport, error) {
|
|
||||||
return nil, errTransportVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
func transportExpectContinueTimeout(t1 *http.Transport) time.Duration {
|
|
||||||
return 0
|
|
||||||
|
|
||||||
}
|
|
87
vendor/golang.org/x/net/http2/not_go17.go
generated
vendored
87
vendor/golang.org/x/net/http2/not_go17.go
generated
vendored
|
@ -1,87 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !go1.7
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/tls"
|
|
||||||
"net"
|
|
||||||
"net/http"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type contextContext interface {
|
|
||||||
Done() <-chan struct{}
|
|
||||||
Err() error
|
|
||||||
}
|
|
||||||
|
|
||||||
type fakeContext struct{}
|
|
||||||
|
|
||||||
func (fakeContext) Done() <-chan struct{} { return nil }
|
|
||||||
func (fakeContext) Err() error { panic("should not be called") }
|
|
||||||
|
|
||||||
func reqContext(r *http.Request) fakeContext {
|
|
||||||
return fakeContext{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func setResponseUncompressed(res *http.Response) {
|
|
||||||
// Nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
type clientTrace struct{}
|
|
||||||
|
|
||||||
func requestTrace(*http.Request) *clientTrace { return nil }
|
|
||||||
func traceGotConn(*http.Request, *ClientConn) {}
|
|
||||||
func traceFirstResponseByte(*clientTrace) {}
|
|
||||||
func traceWroteHeaders(*clientTrace) {}
|
|
||||||
func traceWroteRequest(*clientTrace, error) {}
|
|
||||||
func traceGot100Continue(trace *clientTrace) {}
|
|
||||||
func traceWait100Continue(trace *clientTrace) {}
|
|
||||||
|
|
||||||
func nop() {}
|
|
||||||
|
|
||||||
func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx contextContext, cancel func()) {
|
|
||||||
return nil, nop
|
|
||||||
}
|
|
||||||
|
|
||||||
func contextWithCancel(ctx contextContext) (_ contextContext, cancel func()) {
|
|
||||||
return ctx, nop
|
|
||||||
}
|
|
||||||
|
|
||||||
func requestWithContext(req *http.Request, ctx contextContext) *http.Request {
|
|
||||||
return req
|
|
||||||
}
|
|
||||||
|
|
||||||
// temporary copy of Go 1.6's private tls.Config.clone:
|
|
||||||
func cloneTLSConfig(c *tls.Config) *tls.Config {
|
|
||||||
return &tls.Config{
|
|
||||||
Rand: c.Rand,
|
|
||||||
Time: c.Time,
|
|
||||||
Certificates: c.Certificates,
|
|
||||||
NameToCertificate: c.NameToCertificate,
|
|
||||||
GetCertificate: c.GetCertificate,
|
|
||||||
RootCAs: c.RootCAs,
|
|
||||||
NextProtos: c.NextProtos,
|
|
||||||
ServerName: c.ServerName,
|
|
||||||
ClientAuth: c.ClientAuth,
|
|
||||||
ClientCAs: c.ClientCAs,
|
|
||||||
InsecureSkipVerify: c.InsecureSkipVerify,
|
|
||||||
CipherSuites: c.CipherSuites,
|
|
||||||
PreferServerCipherSuites: c.PreferServerCipherSuites,
|
|
||||||
SessionTicketsDisabled: c.SessionTicketsDisabled,
|
|
||||||
SessionTicketKey: c.SessionTicketKey,
|
|
||||||
ClientSessionCache: c.ClientSessionCache,
|
|
||||||
MinVersion: c.MinVersion,
|
|
||||||
MaxVersion: c.MaxVersion,
|
|
||||||
CurvePreferences: c.CurvePreferences,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cc *ClientConn) Ping(ctx contextContext) error {
|
|
||||||
return cc.ping(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Transport) idleConnTimeout() time.Duration { return 0 }
|
|
29
vendor/golang.org/x/net/http2/not_go18.go
generated
vendored
29
vendor/golang.org/x/net/http2/not_go18.go
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !go1.8
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func configureServer18(h1 *http.Server, h2 *Server) error {
|
|
||||||
// No IdleTimeout to sync prior to Go 1.8.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func shouldLogPanic(panicValue interface{}) bool {
|
|
||||||
return panicValue != nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func reqGetBody(req *http.Request) func() (io.ReadCloser, error) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func reqBodyIsNoBody(io.ReadCloser) bool { return false }
|
|
||||||
|
|
||||||
func go18httpNoBody() io.ReadCloser { return nil } // for tests only
|
|
16
vendor/golang.org/x/net/http2/not_go19.go
generated
vendored
16
vendor/golang.org/x/net/http2/not_go19.go
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !go1.9
|
|
||||||
|
|
||||||
package http2
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func configureServer19(s *http.Server, conf *Server) error {
|
|
||||||
// not supported prior to go1.9
|
|
||||||
return nil
|
|
||||||
}
|
|
122
vendor/golang.org/x/net/http2/server.go
generated
vendored
122
vendor/golang.org/x/net/http2/server.go
generated
vendored
|
@ -28,6 +28,7 @@ package http2
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -209,12 +210,14 @@ func ConfigureServer(s *http.Server, conf *Server) error {
|
||||||
conf = new(Server)
|
conf = new(Server)
|
||||||
}
|
}
|
||||||
conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})}
|
conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})}
|
||||||
if err := configureServer18(s, conf); err != nil {
|
if h1, h2 := s, conf; h2.IdleTimeout == 0 {
|
||||||
return err
|
if h1.IdleTimeout != 0 {
|
||||||
|
h2.IdleTimeout = h1.IdleTimeout
|
||||||
|
} else {
|
||||||
|
h2.IdleTimeout = h1.ReadTimeout
|
||||||
}
|
}
|
||||||
if err := configureServer19(s, conf); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
s.RegisterOnShutdown(conf.state.startGracefulShutdown)
|
||||||
|
|
||||||
if s.TLSConfig == nil {
|
if s.TLSConfig == nil {
|
||||||
s.TLSConfig = new(tls.Config)
|
s.TLSConfig = new(tls.Config)
|
||||||
|
@ -270,7 +273,20 @@ func ConfigureServer(s *http.Server, conf *Server) error {
|
||||||
if testHookOnConn != nil {
|
if testHookOnConn != nil {
|
||||||
testHookOnConn()
|
testHookOnConn()
|
||||||
}
|
}
|
||||||
|
// The TLSNextProto interface predates contexts, so
|
||||||
|
// the net/http package passes down its per-connection
|
||||||
|
// base context via an exported but unadvertised
|
||||||
|
// method on the Handler. This is for internal
|
||||||
|
// net/http<=>http2 use only.
|
||||||
|
var ctx context.Context
|
||||||
|
type baseContexter interface {
|
||||||
|
BaseContext() context.Context
|
||||||
|
}
|
||||||
|
if bc, ok := h.(baseContexter); ok {
|
||||||
|
ctx = bc.BaseContext()
|
||||||
|
}
|
||||||
conf.ServeConn(c, &ServeConnOpts{
|
conf.ServeConn(c, &ServeConnOpts{
|
||||||
|
Context: ctx,
|
||||||
Handler: h,
|
Handler: h,
|
||||||
BaseConfig: hs,
|
BaseConfig: hs,
|
||||||
})
|
})
|
||||||
|
@ -281,6 +297,10 @@ func ConfigureServer(s *http.Server, conf *Server) error {
|
||||||
|
|
||||||
// ServeConnOpts are options for the Server.ServeConn method.
|
// ServeConnOpts are options for the Server.ServeConn method.
|
||||||
type ServeConnOpts struct {
|
type ServeConnOpts struct {
|
||||||
|
// Context is the base context to use.
|
||||||
|
// If nil, context.Background is used.
|
||||||
|
Context context.Context
|
||||||
|
|
||||||
// BaseConfig optionally sets the base configuration
|
// BaseConfig optionally sets the base configuration
|
||||||
// for values. If nil, defaults are used.
|
// for values. If nil, defaults are used.
|
||||||
BaseConfig *http.Server
|
BaseConfig *http.Server
|
||||||
|
@ -291,6 +311,13 @@ type ServeConnOpts struct {
|
||||||
Handler http.Handler
|
Handler http.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *ServeConnOpts) context() context.Context {
|
||||||
|
if o.Context != nil {
|
||||||
|
return o.Context
|
||||||
|
}
|
||||||
|
return context.Background()
|
||||||
|
}
|
||||||
|
|
||||||
func (o *ServeConnOpts) baseConfig() *http.Server {
|
func (o *ServeConnOpts) baseConfig() *http.Server {
|
||||||
if o != nil && o.BaseConfig != nil {
|
if o != nil && o.BaseConfig != nil {
|
||||||
return o.BaseConfig
|
return o.BaseConfig
|
||||||
|
@ -435,6 +462,15 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
|
||||||
sc.serve()
|
sc.serve()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx context.Context, cancel func()) {
|
||||||
|
ctx, cancel = context.WithCancel(opts.context())
|
||||||
|
ctx = context.WithValue(ctx, http.LocalAddrContextKey, c.LocalAddr())
|
||||||
|
if hs := opts.baseConfig(); hs != nil {
|
||||||
|
ctx = context.WithValue(ctx, http.ServerContextKey, hs)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (sc *serverConn) rejectConn(err ErrCode, debug string) {
|
func (sc *serverConn) rejectConn(err ErrCode, debug string) {
|
||||||
sc.vlogf("http2: server rejecting conn: %v, %s", err, debug)
|
sc.vlogf("http2: server rejecting conn: %v, %s", err, debug)
|
||||||
// ignoring errors. hanging up anyway.
|
// ignoring errors. hanging up anyway.
|
||||||
|
@ -450,7 +486,7 @@ type serverConn struct {
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
bw *bufferedWriter // writing to conn
|
bw *bufferedWriter // writing to conn
|
||||||
handler http.Handler
|
handler http.Handler
|
||||||
baseCtx contextContext
|
baseCtx context.Context
|
||||||
framer *Framer
|
framer *Framer
|
||||||
doneServing chan struct{} // closed when serverConn.serve ends
|
doneServing chan struct{} // closed when serverConn.serve ends
|
||||||
readFrameCh chan readFrameResult // written by serverConn.readFrames
|
readFrameCh chan readFrameResult // written by serverConn.readFrames
|
||||||
|
@ -530,7 +566,7 @@ type stream struct {
|
||||||
id uint32
|
id uint32
|
||||||
body *pipe // non-nil if expecting DATA frames
|
body *pipe // non-nil if expecting DATA frames
|
||||||
cw closeWaiter // closed wait stream transitions to closed state
|
cw closeWaiter // closed wait stream transitions to closed state
|
||||||
ctx contextContext
|
ctx context.Context
|
||||||
cancelCtx func()
|
cancelCtx func()
|
||||||
|
|
||||||
// owned by serverConn's serve loop:
|
// owned by serverConn's serve loop:
|
||||||
|
@ -663,6 +699,7 @@ func (sc *serverConn) condlogf(err error, format string, args ...interface{}) {
|
||||||
|
|
||||||
func (sc *serverConn) canonicalHeader(v string) string {
|
func (sc *serverConn) canonicalHeader(v string) string {
|
||||||
sc.serveG.check()
|
sc.serveG.check()
|
||||||
|
buildCommonHeaderMapsOnce()
|
||||||
cv, ok := commonCanonHeader[v]
|
cv, ok := commonCanonHeader[v]
|
||||||
if ok {
|
if ok {
|
||||||
return cv
|
return cv
|
||||||
|
@ -1109,7 +1146,7 @@ func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) {
|
||||||
|
|
||||||
// errHandlerPanicked is the error given to any callers blocked in a read from
|
// errHandlerPanicked is the error given to any callers blocked in a read from
|
||||||
// Request.Body when the main goroutine panics. Since most handlers read in the
|
// Request.Body when the main goroutine panics. Since most handlers read in the
|
||||||
// the main ServeHTTP goroutine, this will show up rarely.
|
// main ServeHTTP goroutine, this will show up rarely.
|
||||||
var errHandlerPanicked = errors.New("http2: handler panicked")
|
var errHandlerPanicked = errors.New("http2: handler panicked")
|
||||||
|
|
||||||
// wroteFrame is called on the serve goroutine with the result of
|
// wroteFrame is called on the serve goroutine with the result of
|
||||||
|
@ -1487,6 +1524,12 @@ func (sc *serverConn) processSettings(f *SettingsFrame) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
if f.NumSettings() > 100 || f.HasDuplicates() {
|
||||||
|
// This isn't actually in the spec, but hang up on
|
||||||
|
// suspiciously large settings frames or those with
|
||||||
|
// duplicate entries.
|
||||||
|
return ConnectionError(ErrCodeProtocol)
|
||||||
|
}
|
||||||
if err := f.ForeachSetting(sc.processSetting); err != nil {
|
if err := f.ForeachSetting(sc.processSetting); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1721,6 +1764,13 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
||||||
// processing this frame.
|
// processing this frame.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
// RFC 7540, sec 5.1: If an endpoint receives additional frames, other than
|
||||||
|
// WINDOW_UPDATE, PRIORITY, or RST_STREAM, for a stream that is in
|
||||||
|
// this state, it MUST respond with a stream error (Section 5.4.2) of
|
||||||
|
// type STREAM_CLOSED.
|
||||||
|
if st.state == stateHalfClosedRemote {
|
||||||
|
return streamError(id, ErrCodeStreamClosed)
|
||||||
|
}
|
||||||
return st.processTrailerHeaders(f)
|
return st.processTrailerHeaders(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1862,7 +1912,7 @@ func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream
|
||||||
panic("internal error: cannot create stream with id 0")
|
panic("internal error: cannot create stream with id 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancelCtx := contextWithCancel(sc.baseCtx)
|
ctx, cancelCtx := context.WithCancel(sc.baseCtx)
|
||||||
st := &stream{
|
st := &stream{
|
||||||
sc: sc,
|
sc: sc,
|
||||||
id: id,
|
id: id,
|
||||||
|
@ -2028,7 +2078,7 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r
|
||||||
Body: body,
|
Body: body,
|
||||||
Trailer: trailer,
|
Trailer: trailer,
|
||||||
}
|
}
|
||||||
req = requestWithContext(req, st.ctx)
|
req = req.WithContext(st.ctx)
|
||||||
|
|
||||||
rws := responseWriterStatePool.Get().(*responseWriterState)
|
rws := responseWriterStatePool.Get().(*responseWriterState)
|
||||||
bwSave := rws.bw
|
bwSave := rws.bw
|
||||||
|
@ -2056,7 +2106,7 @@ func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler
|
||||||
stream: rw.rws.stream,
|
stream: rw.rws.stream,
|
||||||
})
|
})
|
||||||
// Same as net/http:
|
// Same as net/http:
|
||||||
if shouldLogPanic(e) {
|
if e != nil && e != http.ErrAbortHandler {
|
||||||
const size = 64 << 10
|
const size = 64 << 10
|
||||||
buf := make([]byte, size)
|
buf := make([]byte, size)
|
||||||
buf = buf[:runtime.Stack(buf, false)]
|
buf = buf[:runtime.Stack(buf, false)]
|
||||||
|
@ -2281,7 +2331,16 @@ type chunkWriter struct{ rws *responseWriterState }
|
||||||
|
|
||||||
func (cw chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) }
|
func (cw chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) }
|
||||||
|
|
||||||
func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) != 0 }
|
func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) > 0 }
|
||||||
|
|
||||||
|
func (rws *responseWriterState) hasNonemptyTrailers() bool {
|
||||||
|
for _, trailer := range rws.trailers {
|
||||||
|
if _, ok := rws.handlerHeader[trailer]; ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// declareTrailer is called for each Trailer header when the
|
// declareTrailer is called for each Trailer header when the
|
||||||
// response header is written. It notes that a header will need to be
|
// response header is written. It notes that a header will need to be
|
||||||
|
@ -2327,16 +2386,8 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
|
||||||
}
|
}
|
||||||
_, hasContentType := rws.snapHeader["Content-Type"]
|
_, hasContentType := rws.snapHeader["Content-Type"]
|
||||||
if !hasContentType && bodyAllowedForStatus(rws.status) && len(p) > 0 {
|
if !hasContentType && bodyAllowedForStatus(rws.status) && len(p) > 0 {
|
||||||
if cto := rws.snapHeader.Get("X-Content-Type-Options"); strings.EqualFold("nosniff", cto) {
|
|
||||||
// nosniff is an explicit directive not to guess a content-type.
|
|
||||||
// Content-sniffing is no less susceptible to polyglot attacks via
|
|
||||||
// hosted content when done on the server.
|
|
||||||
ctype = "application/octet-stream"
|
|
||||||
rws.conn.logf("http2: WriteHeader called with X-Content-Type-Options:nosniff but no Content-Type")
|
|
||||||
} else {
|
|
||||||
ctype = http.DetectContentType(p)
|
ctype = http.DetectContentType(p)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
var date string
|
var date string
|
||||||
if _, ok := rws.snapHeader["Date"]; !ok {
|
if _, ok := rws.snapHeader["Date"]; !ok {
|
||||||
// TODO(bradfitz): be faster here, like net/http? measure.
|
// TODO(bradfitz): be faster here, like net/http? measure.
|
||||||
|
@ -2347,6 +2398,19 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
|
||||||
foreachHeaderElement(v, rws.declareTrailer)
|
foreachHeaderElement(v, rws.declareTrailer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// "Connection" headers aren't allowed in HTTP/2 (RFC 7540, 8.1.2.2),
|
||||||
|
// but respect "Connection" == "close" to mean sending a GOAWAY and tearing
|
||||||
|
// down the TCP connection when idle, like we do for HTTP/1.
|
||||||
|
// TODO: remove more Connection-specific header fields here, in addition
|
||||||
|
// to "Connection".
|
||||||
|
if _, ok := rws.snapHeader["Connection"]; ok {
|
||||||
|
v := rws.snapHeader.Get("Connection")
|
||||||
|
delete(rws.snapHeader, "Connection")
|
||||||
|
if v == "close" {
|
||||||
|
rws.conn.startGracefulShutdown()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp
|
endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp
|
||||||
err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{
|
err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{
|
||||||
streamID: rws.stream.id,
|
streamID: rws.stream.id,
|
||||||
|
@ -2376,7 +2440,10 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
|
||||||
rws.promoteUndeclaredTrailers()
|
rws.promoteUndeclaredTrailers()
|
||||||
}
|
}
|
||||||
|
|
||||||
endStream := rws.handlerDone && !rws.hasTrailers()
|
// only send trailers if they have actually been defined by the
|
||||||
|
// server handler.
|
||||||
|
hasNonemptyTrailers := rws.hasNonemptyTrailers()
|
||||||
|
endStream := rws.handlerDone && !hasNonemptyTrailers
|
||||||
if len(p) > 0 || endStream {
|
if len(p) > 0 || endStream {
|
||||||
// only send a 0 byte DATA frame if we're ending the stream.
|
// only send a 0 byte DATA frame if we're ending the stream.
|
||||||
if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil {
|
if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil {
|
||||||
|
@ -2385,7 +2452,7 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if rws.handlerDone && rws.hasTrailers() {
|
if rws.handlerDone && hasNonemptyTrailers {
|
||||||
err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{
|
err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{
|
||||||
streamID: rws.stream.id,
|
streamID: rws.stream.id,
|
||||||
h: rws.handlerHeader,
|
h: rws.handlerHeader,
|
||||||
|
@ -2613,14 +2680,9 @@ var (
|
||||||
ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS")
|
ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS")
|
||||||
)
|
)
|
||||||
|
|
||||||
// pushOptions is the internal version of http.PushOptions, which we
|
var _ http.Pusher = (*responseWriter)(nil)
|
||||||
// cannot include here because it's only defined in Go 1.8 and later.
|
|
||||||
type pushOptions struct {
|
|
||||||
Method string
|
|
||||||
Header http.Header
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *responseWriter) push(target string, opts pushOptions) error {
|
func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
|
||||||
st := w.rws.stream
|
st := w.rws.stream
|
||||||
sc := st.sc
|
sc := st.sc
|
||||||
sc.serveG.checkNotOn()
|
sc.serveG.checkNotOn()
|
||||||
|
@ -2631,6 +2693,10 @@ func (w *responseWriter) push(target string, opts pushOptions) error {
|
||||||
return ErrRecursivePush
|
return ErrRecursivePush
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts == nil {
|
||||||
|
opts = new(http.PushOptions)
|
||||||
|
}
|
||||||
|
|
||||||
// Default options.
|
// Default options.
|
||||||
if opts.Method == "" {
|
if opts.Method == "" {
|
||||||
opts.Method = "GET"
|
opts.Method = "GET"
|
||||||
|
|
396
vendor/golang.org/x/net/http2/transport.go
generated
vendored
396
vendor/golang.org/x/net/http2/transport.go
generated
vendored
|
@ -10,6 +10,7 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
|
"context"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"errors"
|
"errors"
|
||||||
|
@ -21,10 +22,13 @@ import (
|
||||||
mathrand "math/rand"
|
mathrand "math/rand"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/httptrace"
|
||||||
|
"net/textproto"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/net/http/httpguts"
|
"golang.org/x/net/http/httpguts"
|
||||||
|
@ -94,6 +98,16 @@ type Transport struct {
|
||||||
// to mean no limit.
|
// to mean no limit.
|
||||||
MaxHeaderListSize uint32
|
MaxHeaderListSize uint32
|
||||||
|
|
||||||
|
// StrictMaxConcurrentStreams controls whether the server's
|
||||||
|
// SETTINGS_MAX_CONCURRENT_STREAMS should be respected
|
||||||
|
// globally. If false, new TCP connections are created to the
|
||||||
|
// server as needed to keep each under the per-connection
|
||||||
|
// SETTINGS_MAX_CONCURRENT_STREAMS limit. If true, the
|
||||||
|
// server's SETTINGS_MAX_CONCURRENT_STREAMS is interpreted as
|
||||||
|
// a global limit and callers of RoundTrip block when needed,
|
||||||
|
// waiting for their turn.
|
||||||
|
StrictMaxConcurrentStreams bool
|
||||||
|
|
||||||
// t1, if non-nil, is the standard library Transport using
|
// t1, if non-nil, is the standard library Transport using
|
||||||
// this transport. Its settings are used (but not its
|
// this transport. Its settings are used (but not its
|
||||||
// RoundTrip method, etc).
|
// RoundTrip method, etc).
|
||||||
|
@ -117,16 +131,56 @@ func (t *Transport) disableCompression() bool {
|
||||||
return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression)
|
return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression)
|
||||||
}
|
}
|
||||||
|
|
||||||
var errTransportVersion = errors.New("http2: ConfigureTransport is only supported starting at Go 1.6")
|
|
||||||
|
|
||||||
// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
|
// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
|
||||||
// It requires Go 1.6 or later and returns an error if the net/http package is too old
|
// It returns an error if t1 has already been HTTP/2-enabled.
|
||||||
// or if t1 has already been HTTP/2-enabled.
|
|
||||||
func ConfigureTransport(t1 *http.Transport) error {
|
func ConfigureTransport(t1 *http.Transport) error {
|
||||||
_, err := configureTransport(t1) // in configure_transport.go (go1.6) or not_go16.go
|
_, err := configureTransport(t1)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func configureTransport(t1 *http.Transport) (*Transport, error) {
|
||||||
|
connPool := new(clientConnPool)
|
||||||
|
t2 := &Transport{
|
||||||
|
ConnPool: noDialClientConnPool{connPool},
|
||||||
|
t1: t1,
|
||||||
|
}
|
||||||
|
connPool.t = t2
|
||||||
|
if err := registerHTTPSProtocol(t1, noDialH2RoundTripper{t2}); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if t1.TLSClientConfig == nil {
|
||||||
|
t1.TLSClientConfig = new(tls.Config)
|
||||||
|
}
|
||||||
|
if !strSliceContains(t1.TLSClientConfig.NextProtos, "h2") {
|
||||||
|
t1.TLSClientConfig.NextProtos = append([]string{"h2"}, t1.TLSClientConfig.NextProtos...)
|
||||||
|
}
|
||||||
|
if !strSliceContains(t1.TLSClientConfig.NextProtos, "http/1.1") {
|
||||||
|
t1.TLSClientConfig.NextProtos = append(t1.TLSClientConfig.NextProtos, "http/1.1")
|
||||||
|
}
|
||||||
|
upgradeFn := func(authority string, c *tls.Conn) http.RoundTripper {
|
||||||
|
addr := authorityAddr("https", authority)
|
||||||
|
if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil {
|
||||||
|
go c.Close()
|
||||||
|
return erringRoundTripper{err}
|
||||||
|
} else if !used {
|
||||||
|
// Turns out we don't need this c.
|
||||||
|
// For example, two goroutines made requests to the same host
|
||||||
|
// at the same time, both kicking off TCP dials. (since protocol
|
||||||
|
// was unknown)
|
||||||
|
go c.Close()
|
||||||
|
}
|
||||||
|
return t2
|
||||||
|
}
|
||||||
|
if m := t1.TLSNextProto; len(m) == 0 {
|
||||||
|
t1.TLSNextProto = map[string]func(string, *tls.Conn) http.RoundTripper{
|
||||||
|
"h2": upgradeFn,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m["h2"] = upgradeFn
|
||||||
|
}
|
||||||
|
return t2, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (t *Transport) connPool() ClientConnPool {
|
func (t *Transport) connPool() ClientConnPool {
|
||||||
t.connPoolOnce.Do(t.initConnPool)
|
t.connPoolOnce.Do(t.initConnPool)
|
||||||
return t.connPoolOrDef
|
return t.connPoolOrDef
|
||||||
|
@ -146,6 +200,7 @@ type ClientConn struct {
|
||||||
t *Transport
|
t *Transport
|
||||||
tconn net.Conn // usually *tls.Conn, except specialized impls
|
tconn net.Conn // usually *tls.Conn, except specialized impls
|
||||||
tlsState *tls.ConnectionState // nil only for specialized impls
|
tlsState *tls.ConnectionState // nil only for specialized impls
|
||||||
|
reused uint32 // whether conn is being reused; atomic
|
||||||
singleUse bool // whether being used for a single http.Request
|
singleUse bool // whether being used for a single http.Request
|
||||||
|
|
||||||
// readLoop goroutine fields:
|
// readLoop goroutine fields:
|
||||||
|
@ -159,6 +214,7 @@ type ClientConn struct {
|
||||||
cond *sync.Cond // hold mu; broadcast on flow/closed changes
|
cond *sync.Cond // hold mu; broadcast on flow/closed changes
|
||||||
flow flow // our conn-level flow control quota (cs.flow is per stream)
|
flow flow // our conn-level flow control quota (cs.flow is per stream)
|
||||||
inflow flow // peer's conn-level flow control
|
inflow flow // peer's conn-level flow control
|
||||||
|
closing bool
|
||||||
closed bool
|
closed bool
|
||||||
wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back
|
wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back
|
||||||
goAway *GoAwayFrame // if non-nil, the GoAwayFrame we received
|
goAway *GoAwayFrame // if non-nil, the GoAwayFrame we received
|
||||||
|
@ -190,7 +246,7 @@ type ClientConn struct {
|
||||||
type clientStream struct {
|
type clientStream struct {
|
||||||
cc *ClientConn
|
cc *ClientConn
|
||||||
req *http.Request
|
req *http.Request
|
||||||
trace *clientTrace // or nil
|
trace *httptrace.ClientTrace // or nil
|
||||||
ID uint32
|
ID uint32
|
||||||
resc chan resAndError
|
resc chan resAndError
|
||||||
bufPipe pipe // buffered pipe with the flow-controlled response payload
|
bufPipe pipe // buffered pipe with the flow-controlled response payload
|
||||||
|
@ -214,6 +270,7 @@ type clientStream struct {
|
||||||
firstByte bool // got the first response byte
|
firstByte bool // got the first response byte
|
||||||
pastHeaders bool // got first MetaHeadersFrame (actual headers)
|
pastHeaders bool // got first MetaHeadersFrame (actual headers)
|
||||||
pastTrailers bool // got optional second MetaHeadersFrame (trailers)
|
pastTrailers bool // got optional second MetaHeadersFrame (trailers)
|
||||||
|
num1xx uint8 // number of 1xx responses seen
|
||||||
|
|
||||||
trailer http.Header // accumulated trailers
|
trailer http.Header // accumulated trailers
|
||||||
resTrailer *http.Header // client's Response.Trailer
|
resTrailer *http.Header // client's Response.Trailer
|
||||||
|
@ -223,7 +280,7 @@ type clientStream struct {
|
||||||
// channel to be signaled. A non-nil error is returned only if the request was
|
// channel to be signaled. A non-nil error is returned only if the request was
|
||||||
// canceled.
|
// canceled.
|
||||||
func awaitRequestCancel(req *http.Request, done <-chan struct{}) error {
|
func awaitRequestCancel(req *http.Request, done <-chan struct{}) error {
|
||||||
ctx := reqContext(req)
|
ctx := req.Context()
|
||||||
if req.Cancel == nil && ctx.Done() == nil {
|
if req.Cancel == nil && ctx.Done() == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -237,6 +294,17 @@ func awaitRequestCancel(req *http.Request, done <-chan struct{}) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var got1xxFuncForTests func(int, textproto.MIMEHeader) error
|
||||||
|
|
||||||
|
// get1xxTraceFunc returns the value of request's httptrace.ClientTrace.Got1xxResponse func,
|
||||||
|
// if any. It returns nil if not set or if the Go version is too old.
|
||||||
|
func (cs *clientStream) get1xxTraceFunc() func(int, textproto.MIMEHeader) error {
|
||||||
|
if fn := got1xxFuncForTests; fn != nil {
|
||||||
|
return fn
|
||||||
|
}
|
||||||
|
return traceGot1xxResponseFunc(cs.trace)
|
||||||
|
}
|
||||||
|
|
||||||
// awaitRequestCancel waits for the user to cancel a request, its context to
|
// awaitRequestCancel waits for the user to cancel a request, its context to
|
||||||
// expire, or for the request to be done (any way it might be removed from the
|
// expire, or for the request to be done (any way it might be removed from the
|
||||||
// cc.streams map: peer reset, successful completion, TCP connection breakage,
|
// cc.streams map: peer reset, successful completion, TCP connection breakage,
|
||||||
|
@ -374,7 +442,8 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res
|
||||||
t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err)
|
t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
traceGotConn(req, cc)
|
reused := !atomic.CompareAndSwapUint32(&cc.reused, 0, 1)
|
||||||
|
traceGotConn(req, cc, reused)
|
||||||
res, gotErrAfterReqBodyWrite, err := cc.roundTrip(req)
|
res, gotErrAfterReqBodyWrite, err := cc.roundTrip(req)
|
||||||
if err != nil && retry <= 6 {
|
if err != nil && retry <= 6 {
|
||||||
if req, err = shouldRetryRequest(req, err, gotErrAfterReqBodyWrite); err == nil {
|
if req, err = shouldRetryRequest(req, err, gotErrAfterReqBodyWrite); err == nil {
|
||||||
|
@ -387,8 +456,8 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res
|
||||||
select {
|
select {
|
||||||
case <-time.After(time.Second * time.Duration(backoff)):
|
case <-time.After(time.Second * time.Duration(backoff)):
|
||||||
continue
|
continue
|
||||||
case <-reqContext(req).Done():
|
case <-req.Context().Done():
|
||||||
return nil, reqContext(req).Err()
|
return nil, req.Context().Err()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -423,21 +492,17 @@ func shouldRetryRequest(req *http.Request, err error, afterBodyWrite bool) (*htt
|
||||||
if !canRetryError(err) {
|
if !canRetryError(err) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !afterBodyWrite {
|
|
||||||
return req, nil
|
|
||||||
}
|
|
||||||
// If the Body is nil (or http.NoBody), it's safe to reuse
|
// If the Body is nil (or http.NoBody), it's safe to reuse
|
||||||
// this request and its Body.
|
// this request and its Body.
|
||||||
if req.Body == nil || reqBodyIsNoBody(req.Body) {
|
if req.Body == nil || req.Body == http.NoBody {
|
||||||
return req, nil
|
return req, nil
|
||||||
}
|
}
|
||||||
// Otherwise we depend on the Request having its GetBody
|
|
||||||
// func defined.
|
// If the request body can be reset back to its original
|
||||||
getBody := reqGetBody(req) // Go 1.8: getBody = req.GetBody
|
// state via the optional req.GetBody, do that.
|
||||||
if getBody == nil {
|
if req.GetBody != nil {
|
||||||
return nil, fmt.Errorf("http2: Transport: cannot retry err [%v] after Request.Body was written; define Request.GetBody to avoid this error", err)
|
// TODO: consider a req.Body.Close here? or audit that all caller paths do?
|
||||||
}
|
body, err := req.GetBody()
|
||||||
body, err := getBody()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -446,6 +511,18 @@ func shouldRetryRequest(req *http.Request, err error, afterBodyWrite bool) (*htt
|
||||||
return &newReq, nil
|
return &newReq, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The Request.Body can't reset back to the beginning, but we
|
||||||
|
// don't seem to have started to read from it yet, so reuse
|
||||||
|
// the request directly. The "afterBodyWrite" means the
|
||||||
|
// bodyWrite process has started, which becomes true before
|
||||||
|
// the first Read.
|
||||||
|
if !afterBodyWrite {
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("http2: Transport: cannot retry err [%v] after Request.Body was written; define Request.GetBody to avoid this error", err)
|
||||||
|
}
|
||||||
|
|
||||||
func canRetryError(err error) bool {
|
func canRetryError(err error) bool {
|
||||||
if err == errClientConnUnusable || err == errClientConnGotGoAway {
|
if err == errClientConnUnusable || err == errClientConnGotGoAway {
|
||||||
return true
|
return true
|
||||||
|
@ -471,7 +548,7 @@ func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, er
|
||||||
func (t *Transport) newTLSConfig(host string) *tls.Config {
|
func (t *Transport) newTLSConfig(host string) *tls.Config {
|
||||||
cfg := new(tls.Config)
|
cfg := new(tls.Config)
|
||||||
if t.TLSClientConfig != nil {
|
if t.TLSClientConfig != nil {
|
||||||
*cfg = *cloneTLSConfig(t.TLSClientConfig)
|
*cfg = *t.TLSClientConfig.Clone()
|
||||||
}
|
}
|
||||||
if !strSliceContains(cfg.NextProtos, NextProtoTLS) {
|
if !strSliceContains(cfg.NextProtos, NextProtoTLS) {
|
||||||
cfg.NextProtos = append([]string{NextProtoTLS}, cfg.NextProtos...)
|
cfg.NextProtos = append([]string{NextProtoTLS}, cfg.NextProtos...)
|
||||||
|
@ -522,7 +599,7 @@ func (t *Transport) expectContinueTimeout() time.Duration {
|
||||||
if t.t1 == nil {
|
if t.t1 == nil {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
return transportExpectContinueTimeout(t.t1)
|
return t.t1.ExpectContinueTimeout
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) {
|
func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) {
|
||||||
|
@ -630,12 +707,43 @@ func (cc *ClientConn) CanTakeNewRequest() bool {
|
||||||
return cc.canTakeNewRequestLocked()
|
return cc.canTakeNewRequestLocked()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cc *ClientConn) canTakeNewRequestLocked() bool {
|
// clientConnIdleState describes the suitability of a client
|
||||||
if cc.singleUse && cc.nextStreamID > 1 {
|
// connection to initiate a new RoundTrip request.
|
||||||
return false
|
type clientConnIdleState struct {
|
||||||
|
canTakeNewRequest bool
|
||||||
|
freshConn bool // whether it's unused by any previous request
|
||||||
}
|
}
|
||||||
return cc.goAway == nil && !cc.closed &&
|
|
||||||
int64(cc.nextStreamID)+int64(cc.pendingRequests) < math.MaxInt32
|
func (cc *ClientConn) idleState() clientConnIdleState {
|
||||||
|
cc.mu.Lock()
|
||||||
|
defer cc.mu.Unlock()
|
||||||
|
return cc.idleStateLocked()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) {
|
||||||
|
if cc.singleUse && cc.nextStreamID > 1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var maxConcurrentOkay bool
|
||||||
|
if cc.t.StrictMaxConcurrentStreams {
|
||||||
|
// We'll tell the caller we can take a new request to
|
||||||
|
// prevent the caller from dialing a new TCP
|
||||||
|
// connection, but then we'll block later before
|
||||||
|
// writing it.
|
||||||
|
maxConcurrentOkay = true
|
||||||
|
} else {
|
||||||
|
maxConcurrentOkay = int64(len(cc.streams)+1) < int64(cc.maxConcurrentStreams)
|
||||||
|
}
|
||||||
|
|
||||||
|
st.canTakeNewRequest = cc.goAway == nil && !cc.closed && !cc.closing && maxConcurrentOkay &&
|
||||||
|
int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32
|
||||||
|
st.freshConn = cc.nextStreamID == 1 && st.canTakeNewRequest
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cc *ClientConn) canTakeNewRequestLocked() bool {
|
||||||
|
st := cc.idleStateLocked()
|
||||||
|
return st.canTakeNewRequest
|
||||||
}
|
}
|
||||||
|
|
||||||
// onIdleTimeout is called from a time.AfterFunc goroutine. It will
|
// onIdleTimeout is called from a time.AfterFunc goroutine. It will
|
||||||
|
@ -665,6 +773,87 @@ func (cc *ClientConn) closeIfIdle() {
|
||||||
cc.tconn.Close()
|
cc.tconn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var shutdownEnterWaitStateHook = func() {}
|
||||||
|
|
||||||
|
// Shutdown gracefully close the client connection, waiting for running streams to complete.
|
||||||
|
func (cc *ClientConn) Shutdown(ctx context.Context) error {
|
||||||
|
if err := cc.sendGoAway(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Wait for all in-flight streams to complete or connection to close
|
||||||
|
done := make(chan error, 1)
|
||||||
|
cancelled := false // guarded by cc.mu
|
||||||
|
go func() {
|
||||||
|
cc.mu.Lock()
|
||||||
|
defer cc.mu.Unlock()
|
||||||
|
for {
|
||||||
|
if len(cc.streams) == 0 || cc.closed {
|
||||||
|
cc.closed = true
|
||||||
|
done <- cc.tconn.Close()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if cancelled {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
cc.cond.Wait()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
shutdownEnterWaitStateHook()
|
||||||
|
select {
|
||||||
|
case err := <-done:
|
||||||
|
return err
|
||||||
|
case <-ctx.Done():
|
||||||
|
cc.mu.Lock()
|
||||||
|
// Free the goroutine above
|
||||||
|
cancelled = true
|
||||||
|
cc.cond.Broadcast()
|
||||||
|
cc.mu.Unlock()
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cc *ClientConn) sendGoAway() error {
|
||||||
|
cc.mu.Lock()
|
||||||
|
defer cc.mu.Unlock()
|
||||||
|
cc.wmu.Lock()
|
||||||
|
defer cc.wmu.Unlock()
|
||||||
|
if cc.closing {
|
||||||
|
// GOAWAY sent already
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Send a graceful shutdown frame to server
|
||||||
|
maxStreamID := cc.nextStreamID
|
||||||
|
if err := cc.fr.WriteGoAway(maxStreamID, ErrCodeNo, nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := cc.bw.Flush(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Prevent new requests
|
||||||
|
cc.closing = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the client connection immediately.
|
||||||
|
//
|
||||||
|
// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead.
|
||||||
|
func (cc *ClientConn) Close() error {
|
||||||
|
cc.mu.Lock()
|
||||||
|
defer cc.cond.Broadcast()
|
||||||
|
defer cc.mu.Unlock()
|
||||||
|
err := errors.New("http2: client connection force closed via ClientConn.Close")
|
||||||
|
for id, cs := range cc.streams {
|
||||||
|
select {
|
||||||
|
case cs.resc <- resAndError{err: err}:
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
cs.bufPipe.CloseWithError(err)
|
||||||
|
delete(cc.streams, id)
|
||||||
|
}
|
||||||
|
cc.closed = true
|
||||||
|
return cc.tconn.Close()
|
||||||
|
}
|
||||||
|
|
||||||
const maxAllocFrameSize = 512 << 10
|
const maxAllocFrameSize = 512 << 10
|
||||||
|
|
||||||
// frameBuffer returns a scratch buffer suitable for writing DATA frames.
|
// frameBuffer returns a scratch buffer suitable for writing DATA frames.
|
||||||
|
@ -747,7 +936,7 @@ func checkConnHeaders(req *http.Request) error {
|
||||||
if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") {
|
if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") {
|
||||||
return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv)
|
return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv)
|
||||||
}
|
}
|
||||||
if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "close" && vv[0] != "keep-alive") {
|
if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && !strings.EqualFold(vv[0], "close") && !strings.EqualFold(vv[0], "keep-alive")) {
|
||||||
return fmt.Errorf("http2: invalid Connection request header: %q", vv)
|
return fmt.Errorf("http2: invalid Connection request header: %q", vv)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -757,7 +946,7 @@ func checkConnHeaders(req *http.Request) error {
|
||||||
// req.ContentLength, where 0 actually means zero (not unknown) and -1
|
// req.ContentLength, where 0 actually means zero (not unknown) and -1
|
||||||
// means unknown.
|
// means unknown.
|
||||||
func actualContentLength(req *http.Request) int64 {
|
func actualContentLength(req *http.Request) int64 {
|
||||||
if req.Body == nil || reqBodyIsNoBody(req.Body) {
|
if req.Body == nil || req.Body == http.NoBody {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
if req.ContentLength != 0 {
|
if req.ContentLength != 0 {
|
||||||
|
@ -827,7 +1016,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
||||||
|
|
||||||
cs := cc.newStream()
|
cs := cc.newStream()
|
||||||
cs.req = req
|
cs.req = req
|
||||||
cs.trace = requestTrace(req)
|
cs.trace = httptrace.ContextClientTrace(req.Context())
|
||||||
cs.requestedGzip = requestedGzip
|
cs.requestedGzip = requestedGzip
|
||||||
bodyWriter := cc.t.getBodyWriterState(cs, body)
|
bodyWriter := cc.t.getBodyWriterState(cs, body)
|
||||||
cs.on100 = bodyWriter.on100
|
cs.on100 = bodyWriter.on100
|
||||||
|
@ -865,7 +1054,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
||||||
|
|
||||||
readLoopResCh := cs.resc
|
readLoopResCh := cs.resc
|
||||||
bodyWritten := false
|
bodyWritten := false
|
||||||
ctx := reqContext(req)
|
ctx := req.Context()
|
||||||
|
|
||||||
handleReadLoopResponse := func(re resAndError) (*http.Response, bool, error) {
|
handleReadLoopResponse := func(re resAndError) (*http.Response, bool, error) {
|
||||||
res := re.res
|
res := re.res
|
||||||
|
@ -935,6 +1124,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), err
|
return nil, cs.getStartedWrite(), err
|
||||||
}
|
}
|
||||||
bodyWritten = true
|
bodyWritten = true
|
||||||
|
@ -1056,6 +1246,7 @@ func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (
|
||||||
sawEOF = true
|
sawEOF = true
|
||||||
err = nil
|
err = nil
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
|
cc.writeStreamReset(cs.ID, ErrCodeCancel, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1223,7 +1414,11 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
|
||||||
// followed by the query production (see Sections 3.3 and 3.4 of
|
// followed by the query production (see Sections 3.3 and 3.4 of
|
||||||
// [RFC3986]).
|
// [RFC3986]).
|
||||||
f(":authority", host)
|
f(":authority", host)
|
||||||
f(":method", req.Method)
|
m := req.Method
|
||||||
|
if m == "" {
|
||||||
|
m = http.MethodGet
|
||||||
|
}
|
||||||
|
f(":method", m)
|
||||||
if req.Method != "CONNECT" {
|
if req.Method != "CONNECT" {
|
||||||
f(":path", path)
|
f(":path", path)
|
||||||
f(":scheme", req.URL.Scheme)
|
f(":scheme", req.URL.Scheme)
|
||||||
|
@ -1291,9 +1486,16 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
|
||||||
return nil, errRequestHeaderListSize
|
return nil, errRequestHeaderListSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trace := httptrace.ContextClientTrace(req.Context())
|
||||||
|
traceHeaders := traceHasWroteHeaderField(trace)
|
||||||
|
|
||||||
// Header list size is ok. Write the headers.
|
// Header list size is ok. Write the headers.
|
||||||
enumerateHeaders(func(name, value string) {
|
enumerateHeaders(func(name, value string) {
|
||||||
cc.writeHeader(strings.ToLower(name), value)
|
name = strings.ToLower(name)
|
||||||
|
cc.writeHeader(name, value)
|
||||||
|
if traceHeaders {
|
||||||
|
traceWroteHeaderField(trace, name, value)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return cc.hbuf.Bytes(), nil
|
return cc.hbuf.Bytes(), nil
|
||||||
|
@ -1615,8 +1817,7 @@ func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error {
|
||||||
// is the detail.
|
// is the detail.
|
||||||
//
|
//
|
||||||
// As a special case, handleResponse may return (nil, nil) to skip the
|
// As a special case, handleResponse may return (nil, nil) to skip the
|
||||||
// frame (currently only used for 100 expect continue). This special
|
// frame (currently only used for 1xx responses).
|
||||||
// case is going away after Issue 13851 is fixed.
|
|
||||||
func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFrame) (*http.Response, error) {
|
func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFrame) (*http.Response, error) {
|
||||||
if f.Truncated {
|
if f.Truncated {
|
||||||
return nil, errResponseHeaderListSize
|
return nil, errResponseHeaderListSize
|
||||||
|
@ -1631,15 +1832,6 @@ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFra
|
||||||
return nil, errors.New("malformed response from server: malformed non-numeric status pseudo header")
|
return nil, errors.New("malformed response from server: malformed non-numeric status pseudo header")
|
||||||
}
|
}
|
||||||
|
|
||||||
if statusCode == 100 {
|
|
||||||
traceGot100Continue(cs.trace)
|
|
||||||
if cs.on100 != nil {
|
|
||||||
cs.on100() // forces any write delay timer to fire
|
|
||||||
}
|
|
||||||
cs.pastHeaders = false // do it all again
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
header := make(http.Header)
|
header := make(http.Header)
|
||||||
res := &http.Response{
|
res := &http.Response{
|
||||||
Proto: "HTTP/2.0",
|
Proto: "HTTP/2.0",
|
||||||
|
@ -1664,6 +1856,27 @@ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFra
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if statusCode >= 100 && statusCode <= 199 {
|
||||||
|
cs.num1xx++
|
||||||
|
const max1xxResponses = 5 // arbitrary bound on number of informational responses, same as net/http
|
||||||
|
if cs.num1xx > max1xxResponses {
|
||||||
|
return nil, errors.New("http2: too many 1xx informational responses")
|
||||||
|
}
|
||||||
|
if fn := cs.get1xxTraceFunc(); fn != nil {
|
||||||
|
if err := fn(statusCode, textproto.MIMEHeader(header)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if statusCode == 100 {
|
||||||
|
traceGot100Continue(cs.trace)
|
||||||
|
if cs.on100 != nil {
|
||||||
|
cs.on100() // forces any write delay timer to fire
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cs.pastHeaders = false // do it all again
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
streamEnded := f.StreamEnded()
|
streamEnded := f.StreamEnded()
|
||||||
isHead := cs.req.Method == "HEAD"
|
isHead := cs.req.Method == "HEAD"
|
||||||
if !streamEnded || isHead {
|
if !streamEnded || isHead {
|
||||||
|
@ -1696,7 +1909,7 @@ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFra
|
||||||
res.Header.Del("Content-Length")
|
res.Header.Del("Content-Length")
|
||||||
res.ContentLength = -1
|
res.ContentLength = -1
|
||||||
res.Body = &gzipReader{body: res.Body}
|
res.Body = &gzipReader{body: res.Body}
|
||||||
setResponseUncompressed(res)
|
res.Uncompressed = true
|
||||||
}
|
}
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
@ -2073,8 +2286,7 @@ func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ping sends a PING frame to the server and waits for the ack.
|
// Ping sends a PING frame to the server and waits for the ack.
|
||||||
// Public implementation is in go17.go and not_go17.go
|
func (cc *ClientConn) Ping(ctx context.Context) error {
|
||||||
func (cc *ClientConn) ping(ctx contextContext) error {
|
|
||||||
c := make(chan struct{})
|
c := make(chan struct{})
|
||||||
// Generate a random payload
|
// Generate a random payload
|
||||||
var p [8]byte
|
var p [8]byte
|
||||||
|
@ -2308,3 +2520,91 @@ func (s bodyWriterState) scheduleBodyWrite() {
|
||||||
func isConnectionCloseRequest(req *http.Request) bool {
|
func isConnectionCloseRequest(req *http.Request) bool {
|
||||||
return req.Close || httpguts.HeaderValuesContainsToken(req.Header["Connection"], "close")
|
return req.Close || httpguts.HeaderValuesContainsToken(req.Header["Connection"], "close")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// registerHTTPSProtocol calls Transport.RegisterProtocol but
|
||||||
|
// converting panics into errors.
|
||||||
|
func registerHTTPSProtocol(t *http.Transport, rt noDialH2RoundTripper) (err error) {
|
||||||
|
defer func() {
|
||||||
|
if e := recover(); e != nil {
|
||||||
|
err = fmt.Errorf("%v", e)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
t.RegisterProtocol("https", rt)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// noDialH2RoundTripper is a RoundTripper which only tries to complete the request
|
||||||
|
// if there's already has a cached connection to the host.
|
||||||
|
// (The field is exported so it can be accessed via reflect from net/http; tested
|
||||||
|
// by TestNoDialH2RoundTripperType)
|
||||||
|
type noDialH2RoundTripper struct{ *Transport }
|
||||||
|
|
||||||
|
func (rt noDialH2RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||||
|
res, err := rt.Transport.RoundTrip(req)
|
||||||
|
if isNoCachedConnError(err) {
|
||||||
|
return nil, http.ErrSkipAltProtocol
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transport) idleConnTimeout() time.Duration {
|
||||||
|
if t.t1 != nil {
|
||||||
|
return t.t1.IdleConnTimeout
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceGetConn(req *http.Request, hostPort string) {
|
||||||
|
trace := httptrace.ContextClientTrace(req.Context())
|
||||||
|
if trace == nil || trace.GetConn == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
trace.GetConn(hostPort)
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceGotConn(req *http.Request, cc *ClientConn, reused bool) {
|
||||||
|
trace := httptrace.ContextClientTrace(req.Context())
|
||||||
|
if trace == nil || trace.GotConn == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ci := httptrace.GotConnInfo{Conn: cc.tconn}
|
||||||
|
ci.Reused = reused
|
||||||
|
cc.mu.Lock()
|
||||||
|
ci.WasIdle = len(cc.streams) == 0 && reused
|
||||||
|
if ci.WasIdle && !cc.lastActive.IsZero() {
|
||||||
|
ci.IdleTime = time.Now().Sub(cc.lastActive)
|
||||||
|
}
|
||||||
|
cc.mu.Unlock()
|
||||||
|
|
||||||
|
trace.GotConn(ci)
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceWroteHeaders(trace *httptrace.ClientTrace) {
|
||||||
|
if trace != nil && trace.WroteHeaders != nil {
|
||||||
|
trace.WroteHeaders()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceGot100Continue(trace *httptrace.ClientTrace) {
|
||||||
|
if trace != nil && trace.Got100Continue != nil {
|
||||||
|
trace.Got100Continue()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceWait100Continue(trace *httptrace.ClientTrace) {
|
||||||
|
if trace != nil && trace.Wait100Continue != nil {
|
||||||
|
trace.Wait100Continue()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceWroteRequest(trace *httptrace.ClientTrace, err error) {
|
||||||
|
if trace != nil && trace.WroteRequest != nil {
|
||||||
|
trace.WroteRequest(httptrace.WroteRequestInfo{Err: err})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceFirstResponseByte(trace *httptrace.ClientTrace) {
|
||||||
|
if trace != nil && trace.GotFirstResponseByte != nil {
|
||||||
|
trace.GotFirstResponseByte()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
4
vendor/golang.org/x/net/http2/write.go
generated
vendored
4
vendor/golang.org/x/net/http2/write.go
generated
vendored
|
@ -199,7 +199,7 @@ func (w *writeResHeaders) staysWithinBuffer(max int) bool {
|
||||||
// TODO: this is a common one. It'd be nice to return true
|
// TODO: this is a common one. It'd be nice to return true
|
||||||
// here and get into the fast path if we could be clever and
|
// here and get into the fast path if we could be clever and
|
||||||
// calculate the size fast enough, or at least a conservative
|
// calculate the size fast enough, or at least a conservative
|
||||||
// uppper bound that usually fires. (Maybe if w.h and
|
// upper bound that usually fires. (Maybe if w.h and
|
||||||
// w.trailers are nil, so we don't need to enumerate it.)
|
// w.trailers are nil, so we don't need to enumerate it.)
|
||||||
// Otherwise I'm afraid that just calculating the length to
|
// Otherwise I'm afraid that just calculating the length to
|
||||||
// answer this question would be slower than the ~2µs benefit.
|
// answer this question would be slower than the ~2µs benefit.
|
||||||
|
@ -329,7 +329,7 @@ func (wu writeWindowUpdate) writeFrame(ctx writeContext) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// encodeHeaders encodes an http.Header. If keys is not nil, then (k, h[k])
|
// encodeHeaders encodes an http.Header. If keys is not nil, then (k, h[k])
|
||||||
// is encoded only only if k is in keys.
|
// is encoded only if k is in keys.
|
||||||
func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) {
|
func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) {
|
||||||
if keys == nil {
|
if keys == nil {
|
||||||
sorter := sorterPool.Get().(*sorter)
|
sorter := sorterPool.Get().(*sorter)
|
||||||
|
|
8
vendor/golang.org/x/net/idna/idna.go → vendor/golang.org/x/net/idna/idna10.0.0.go
generated
vendored
8
vendor/golang.org/x/net/idna/idna.go → vendor/golang.org/x/net/idna/idna10.0.0.go
generated
vendored
|
@ -4,14 +4,16 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build go1.10
|
||||||
|
|
||||||
// Package idna implements IDNA2008 using the compatibility processing
|
// Package idna implements IDNA2008 using the compatibility processing
|
||||||
// defined by UTS (Unicode Technical Standard) #46, which defines a standard to
|
// defined by UTS (Unicode Technical Standard) #46, which defines a standard to
|
||||||
// deal with the transition from IDNA2003.
|
// deal with the transition from IDNA2003.
|
||||||
//
|
//
|
||||||
// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC
|
// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC
|
||||||
// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.
|
// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.
|
||||||
// UTS #46 is defined in http://www.unicode.org/reports/tr46.
|
// UTS #46 is defined in https://www.unicode.org/reports/tr46.
|
||||||
// See http://unicode.org/cldr/utility/idna.jsp for a visualization of the
|
// See https://unicode.org/cldr/utility/idna.jsp for a visualization of the
|
||||||
// differences between these two standards.
|
// differences between these two standards.
|
||||||
package idna // import "golang.org/x/net/idna"
|
package idna // import "golang.org/x/net/idna"
|
||||||
|
|
||||||
|
@ -297,7 +299,7 @@ func (e runeError) Error() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// process implements the algorithm described in section 4 of UTS #46,
|
// process implements the algorithm described in section 4 of UTS #46,
|
||||||
// see http://www.unicode.org/reports/tr46.
|
// see https://www.unicode.org/reports/tr46.
|
||||||
func (p *Profile) process(s string, toASCII bool) (string, error) {
|
func (p *Profile) process(s string, toASCII bool) (string, error) {
|
||||||
var err error
|
var err error
|
||||||
var isBidi bool
|
var isBidi bool
|
682
vendor/golang.org/x/net/idna/idna9.0.0.go
generated
vendored
Normal file
682
vendor/golang.org/x/net/idna/idna9.0.0.go
generated
vendored
Normal file
|
@ -0,0 +1,682 @@
|
||||||
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build !go1.10
|
||||||
|
|
||||||
|
// Package idna implements IDNA2008 using the compatibility processing
|
||||||
|
// defined by UTS (Unicode Technical Standard) #46, which defines a standard to
|
||||||
|
// deal with the transition from IDNA2003.
|
||||||
|
//
|
||||||
|
// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC
|
||||||
|
// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.
|
||||||
|
// UTS #46 is defined in https://www.unicode.org/reports/tr46.
|
||||||
|
// See https://unicode.org/cldr/utility/idna.jsp for a visualization of the
|
||||||
|
// differences between these two standards.
|
||||||
|
package idna // import "golang.org/x/net/idna"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"golang.org/x/text/secure/bidirule"
|
||||||
|
"golang.org/x/text/unicode/norm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NOTE: Unlike common practice in Go APIs, the functions will return a
|
||||||
|
// sanitized domain name in case of errors. Browsers sometimes use a partially
|
||||||
|
// evaluated string as lookup.
|
||||||
|
// TODO: the current error handling is, in my opinion, the least opinionated.
|
||||||
|
// Other strategies are also viable, though:
|
||||||
|
// Option 1) Return an empty string in case of error, but allow the user to
|
||||||
|
// specify explicitly which errors to ignore.
|
||||||
|
// Option 2) Return the partially evaluated string if it is itself a valid
|
||||||
|
// string, otherwise return the empty string in case of error.
|
||||||
|
// Option 3) Option 1 and 2.
|
||||||
|
// Option 4) Always return an empty string for now and implement Option 1 as
|
||||||
|
// needed, and document that the return string may not be empty in case of
|
||||||
|
// error in the future.
|
||||||
|
// I think Option 1 is best, but it is quite opinionated.
|
||||||
|
|
||||||
|
// ToASCII is a wrapper for Punycode.ToASCII.
|
||||||
|
func ToASCII(s string) (string, error) {
|
||||||
|
return Punycode.process(s, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToUnicode is a wrapper for Punycode.ToUnicode.
|
||||||
|
func ToUnicode(s string) (string, error) {
|
||||||
|
return Punycode.process(s, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// An Option configures a Profile at creation time.
|
||||||
|
type Option func(*options)
|
||||||
|
|
||||||
|
// Transitional sets a Profile to use the Transitional mapping as defined in UTS
|
||||||
|
// #46. This will cause, for example, "ß" to be mapped to "ss". Using the
|
||||||
|
// transitional mapping provides a compromise between IDNA2003 and IDNA2008
|
||||||
|
// compatibility. It is used by most browsers when resolving domain names. This
|
||||||
|
// option is only meaningful if combined with MapForLookup.
|
||||||
|
func Transitional(transitional bool) Option {
|
||||||
|
return func(o *options) { o.transitional = true }
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts
|
||||||
|
// are longer than allowed by the RFC.
|
||||||
|
func VerifyDNSLength(verify bool) Option {
|
||||||
|
return func(o *options) { o.verifyDNSLength = verify }
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveLeadingDots removes leading label separators. Leading runes that map to
|
||||||
|
// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
|
||||||
|
//
|
||||||
|
// This is the behavior suggested by the UTS #46 and is adopted by some
|
||||||
|
// browsers.
|
||||||
|
func RemoveLeadingDots(remove bool) Option {
|
||||||
|
return func(o *options) { o.removeLeadingDots = remove }
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateLabels sets whether to check the mandatory label validation criteria
|
||||||
|
// as defined in Section 5.4 of RFC 5891. This includes testing for correct use
|
||||||
|
// of hyphens ('-'), normalization, validity of runes, and the context rules.
|
||||||
|
func ValidateLabels(enable bool) Option {
|
||||||
|
return func(o *options) {
|
||||||
|
// Don't override existing mappings, but set one that at least checks
|
||||||
|
// normalization if it is not set.
|
||||||
|
if o.mapping == nil && enable {
|
||||||
|
o.mapping = normalize
|
||||||
|
}
|
||||||
|
o.trie = trie
|
||||||
|
o.validateLabels = enable
|
||||||
|
o.fromPuny = validateFromPunycode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// StrictDomainName limits the set of permissable ASCII characters to those
|
||||||
|
// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
|
||||||
|
// hyphen). This is set by default for MapForLookup and ValidateForRegistration.
|
||||||
|
//
|
||||||
|
// This option is useful, for instance, for browsers that allow characters
|
||||||
|
// outside this range, for example a '_' (U+005F LOW LINE). See
|
||||||
|
// http://www.rfc-editor.org/std/std3.txt for more details This option
|
||||||
|
// corresponds to the UseSTD3ASCIIRules option in UTS #46.
|
||||||
|
func StrictDomainName(use bool) Option {
|
||||||
|
return func(o *options) {
|
||||||
|
o.trie = trie
|
||||||
|
o.useSTD3Rules = use
|
||||||
|
o.fromPuny = validateFromPunycode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: the following options pull in tables. The tables should not be linked
|
||||||
|
// in as long as the options are not used.
|
||||||
|
|
||||||
|
// BidiRule enables the Bidi rule as defined in RFC 5893. Any application
|
||||||
|
// that relies on proper validation of labels should include this rule.
|
||||||
|
func BidiRule() Option {
|
||||||
|
return func(o *options) { o.bidirule = bidirule.ValidString }
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateForRegistration sets validation options to verify that a given IDN is
|
||||||
|
// properly formatted for registration as defined by Section 4 of RFC 5891.
|
||||||
|
func ValidateForRegistration() Option {
|
||||||
|
return func(o *options) {
|
||||||
|
o.mapping = validateRegistration
|
||||||
|
StrictDomainName(true)(o)
|
||||||
|
ValidateLabels(true)(o)
|
||||||
|
VerifyDNSLength(true)(o)
|
||||||
|
BidiRule()(o)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MapForLookup sets validation and mapping options such that a given IDN is
|
||||||
|
// transformed for domain name lookup according to the requirements set out in
|
||||||
|
// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894,
|
||||||
|
// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option
|
||||||
|
// to add this check.
|
||||||
|
//
|
||||||
|
// The mappings include normalization and mapping case, width and other
|
||||||
|
// compatibility mappings.
|
||||||
|
func MapForLookup() Option {
|
||||||
|
return func(o *options) {
|
||||||
|
o.mapping = validateAndMap
|
||||||
|
StrictDomainName(true)(o)
|
||||||
|
ValidateLabels(true)(o)
|
||||||
|
RemoveLeadingDots(true)(o)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type options struct {
|
||||||
|
transitional bool
|
||||||
|
useSTD3Rules bool
|
||||||
|
validateLabels bool
|
||||||
|
verifyDNSLength bool
|
||||||
|
removeLeadingDots bool
|
||||||
|
|
||||||
|
trie *idnaTrie
|
||||||
|
|
||||||
|
// fromPuny calls validation rules when converting A-labels to U-labels.
|
||||||
|
fromPuny func(p *Profile, s string) error
|
||||||
|
|
||||||
|
// mapping implements a validation and mapping step as defined in RFC 5895
|
||||||
|
// or UTS 46, tailored to, for example, domain registration or lookup.
|
||||||
|
mapping func(p *Profile, s string) (string, error)
|
||||||
|
|
||||||
|
// bidirule, if specified, checks whether s conforms to the Bidi Rule
|
||||||
|
// defined in RFC 5893.
|
||||||
|
bidirule func(s string) bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Profile defines the configuration of a IDNA mapper.
|
||||||
|
type Profile struct {
|
||||||
|
options
|
||||||
|
}
|
||||||
|
|
||||||
|
func apply(o *options, opts []Option) {
|
||||||
|
for _, f := range opts {
|
||||||
|
f(o)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new Profile.
|
||||||
|
//
|
||||||
|
// With no options, the returned Profile is the most permissive and equals the
|
||||||
|
// Punycode Profile. Options can be passed to further restrict the Profile. The
|
||||||
|
// MapForLookup and ValidateForRegistration options set a collection of options,
|
||||||
|
// for lookup and registration purposes respectively, which can be tailored by
|
||||||
|
// adding more fine-grained options, where later options override earlier
|
||||||
|
// options.
|
||||||
|
func New(o ...Option) *Profile {
|
||||||
|
p := &Profile{}
|
||||||
|
apply(&p.options, o)
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToASCII converts a domain or domain label to its ASCII form. For example,
|
||||||
|
// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and
|
||||||
|
// ToASCII("golang") is "golang". If an error is encountered it will return
|
||||||
|
// an error and a (partially) processed result.
|
||||||
|
func (p *Profile) ToASCII(s string) (string, error) {
|
||||||
|
return p.process(s, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToUnicode converts a domain or domain label to its Unicode form. For example,
|
||||||
|
// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and
|
||||||
|
// ToUnicode("golang") is "golang". If an error is encountered it will return
|
||||||
|
// an error and a (partially) processed result.
|
||||||
|
func (p *Profile) ToUnicode(s string) (string, error) {
|
||||||
|
pp := *p
|
||||||
|
pp.transitional = false
|
||||||
|
return pp.process(s, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// String reports a string with a description of the profile for debugging
|
||||||
|
// purposes. The string format may change with different versions.
|
||||||
|
func (p *Profile) String() string {
|
||||||
|
s := ""
|
||||||
|
if p.transitional {
|
||||||
|
s = "Transitional"
|
||||||
|
} else {
|
||||||
|
s = "NonTransitional"
|
||||||
|
}
|
||||||
|
if p.useSTD3Rules {
|
||||||
|
s += ":UseSTD3Rules"
|
||||||
|
}
|
||||||
|
if p.validateLabels {
|
||||||
|
s += ":ValidateLabels"
|
||||||
|
}
|
||||||
|
if p.verifyDNSLength {
|
||||||
|
s += ":VerifyDNSLength"
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Punycode is a Profile that does raw punycode processing with a minimum
|
||||||
|
// of validation.
|
||||||
|
Punycode *Profile = punycode
|
||||||
|
|
||||||
|
// Lookup is the recommended profile for looking up domain names, according
|
||||||
|
// to Section 5 of RFC 5891. The exact configuration of this profile may
|
||||||
|
// change over time.
|
||||||
|
Lookup *Profile = lookup
|
||||||
|
|
||||||
|
// Display is the recommended profile for displaying domain names.
|
||||||
|
// The configuration of this profile may change over time.
|
||||||
|
Display *Profile = display
|
||||||
|
|
||||||
|
// Registration is the recommended profile for checking whether a given
|
||||||
|
// IDN is valid for registration, according to Section 4 of RFC 5891.
|
||||||
|
Registration *Profile = registration
|
||||||
|
|
||||||
|
punycode = &Profile{}
|
||||||
|
lookup = &Profile{options{
|
||||||
|
transitional: true,
|
||||||
|
useSTD3Rules: true,
|
||||||
|
validateLabels: true,
|
||||||
|
removeLeadingDots: true,
|
||||||
|
trie: trie,
|
||||||
|
fromPuny: validateFromPunycode,
|
||||||
|
mapping: validateAndMap,
|
||||||
|
bidirule: bidirule.ValidString,
|
||||||
|
}}
|
||||||
|
display = &Profile{options{
|
||||||
|
useSTD3Rules: true,
|
||||||
|
validateLabels: true,
|
||||||
|
removeLeadingDots: true,
|
||||||
|
trie: trie,
|
||||||
|
fromPuny: validateFromPunycode,
|
||||||
|
mapping: validateAndMap,
|
||||||
|
bidirule: bidirule.ValidString,
|
||||||
|
}}
|
||||||
|
registration = &Profile{options{
|
||||||
|
useSTD3Rules: true,
|
||||||
|
validateLabels: true,
|
||||||
|
verifyDNSLength: true,
|
||||||
|
trie: trie,
|
||||||
|
fromPuny: validateFromPunycode,
|
||||||
|
mapping: validateRegistration,
|
||||||
|
bidirule: bidirule.ValidString,
|
||||||
|
}}
|
||||||
|
|
||||||
|
// TODO: profiles
|
||||||
|
// Register: recommended for approving domain names: don't do any mappings
|
||||||
|
// but rather reject on invalid input. Bundle or block deviation characters.
|
||||||
|
)
|
||||||
|
|
||||||
|
type labelError struct{ label, code_ string }
|
||||||
|
|
||||||
|
func (e labelError) code() string { return e.code_ }
|
||||||
|
func (e labelError) Error() string {
|
||||||
|
return fmt.Sprintf("idna: invalid label %q", e.label)
|
||||||
|
}
|
||||||
|
|
||||||
|
type runeError rune
|
||||||
|
|
||||||
|
func (e runeError) code() string { return "P1" }
|
||||||
|
func (e runeError) Error() string {
|
||||||
|
return fmt.Sprintf("idna: disallowed rune %U", e)
|
||||||
|
}
|
||||||
|
|
||||||
|
// process implements the algorithm described in section 4 of UTS #46,
|
||||||
|
// see https://www.unicode.org/reports/tr46.
|
||||||
|
func (p *Profile) process(s string, toASCII bool) (string, error) {
|
||||||
|
var err error
|
||||||
|
if p.mapping != nil {
|
||||||
|
s, err = p.mapping(p, s)
|
||||||
|
}
|
||||||
|
// Remove leading empty labels.
|
||||||
|
if p.removeLeadingDots {
|
||||||
|
for ; len(s) > 0 && s[0] == '.'; s = s[1:] {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// It seems like we should only create this error on ToASCII, but the
|
||||||
|
// UTS 46 conformance tests suggests we should always check this.
|
||||||
|
if err == nil && p.verifyDNSLength && s == "" {
|
||||||
|
err = &labelError{s, "A4"}
|
||||||
|
}
|
||||||
|
labels := labelIter{orig: s}
|
||||||
|
for ; !labels.done(); labels.next() {
|
||||||
|
label := labels.label()
|
||||||
|
if label == "" {
|
||||||
|
// Empty labels are not okay. The label iterator skips the last
|
||||||
|
// label if it is empty.
|
||||||
|
if err == nil && p.verifyDNSLength {
|
||||||
|
err = &labelError{s, "A4"}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(label, acePrefix) {
|
||||||
|
u, err2 := decode(label[len(acePrefix):])
|
||||||
|
if err2 != nil {
|
||||||
|
if err == nil {
|
||||||
|
err = err2
|
||||||
|
}
|
||||||
|
// Spec says keep the old label.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
labels.set(u)
|
||||||
|
if err == nil && p.validateLabels {
|
||||||
|
err = p.fromPuny(p, u)
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
|
// This should be called on NonTransitional, according to the
|
||||||
|
// spec, but that currently does not have any effect. Use the
|
||||||
|
// original profile to preserve options.
|
||||||
|
err = p.validateLabel(u)
|
||||||
|
}
|
||||||
|
} else if err == nil {
|
||||||
|
err = p.validateLabel(label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if toASCII {
|
||||||
|
for labels.reset(); !labels.done(); labels.next() {
|
||||||
|
label := labels.label()
|
||||||
|
if !ascii(label) {
|
||||||
|
a, err2 := encode(acePrefix, label)
|
||||||
|
if err == nil {
|
||||||
|
err = err2
|
||||||
|
}
|
||||||
|
label = a
|
||||||
|
labels.set(a)
|
||||||
|
}
|
||||||
|
n := len(label)
|
||||||
|
if p.verifyDNSLength && err == nil && (n == 0 || n > 63) {
|
||||||
|
err = &labelError{label, "A4"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s = labels.result()
|
||||||
|
if toASCII && p.verifyDNSLength && err == nil {
|
||||||
|
// Compute the length of the domain name minus the root label and its dot.
|
||||||
|
n := len(s)
|
||||||
|
if n > 0 && s[n-1] == '.' {
|
||||||
|
n--
|
||||||
|
}
|
||||||
|
if len(s) < 1 || n > 253 {
|
||||||
|
err = &labelError{s, "A4"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func normalize(p *Profile, s string) (string, error) {
|
||||||
|
return norm.NFC.String(s), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateRegistration(p *Profile, s string) (string, error) {
|
||||||
|
if !norm.NFC.IsNormalString(s) {
|
||||||
|
return s, &labelError{s, "V1"}
|
||||||
|
}
|
||||||
|
for i := 0; i < len(s); {
|
||||||
|
v, sz := trie.lookupString(s[i:])
|
||||||
|
// Copy bytes not copied so far.
|
||||||
|
switch p.simplify(info(v).category()) {
|
||||||
|
// TODO: handle the NV8 defined in the Unicode idna data set to allow
|
||||||
|
// for strict conformance to IDNA2008.
|
||||||
|
case valid, deviation:
|
||||||
|
case disallowed, mapped, unknown, ignored:
|
||||||
|
r, _ := utf8.DecodeRuneInString(s[i:])
|
||||||
|
return s, runeError(r)
|
||||||
|
}
|
||||||
|
i += sz
|
||||||
|
}
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateAndMap(p *Profile, s string) (string, error) {
|
||||||
|
var (
|
||||||
|
err error
|
||||||
|
b []byte
|
||||||
|
k int
|
||||||
|
)
|
||||||
|
for i := 0; i < len(s); {
|
||||||
|
v, sz := trie.lookupString(s[i:])
|
||||||
|
start := i
|
||||||
|
i += sz
|
||||||
|
// Copy bytes not copied so far.
|
||||||
|
switch p.simplify(info(v).category()) {
|
||||||
|
case valid:
|
||||||
|
continue
|
||||||
|
case disallowed:
|
||||||
|
if err == nil {
|
||||||
|
r, _ := utf8.DecodeRuneInString(s[start:])
|
||||||
|
err = runeError(r)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
case mapped, deviation:
|
||||||
|
b = append(b, s[k:start]...)
|
||||||
|
b = info(v).appendMapping(b, s[start:i])
|
||||||
|
case ignored:
|
||||||
|
b = append(b, s[k:start]...)
|
||||||
|
// drop the rune
|
||||||
|
case unknown:
|
||||||
|
b = append(b, s[k:start]...)
|
||||||
|
b = append(b, "\ufffd"...)
|
||||||
|
}
|
||||||
|
k = i
|
||||||
|
}
|
||||||
|
if k == 0 {
|
||||||
|
// No changes so far.
|
||||||
|
s = norm.NFC.String(s)
|
||||||
|
} else {
|
||||||
|
b = append(b, s[k:]...)
|
||||||
|
if norm.NFC.QuickSpan(b) != len(b) {
|
||||||
|
b = norm.NFC.Bytes(b)
|
||||||
|
}
|
||||||
|
// TODO: the punycode converters require strings as input.
|
||||||
|
s = string(b)
|
||||||
|
}
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// A labelIter allows iterating over domain name labels.
|
||||||
|
type labelIter struct {
|
||||||
|
orig string
|
||||||
|
slice []string
|
||||||
|
curStart int
|
||||||
|
curEnd int
|
||||||
|
i int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *labelIter) reset() {
|
||||||
|
l.curStart = 0
|
||||||
|
l.curEnd = 0
|
||||||
|
l.i = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *labelIter) done() bool {
|
||||||
|
return l.curStart >= len(l.orig)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *labelIter) result() string {
|
||||||
|
if l.slice != nil {
|
||||||
|
return strings.Join(l.slice, ".")
|
||||||
|
}
|
||||||
|
return l.orig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *labelIter) label() string {
|
||||||
|
if l.slice != nil {
|
||||||
|
return l.slice[l.i]
|
||||||
|
}
|
||||||
|
p := strings.IndexByte(l.orig[l.curStart:], '.')
|
||||||
|
l.curEnd = l.curStart + p
|
||||||
|
if p == -1 {
|
||||||
|
l.curEnd = len(l.orig)
|
||||||
|
}
|
||||||
|
return l.orig[l.curStart:l.curEnd]
|
||||||
|
}
|
||||||
|
|
||||||
|
// next sets the value to the next label. It skips the last label if it is empty.
|
||||||
|
func (l *labelIter) next() {
|
||||||
|
l.i++
|
||||||
|
if l.slice != nil {
|
||||||
|
if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" {
|
||||||
|
l.curStart = len(l.orig)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
l.curStart = l.curEnd + 1
|
||||||
|
if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' {
|
||||||
|
l.curStart = len(l.orig)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *labelIter) set(s string) {
|
||||||
|
if l.slice == nil {
|
||||||
|
l.slice = strings.Split(l.orig, ".")
|
||||||
|
}
|
||||||
|
l.slice[l.i] = s
|
||||||
|
}
|
||||||
|
|
||||||
|
// acePrefix is the ASCII Compatible Encoding prefix.
|
||||||
|
const acePrefix = "xn--"
|
||||||
|
|
||||||
|
func (p *Profile) simplify(cat category) category {
|
||||||
|
switch cat {
|
||||||
|
case disallowedSTD3Mapped:
|
||||||
|
if p.useSTD3Rules {
|
||||||
|
cat = disallowed
|
||||||
|
} else {
|
||||||
|
cat = mapped
|
||||||
|
}
|
||||||
|
case disallowedSTD3Valid:
|
||||||
|
if p.useSTD3Rules {
|
||||||
|
cat = disallowed
|
||||||
|
} else {
|
||||||
|
cat = valid
|
||||||
|
}
|
||||||
|
case deviation:
|
||||||
|
if !p.transitional {
|
||||||
|
cat = valid
|
||||||
|
}
|
||||||
|
case validNV8, validXV8:
|
||||||
|
// TODO: handle V2008
|
||||||
|
cat = valid
|
||||||
|
}
|
||||||
|
return cat
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateFromPunycode(p *Profile, s string) error {
|
||||||
|
if !norm.NFC.IsNormalString(s) {
|
||||||
|
return &labelError{s, "V1"}
|
||||||
|
}
|
||||||
|
for i := 0; i < len(s); {
|
||||||
|
v, sz := trie.lookupString(s[i:])
|
||||||
|
if c := p.simplify(info(v).category()); c != valid && c != deviation {
|
||||||
|
return &labelError{s, "V6"}
|
||||||
|
}
|
||||||
|
i += sz
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
zwnj = "\u200c"
|
||||||
|
zwj = "\u200d"
|
||||||
|
)
|
||||||
|
|
||||||
|
type joinState int8
|
||||||
|
|
||||||
|
const (
|
||||||
|
stateStart joinState = iota
|
||||||
|
stateVirama
|
||||||
|
stateBefore
|
||||||
|
stateBeforeVirama
|
||||||
|
stateAfter
|
||||||
|
stateFAIL
|
||||||
|
)
|
||||||
|
|
||||||
|
var joinStates = [][numJoinTypes]joinState{
|
||||||
|
stateStart: {
|
||||||
|
joiningL: stateBefore,
|
||||||
|
joiningD: stateBefore,
|
||||||
|
joinZWNJ: stateFAIL,
|
||||||
|
joinZWJ: stateFAIL,
|
||||||
|
joinVirama: stateVirama,
|
||||||
|
},
|
||||||
|
stateVirama: {
|
||||||
|
joiningL: stateBefore,
|
||||||
|
joiningD: stateBefore,
|
||||||
|
},
|
||||||
|
stateBefore: {
|
||||||
|
joiningL: stateBefore,
|
||||||
|
joiningD: stateBefore,
|
||||||
|
joiningT: stateBefore,
|
||||||
|
joinZWNJ: stateAfter,
|
||||||
|
joinZWJ: stateFAIL,
|
||||||
|
joinVirama: stateBeforeVirama,
|
||||||
|
},
|
||||||
|
stateBeforeVirama: {
|
||||||
|
joiningL: stateBefore,
|
||||||
|
joiningD: stateBefore,
|
||||||
|
joiningT: stateBefore,
|
||||||
|
},
|
||||||
|
stateAfter: {
|
||||||
|
joiningL: stateFAIL,
|
||||||
|
joiningD: stateBefore,
|
||||||
|
joiningT: stateAfter,
|
||||||
|
joiningR: stateStart,
|
||||||
|
joinZWNJ: stateFAIL,
|
||||||
|
joinZWJ: stateFAIL,
|
||||||
|
joinVirama: stateAfter, // no-op as we can't accept joiners here
|
||||||
|
},
|
||||||
|
stateFAIL: {
|
||||||
|
0: stateFAIL,
|
||||||
|
joiningL: stateFAIL,
|
||||||
|
joiningD: stateFAIL,
|
||||||
|
joiningT: stateFAIL,
|
||||||
|
joiningR: stateFAIL,
|
||||||
|
joinZWNJ: stateFAIL,
|
||||||
|
joinZWJ: stateFAIL,
|
||||||
|
joinVirama: stateFAIL,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are
|
||||||
|
// already implicitly satisfied by the overall implementation.
|
||||||
|
func (p *Profile) validateLabel(s string) error {
|
||||||
|
if s == "" {
|
||||||
|
if p.verifyDNSLength {
|
||||||
|
return &labelError{s, "A4"}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if p.bidirule != nil && !p.bidirule(s) {
|
||||||
|
return &labelError{s, "B"}
|
||||||
|
}
|
||||||
|
if !p.validateLabels {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
trie := p.trie // p.validateLabels is only set if trie is set.
|
||||||
|
if len(s) > 4 && s[2] == '-' && s[3] == '-' {
|
||||||
|
return &labelError{s, "V2"}
|
||||||
|
}
|
||||||
|
if s[0] == '-' || s[len(s)-1] == '-' {
|
||||||
|
return &labelError{s, "V3"}
|
||||||
|
}
|
||||||
|
// TODO: merge the use of this in the trie.
|
||||||
|
v, sz := trie.lookupString(s)
|
||||||
|
x := info(v)
|
||||||
|
if x.isModifier() {
|
||||||
|
return &labelError{s, "V5"}
|
||||||
|
}
|
||||||
|
// Quickly return in the absence of zero-width (non) joiners.
|
||||||
|
if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
st := stateStart
|
||||||
|
for i := 0; ; {
|
||||||
|
jt := x.joinType()
|
||||||
|
if s[i:i+sz] == zwj {
|
||||||
|
jt = joinZWJ
|
||||||
|
} else if s[i:i+sz] == zwnj {
|
||||||
|
jt = joinZWNJ
|
||||||
|
}
|
||||||
|
st = joinStates[st][jt]
|
||||||
|
if x.isViramaModifier() {
|
||||||
|
st = joinStates[st][joinVirama]
|
||||||
|
}
|
||||||
|
if i += sz; i == len(s) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v, sz = trie.lookupString(s[i:])
|
||||||
|
x = info(v)
|
||||||
|
}
|
||||||
|
if st == stateFAIL || st == stateAfter {
|
||||||
|
return &labelError{s, "C"}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ascii(s string) bool {
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
if s[i] >= utf8.RuneSelf {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
|
@ -1,11 +1,13 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
// +build go1.10,!go1.13
|
||||||
|
|
||||||
package idna
|
package idna
|
||||||
|
|
||||||
// UnicodeVersion is the Unicode version from which the tables in this package are derived.
|
// UnicodeVersion is the Unicode version from which the tables in this package are derived.
|
||||||
const UnicodeVersion = "10.0.0"
|
const UnicodeVersion = "10.0.0"
|
||||||
|
|
||||||
var mappings string = "" + // Size: 8176 bytes
|
var mappings string = "" + // Size: 8175 bytes
|
||||||
"\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" +
|
"\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" +
|
||||||
"\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" +
|
"\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" +
|
||||||
"\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" +
|
"\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" +
|
||||||
|
@ -4554,4 +4556,4 @@ var idnaSparseValues = [1915]valueRange{
|
||||||
{value: 0x0040, lo: 0xb0, hi: 0xbf},
|
{value: 0x0040, lo: 0xb0, hi: 0xbf},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Total table size 42115 bytes (41KiB); checksum: F4A1FA4E
|
// Total table size 42114 bytes (41KiB); checksum: 355A58A4
|
4653
vendor/golang.org/x/net/idna/tables11.0.0.go
generated
vendored
Normal file
4653
vendor/golang.org/x/net/idna/tables11.0.0.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
4486
vendor/golang.org/x/net/idna/tables9.0.0.go
generated
vendored
Normal file
4486
vendor/golang.org/x/net/idna/tables9.0.0.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
2
vendor/golang.org/x/net/internal/socket/cmsghdr.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/cmsghdr.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd netbsd openbsd
|
// +build aix darwin dragonfly freebsd netbsd openbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x
|
// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x
|
||||||
// +build linux
|
// +build linux
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
|
// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
39
vendor/golang.org/x/net/internal/socket/defs_aix.go
generated
vendored
Normal file
39
vendor/golang.org/x/net/internal/socket/defs_aix.go
generated
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
// +godefs map struct_in_addr [4]byte /* in_addr */
|
||||||
|
// +godefs map struct_in6_addr [16]byte /* in6_addr */
|
||||||
|
|
||||||
|
package socket
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include <netinet/in.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
type iovec C.struct_iovec
|
||||||
|
|
||||||
|
type msghdr C.struct_msghdr
|
||||||
|
|
||||||
|
type mmsghdr C.struct_mmsghdr
|
||||||
|
|
||||||
|
type cmsghdr C.struct_cmsghdr
|
||||||
|
|
||||||
|
type sockaddrInet C.struct_sockaddr_in
|
||||||
|
|
||||||
|
type sockaddrInet6 C.struct_sockaddr_in6
|
||||||
|
|
||||||
|
const (
|
||||||
|
sizeofIovec = C.sizeof_struct_iovec
|
||||||
|
sizeofMsghdr = C.sizeof_struct_msghdr
|
||||||
|
sizeofMmsghdr = C.sizeof_struct_mmsghdr
|
||||||
|
sizeofCmsghdr = C.sizeof_struct_cmsghdr
|
||||||
|
|
||||||
|
sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
|
||||||
|
sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
|
||||||
|
)
|
8
vendor/golang.org/x/net/internal/socket/defs_darwin.go
generated
vendored
8
vendor/golang.org/x/net/internal/socket/defs_darwin.go
generated
vendored
|
@ -16,14 +16,6 @@ package socket
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
type iovec C.struct_iovec
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
type msghdr C.struct_msghdr
|
||||||
|
|
8
vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
generated
vendored
8
vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
generated
vendored
|
@ -16,14 +16,6 @@ package socket
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
type iovec C.struct_iovec
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
type msghdr C.struct_msghdr
|
||||||
|
|
8
vendor/golang.org/x/net/internal/socket/defs_freebsd.go
generated
vendored
8
vendor/golang.org/x/net/internal/socket/defs_freebsd.go
generated
vendored
|
@ -16,14 +16,6 @@ package socket
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
type iovec C.struct_iovec
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
type msghdr C.struct_msghdr
|
||||||
|
|
8
vendor/golang.org/x/net/internal/socket/defs_linux.go
generated
vendored
8
vendor/golang.org/x/net/internal/socket/defs_linux.go
generated
vendored
|
@ -18,14 +18,6 @@ package socket
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
type iovec C.struct_iovec
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
type msghdr C.struct_msghdr
|
||||||
|
|
8
vendor/golang.org/x/net/internal/socket/defs_netbsd.go
generated
vendored
8
vendor/golang.org/x/net/internal/socket/defs_netbsd.go
generated
vendored
|
@ -16,14 +16,6 @@ package socket
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
type iovec C.struct_iovec
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
type msghdr C.struct_msghdr
|
||||||
|
|
8
vendor/golang.org/x/net/internal/socket/defs_openbsd.go
generated
vendored
8
vendor/golang.org/x/net/internal/socket/defs_openbsd.go
generated
vendored
|
@ -16,14 +16,6 @@ package socket
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
type iovec C.struct_iovec
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
type msghdr C.struct_msghdr
|
||||||
|
|
8
vendor/golang.org/x/net/internal/socket/defs_solaris.go
generated
vendored
8
vendor/golang.org/x/net/internal/socket/defs_solaris.go
generated
vendored
|
@ -16,14 +16,6 @@ package socket
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = C.AF_UNSPEC
|
|
||||||
sysAF_INET = C.AF_INET
|
|
||||||
sysAF_INET6 = C.AF_INET6
|
|
||||||
|
|
||||||
sysSOCK_RAW = C.SOCK_RAW
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec C.struct_iovec
|
type iovec C.struct_iovec
|
||||||
|
|
||||||
type msghdr C.struct_msghdr
|
type msghdr C.struct_msghdr
|
||||||
|
|
7
vendor/golang.org/x/net/internal/socket/empty.s
generated
vendored
Normal file
7
vendor/golang.org/x/net/internal/socket/empty.s
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin,go1.12
|
||||||
|
|
||||||
|
// This exists solely so we can linkname in symbols from syscall.
|
2
vendor/golang.org/x/net/internal/socket/error_unix.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/error_unix.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
4
vendor/golang.org/x/net/internal/socket/iovec_64bit.go
generated
vendored
4
vendor/golang.org/x/net/internal/socket/iovec_64bit.go
generated
vendored
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x
|
// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd
|
// +build aix darwin dragonfly freebsd linux netbsd openbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/iovec_stub.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/iovec_stub.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
|
// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build !linux,!netbsd
|
// +build !aix,!linux,!netbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build linux netbsd
|
// +build aix linux netbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/msghdr_bsd.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/msghdr_bsd.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd netbsd openbsd
|
// +build aix darwin dragonfly freebsd netbsd openbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd netbsd
|
// +build aix darwin dragonfly freebsd netbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x
|
// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x
|
||||||
// +build linux
|
// +build linux
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/msghdr_stub.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/msghdr_stub.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
|
// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/rawconn.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/rawconn.go
generated
vendored
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build go1.9
|
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
1
vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go
generated
vendored
1
vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go
generated
vendored
|
@ -2,7 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build go1.9
|
|
||||||
// +build linux
|
// +build linux
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
3
vendor/golang.org/x/net/internal/socket/rawconn_msg.go
generated
vendored
3
vendor/golang.org/x/net/internal/socket/rawconn_msg.go
generated
vendored
|
@ -2,8 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build go1.9
|
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
|
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
7
vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go
generated
vendored
7
vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go
generated
vendored
|
@ -2,17 +2,14 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build go1.9
|
|
||||||
// +build !linux
|
// +build !linux
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
import "errors"
|
|
||||||
|
|
||||||
func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) {
|
func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) {
|
func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
9
vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go
generated
vendored
9
vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go
generated
vendored
|
@ -2,17 +2,14 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build go1.9
|
// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
|
||||||
// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
|
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
import "errors"
|
|
||||||
|
|
||||||
func (c *Conn) recvMsg(m *Message, flags int) error {
|
func (c *Conn) recvMsg(m *Message, flags int) error {
|
||||||
return errors.New("not implemented")
|
return errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Conn) sendMsg(m *Message, flags int) error {
|
func (c *Conn) sendMsg(m *Message, flags int) error {
|
||||||
return errors.New("not implemented")
|
return errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
25
vendor/golang.org/x/net/internal/socket/rawconn_stub.go
generated
vendored
25
vendor/golang.org/x/net/internal/socket/rawconn_stub.go
generated
vendored
|
@ -1,25 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !go1.9
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
import "errors"
|
|
||||||
|
|
||||||
func (c *Conn) recvMsg(m *Message, flags int) error {
|
|
||||||
return errors.New("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Conn) sendMsg(m *Message, flags int) error {
|
|
||||||
return errors.New("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) {
|
|
||||||
return 0, errors.New("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) {
|
|
||||||
return 0, errors.New("not implemented")
|
|
||||||
}
|
|
62
vendor/golang.org/x/net/internal/socket/reflect.go
generated
vendored
62
vendor/golang.org/x/net/internal/socket/reflect.go
generated
vendored
|
@ -1,62 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !go1.9
|
|
||||||
|
|
||||||
package socket
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A Conn represents a raw connection.
|
|
||||||
type Conn struct {
|
|
||||||
c net.Conn
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewConn returns a new raw connection.
|
|
||||||
func NewConn(c net.Conn) (*Conn, error) {
|
|
||||||
return &Conn{c: c}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Option) get(c *Conn, b []byte) (int, error) {
|
|
||||||
s, err := socketOf(c.c)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
n, err := getsockopt(s, o.Level, o.Name, b)
|
|
||||||
return n, os.NewSyscallError("getsockopt", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Option) set(c *Conn, b []byte) error {
|
|
||||||
s, err := socketOf(c.c)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return os.NewSyscallError("setsockopt", setsockopt(s, o.Level, o.Name, b))
|
|
||||||
}
|
|
||||||
|
|
||||||
func socketOf(c net.Conn) (uintptr, error) {
|
|
||||||
switch c.(type) {
|
|
||||||
case *net.TCPConn, *net.UDPConn, *net.IPConn:
|
|
||||||
v := reflect.ValueOf(c)
|
|
||||||
switch e := v.Elem(); e.Kind() {
|
|
||||||
case reflect.Struct:
|
|
||||||
fd := e.FieldByName("conn").FieldByName("fd")
|
|
||||||
switch e := fd.Elem(); e.Kind() {
|
|
||||||
case reflect.Struct:
|
|
||||||
sysfd := e.FieldByName("sysfd")
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
return uintptr(sysfd.Uint()), nil
|
|
||||||
}
|
|
||||||
return uintptr(sysfd.Int()), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0, errors.New("invalid type")
|
|
||||||
}
|
|
3
vendor/golang.org/x/net/internal/socket/socket.go
generated
vendored
3
vendor/golang.org/x/net/internal/socket/socket.go
generated
vendored
|
@ -9,9 +9,12 @@ package socket // import "golang.org/x/net/internal/socket"
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
|
"runtime"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var errNotImplemented = errors.New("not implemented on " + runtime.GOOS + "/" + runtime.GOARCH)
|
||||||
|
|
||||||
// An Option represents a sticky socket option.
|
// An Option represents a sticky socket option.
|
||||||
type Option struct {
|
type Option struct {
|
||||||
Level int // level
|
Level int // level
|
||||||
|
|
8
vendor/golang.org/x/net/internal/socket/sys_bsd.go
generated
vendored
8
vendor/golang.org/x/net/internal/socket/sys_bsd.go
generated
vendored
|
@ -2,16 +2,14 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd openbsd
|
// +build aix darwin dragonfly freebsd openbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
import "errors"
|
|
||||||
|
|
||||||
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
13
vendor/golang.org/x/net/internal/socket/sys_bsdvar.go
generated
vendored
13
vendor/golang.org/x/net/internal/socket/sys_bsdvar.go
generated
vendored
|
@ -2,13 +2,22 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build freebsd netbsd openbsd
|
// +build aix freebsd netbsd openbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
func probeProtocolStack() int {
|
func probeProtocolStack() int {
|
||||||
|
if (runtime.GOOS == "netbsd" || runtime.GOOS == "openbsd") && runtime.GOARCH == "arm" {
|
||||||
|
return 8
|
||||||
|
}
|
||||||
|
if runtime.GOOS == "aix" {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
var p uintptr
|
var p uintptr
|
||||||
return int(unsafe.Sizeof(p))
|
return int(unsafe.Sizeof(p))
|
||||||
}
|
}
|
||||||
|
|
17
vendor/golang.org/x/net/internal/socket/sys_const_unix.go
generated
vendored
Normal file
17
vendor/golang.org/x/net/internal/socket/sys_const_unix.go
generated
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
|
||||||
|
|
||||||
|
package socket
|
||||||
|
|
||||||
|
import "golang.org/x/sys/unix"
|
||||||
|
|
||||||
|
const (
|
||||||
|
sysAF_UNSPEC = unix.AF_UNSPEC
|
||||||
|
sysAF_INET = unix.AF_INET
|
||||||
|
sysAF_INET6 = unix.AF_INET6
|
||||||
|
|
||||||
|
sysSOCK_RAW = unix.SOCK_RAW
|
||||||
|
)
|
33
vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go
generated
vendored
Normal file
33
vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go
generated
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build !go1.12
|
||||||
|
|
||||||
|
package socket
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
|
||||||
|
l := uint32(len(b))
|
||||||
|
_, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
|
||||||
|
return int(l), errnoErr(errno)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setsockopt(s uintptr, level, name int, b []byte) error {
|
||||||
|
_, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
|
||||||
|
return errnoErr(errno)
|
||||||
|
}
|
||||||
|
|
||||||
|
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
|
n, _, errno := syscall.Syscall(syscall.SYS_RECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags))
|
||||||
|
return int(n), errnoErr(errno)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
|
n, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags))
|
||||||
|
return int(n), errnoErr(errno)
|
||||||
|
}
|
42
vendor/golang.org/x/net/internal/socket/sys_linkname.go
generated
vendored
Normal file
42
vendor/golang.org/x/net/internal/socket/sys_linkname.go
generated
vendored
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build aix go1.12,darwin
|
||||||
|
|
||||||
|
package socket
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:linkname syscall_getsockopt syscall.getsockopt
|
||||||
|
func syscall_getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *uint32) error
|
||||||
|
|
||||||
|
func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
|
||||||
|
l := uint32(len(b))
|
||||||
|
err := syscall_getsockopt(int(s), level, name, unsafe.Pointer(&b[0]), &l)
|
||||||
|
return int(l), err
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:linkname syscall_setsockopt syscall.setsockopt
|
||||||
|
func syscall_setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error
|
||||||
|
|
||||||
|
func setsockopt(s uintptr, level, name int, b []byte) error {
|
||||||
|
return syscall_setsockopt(int(s), level, name, unsafe.Pointer(&b[0]), uintptr(len(b)))
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:linkname syscall_recvmsg syscall.recvmsg
|
||||||
|
func syscall_recvmsg(s int, msg *syscall.Msghdr, flags int) (n int, err error)
|
||||||
|
|
||||||
|
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
|
return syscall_recvmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:linkname syscall_sendmsg syscall.sendmsg
|
||||||
|
func syscall_sendmsg(s int, msg *syscall.Msghdr, flags int) (n int, err error)
|
||||||
|
|
||||||
|
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
|
return syscall_sendmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags)
|
||||||
|
}
|
12
vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go
generated
vendored
Normal file
12
vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build riscv64
|
||||||
|
|
||||||
|
package socket
|
||||||
|
|
||||||
|
const (
|
||||||
|
sysRECVMMSG = 0xf3
|
||||||
|
sysSENDMMSG = 0x10d
|
||||||
|
)
|
45
vendor/golang.org/x/net/internal/socket/sys_posix.go
generated
vendored
45
vendor/golang.org/x/net/internal/socket/sys_posix.go
generated
vendored
|
@ -2,8 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build go1.9
|
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
|
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
@ -34,7 +33,7 @@ func marshalSockaddr(ip net.IP, port int, zone string) []byte {
|
||||||
if ip4 := ip.To4(); ip4 != nil {
|
if ip4 := ip.To4(); ip4 != nil {
|
||||||
b := make([]byte, sizeofSockaddrInet)
|
b := make([]byte, sizeofSockaddrInet)
|
||||||
switch runtime.GOOS {
|
switch runtime.GOOS {
|
||||||
case "android", "linux", "solaris", "windows":
|
case "android", "illumos", "linux", "solaris", "windows":
|
||||||
NativeEndian.PutUint16(b[:2], uint16(sysAF_INET))
|
NativeEndian.PutUint16(b[:2], uint16(sysAF_INET))
|
||||||
default:
|
default:
|
||||||
b[0] = sizeofSockaddrInet
|
b[0] = sizeofSockaddrInet
|
||||||
|
@ -47,7 +46,7 @@ func marshalSockaddr(ip net.IP, port int, zone string) []byte {
|
||||||
if ip6 := ip.To16(); ip6 != nil && ip.To4() == nil {
|
if ip6 := ip.To16(); ip6 != nil && ip.To4() == nil {
|
||||||
b := make([]byte, sizeofSockaddrInet6)
|
b := make([]byte, sizeofSockaddrInet6)
|
||||||
switch runtime.GOOS {
|
switch runtime.GOOS {
|
||||||
case "android", "linux", "solaris", "windows":
|
case "android", "illumos", "linux", "solaris", "windows":
|
||||||
NativeEndian.PutUint16(b[:2], uint16(sysAF_INET6))
|
NativeEndian.PutUint16(b[:2], uint16(sysAF_INET6))
|
||||||
default:
|
default:
|
||||||
b[0] = sizeofSockaddrInet6
|
b[0] = sizeofSockaddrInet6
|
||||||
|
@ -69,7 +68,7 @@ func parseInetAddr(b []byte, network string) (net.Addr, error) {
|
||||||
}
|
}
|
||||||
var af int
|
var af int
|
||||||
switch runtime.GOOS {
|
switch runtime.GOOS {
|
||||||
case "android", "linux", "solaris", "windows":
|
case "android", "illumos", "linux", "solaris", "windows":
|
||||||
af = int(NativeEndian.Uint16(b[:2]))
|
af = int(NativeEndian.Uint16(b[:2]))
|
||||||
default:
|
default:
|
||||||
af = int(b[1])
|
af = int(b[1])
|
||||||
|
@ -121,18 +120,21 @@ var zoneCache = ipv6ZoneCache{
|
||||||
toName: make(map[int]string),
|
toName: make(map[int]string),
|
||||||
}
|
}
|
||||||
|
|
||||||
func (zc *ipv6ZoneCache) update(ift []net.Interface) {
|
// update refreshes the network interface information if the cache was last
|
||||||
|
// updated more than 1 minute ago, or if force is set. It returns whether the
|
||||||
|
// cache was updated.
|
||||||
|
func (zc *ipv6ZoneCache) update(ift []net.Interface, force bool) (updated bool) {
|
||||||
zc.Lock()
|
zc.Lock()
|
||||||
defer zc.Unlock()
|
defer zc.Unlock()
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
if zc.lastFetched.After(now.Add(-60 * time.Second)) {
|
if !force && zc.lastFetched.After(now.Add(-60*time.Second)) {
|
||||||
return
|
return false
|
||||||
}
|
}
|
||||||
zc.lastFetched = now
|
zc.lastFetched = now
|
||||||
if len(ift) == 0 {
|
if len(ift) == 0 {
|
||||||
var err error
|
var err error
|
||||||
if ift, err = net.Interfaces(); err != nil {
|
if ift, err = net.Interfaces(); err != nil {
|
||||||
return
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
zc.toIndex = make(map[string]int, len(ift))
|
zc.toIndex = make(map[string]int, len(ift))
|
||||||
|
@ -143,25 +145,38 @@ func (zc *ipv6ZoneCache) update(ift []net.Interface) {
|
||||||
zc.toName[ifi.Index] = ifi.Name
|
zc.toName[ifi.Index] = ifi.Name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (zc *ipv6ZoneCache) name(zone int) string {
|
func (zc *ipv6ZoneCache) name(zone int) string {
|
||||||
zoneCache.update(nil)
|
updated := zoneCache.update(nil, false)
|
||||||
zoneCache.RLock()
|
zoneCache.RLock()
|
||||||
defer zoneCache.RUnlock()
|
|
||||||
name, ok := zoneCache.toName[zone]
|
name, ok := zoneCache.toName[zone]
|
||||||
if !ok {
|
zoneCache.RUnlock()
|
||||||
|
if !ok && !updated {
|
||||||
|
zoneCache.update(nil, true)
|
||||||
|
zoneCache.RLock()
|
||||||
|
name, ok = zoneCache.toName[zone]
|
||||||
|
zoneCache.RUnlock()
|
||||||
|
}
|
||||||
|
if !ok { // last resort
|
||||||
name = strconv.Itoa(zone)
|
name = strconv.Itoa(zone)
|
||||||
}
|
}
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
func (zc *ipv6ZoneCache) index(zone string) int {
|
func (zc *ipv6ZoneCache) index(zone string) int {
|
||||||
zoneCache.update(nil)
|
updated := zoneCache.update(nil, false)
|
||||||
zoneCache.RLock()
|
zoneCache.RLock()
|
||||||
defer zoneCache.RUnlock()
|
|
||||||
index, ok := zoneCache.toIndex[zone]
|
index, ok := zoneCache.toIndex[zone]
|
||||||
if !ok {
|
zoneCache.RUnlock()
|
||||||
|
if !ok && !updated {
|
||||||
|
zoneCache.update(nil, true)
|
||||||
|
zoneCache.RLock()
|
||||||
|
index, ok = zoneCache.toIndex[zone]
|
||||||
|
zoneCache.RUnlock()
|
||||||
|
}
|
||||||
|
if !ok { // last resort
|
||||||
index, _ = strconv.Atoi(zone)
|
index, _ = strconv.Atoi(zone)
|
||||||
}
|
}
|
||||||
return index
|
return index
|
||||||
|
|
5
vendor/golang.org/x/net/internal/socket/sys_solaris.go
generated
vendored
5
vendor/golang.org/x/net/internal/socket/sys_solaris.go
generated
vendored
|
@ -5,7 +5,6 @@
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
@ -63,9 +62,9 @@ func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
17
vendor/golang.org/x/net/internal/socket/sys_stub.go
generated
vendored
17
vendor/golang.org/x/net/internal/socket/sys_stub.go
generated
vendored
|
@ -2,12 +2,11 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
|
// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"net"
|
"net"
|
||||||
"runtime"
|
"runtime"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
@ -36,29 +35,29 @@ func marshalInetAddr(ip net.IP, port int, zone string) []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseInetAddr(b []byte, network string) (net.Addr, error) {
|
func parseInetAddr(b []byte, network string) (net.Addr, error) {
|
||||||
return nil, errors.New("not implemented")
|
return nil, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
|
func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func setsockopt(s uintptr, level, name int, b []byte) error {
|
func setsockopt(s uintptr, level, name int, b []byte) error {
|
||||||
return errors.New("not implemented")
|
return errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
2
vendor/golang.org/x/net/internal/socket/sys_unix.go
generated
vendored
2
vendor/golang.org/x/net/internal/socket/sys_unix.go
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux,!s390x,!386 netbsd openbsd
|
// +build dragonfly freebsd linux,!s390x,!386 netbsd openbsd
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
|
|
19
vendor/golang.org/x/net/internal/socket/sys_windows.go
generated
vendored
19
vendor/golang.org/x/net/internal/socket/sys_windows.go
generated
vendored
|
@ -5,9 +5,10 @@
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
func probeProtocolStack() int {
|
func probeProtocolStack() int {
|
||||||
|
@ -16,11 +17,11 @@ func probeProtocolStack() int {
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
sysAF_UNSPEC = 0x0
|
sysAF_UNSPEC = windows.AF_UNSPEC
|
||||||
sysAF_INET = 0x2
|
sysAF_INET = windows.AF_INET
|
||||||
sysAF_INET6 = 0x17
|
sysAF_INET6 = windows.AF_INET6
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
sysSOCK_RAW = windows.SOCK_RAW
|
||||||
)
|
)
|
||||||
|
|
||||||
type sockaddrInet struct {
|
type sockaddrInet struct {
|
||||||
|
@ -54,17 +55,17 @@ func setsockopt(s uintptr, level, name int, b []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
|
||||||
return 0, errors.New("not implemented")
|
return 0, errNotImplemented
|
||||||
}
|
}
|
||||||
|
|
61
vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go
generated
vendored
Normal file
61
vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go
generated
vendored
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
|
// cgo -godefs defs_aix.go
|
||||||
|
|
||||||
|
// Added for go1.11 compatibility
|
||||||
|
// +build aix
|
||||||
|
|
||||||
|
package socket
|
||||||
|
|
||||||
|
type iovec struct {
|
||||||
|
Base *byte
|
||||||
|
Len uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
type msghdr struct {
|
||||||
|
Name *byte
|
||||||
|
Namelen uint32
|
||||||
|
Iov *iovec
|
||||||
|
Iovlen int32
|
||||||
|
Control *byte
|
||||||
|
Controllen uint32
|
||||||
|
Flags int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type mmsghdr struct {
|
||||||
|
Hdr msghdr
|
||||||
|
Len uint32
|
||||||
|
Pad_cgo_0 [4]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type cmsghdr struct {
|
||||||
|
Len uint32
|
||||||
|
Level int32
|
||||||
|
Type int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type sockaddrInet struct {
|
||||||
|
Len uint8
|
||||||
|
Family uint8
|
||||||
|
Port uint16
|
||||||
|
Addr [4]byte /* in_addr */
|
||||||
|
Zero [8]uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
type sockaddrInet6 struct {
|
||||||
|
Len uint8
|
||||||
|
Family uint8
|
||||||
|
Port uint16
|
||||||
|
Flowinfo uint32
|
||||||
|
Addr [16]byte /* in6_addr */
|
||||||
|
Scope_id uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
sizeofIovec = 0x10
|
||||||
|
sizeofMsghdr = 0x30
|
||||||
|
sizeofMmsghdr = 0x38
|
||||||
|
sizeofCmsghdr = 0xc
|
||||||
|
|
||||||
|
sizeofSockaddrInet = 0x10
|
||||||
|
sizeofSockaddrInet6 = 0x1c
|
||||||
|
)
|
10
vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_darwin.go
|
// cgo -godefs defs_darwin.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x1e
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_darwin.go
|
// cgo -godefs defs_darwin.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x1e
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_darwin.go
|
// cgo -godefs defs_darwin.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x1e
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_darwin.go
|
// cgo -godefs defs_darwin.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x1e
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_dragonfly.go
|
// cgo -godefs defs_dragonfly.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x1c
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_freebsd.go
|
// cgo -godefs defs_freebsd.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x1c
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_freebsd.go
|
// cgo -godefs defs_freebsd.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x1c
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_freebsd.go
|
// cgo -godefs defs_freebsd.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x1c
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
53
vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go
generated
vendored
Normal file
53
vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go
generated
vendored
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
|
// cgo -godefs defs_freebsd.go
|
||||||
|
|
||||||
|
package socket
|
||||||
|
|
||||||
|
type iovec struct {
|
||||||
|
Base *byte
|
||||||
|
Len uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
type msghdr struct {
|
||||||
|
Name *byte
|
||||||
|
Namelen uint32
|
||||||
|
Pad_cgo_0 [4]byte
|
||||||
|
Iov *iovec
|
||||||
|
Iovlen int32
|
||||||
|
Pad_cgo_1 [4]byte
|
||||||
|
Control *byte
|
||||||
|
Controllen uint32
|
||||||
|
Flags int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type cmsghdr struct {
|
||||||
|
Len uint32
|
||||||
|
Level int32
|
||||||
|
Type int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type sockaddrInet struct {
|
||||||
|
Len uint8
|
||||||
|
Family uint8
|
||||||
|
Port uint16
|
||||||
|
Addr [4]byte /* in_addr */
|
||||||
|
Zero [8]int8
|
||||||
|
}
|
||||||
|
|
||||||
|
type sockaddrInet6 struct {
|
||||||
|
Len uint8
|
||||||
|
Family uint8
|
||||||
|
Port uint16
|
||||||
|
Flowinfo uint32
|
||||||
|
Addr [16]byte /* in6_addr */
|
||||||
|
Scope_id uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
sizeofIovec = 0x10
|
||||||
|
sizeofMsghdr = 0x30
|
||||||
|
sizeofCmsghdr = 0xc
|
||||||
|
|
||||||
|
sizeofSockaddrInet = 0x10
|
||||||
|
sizeofSockaddrInet6 = 0x1c
|
||||||
|
)
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_386.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_386.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
59
vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go
generated
vendored
Normal file
59
vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go
generated
vendored
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
|
// +build riscv64
|
||||||
|
|
||||||
|
package socket
|
||||||
|
|
||||||
|
type iovec struct {
|
||||||
|
Base *byte
|
||||||
|
Len uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
type msghdr struct {
|
||||||
|
Name *byte
|
||||||
|
Namelen uint32
|
||||||
|
Iov *iovec
|
||||||
|
Iovlen uint64
|
||||||
|
Control *byte
|
||||||
|
Controllen uint64
|
||||||
|
Flags int32
|
||||||
|
Pad_cgo_0 [4]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type mmsghdr struct {
|
||||||
|
Hdr msghdr
|
||||||
|
Len uint32
|
||||||
|
Pad_cgo_0 [4]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type cmsghdr struct {
|
||||||
|
Len uint64
|
||||||
|
Level int32
|
||||||
|
Type int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type sockaddrInet struct {
|
||||||
|
Family uint16
|
||||||
|
Port uint16
|
||||||
|
Addr [4]byte /* in_addr */
|
||||||
|
X__pad [8]uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
type sockaddrInet6 struct {
|
||||||
|
Family uint16
|
||||||
|
Port uint16
|
||||||
|
Flowinfo uint32
|
||||||
|
Addr [16]byte /* in6_addr */
|
||||||
|
Scope_id uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
sizeofIovec = 0x10
|
||||||
|
sizeofMsghdr = 0x38
|
||||||
|
sizeofMmsghdr = 0x40
|
||||||
|
sizeofCmsghdr = 0x10
|
||||||
|
|
||||||
|
sizeofSockaddrInet = 0x10
|
||||||
|
sizeofSockaddrInet6 = 0x1c
|
||||||
|
)
|
10
vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_linux.go
|
// cgo -godefs defs_linux.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0xa
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint64
|
Len uint64
|
||||||
|
|
10
vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go
generated
vendored
10
vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go
generated
vendored
|
@ -1,16 +1,8 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs defs_netbsd.go
|
// cgo -godefs defs_netbsd.go
|
||||||
|
|
||||||
package socket
|
package socket
|
||||||
|
|
||||||
const (
|
|
||||||
sysAF_UNSPEC = 0x0
|
|
||||||
sysAF_INET = 0x2
|
|
||||||
sysAF_INET6 = 0x18
|
|
||||||
|
|
||||||
sysSOCK_RAW = 0x3
|
|
||||||
)
|
|
||||||
|
|
||||||
type iovec struct {
|
type iovec struct {
|
||||||
Base *byte
|
Base *byte
|
||||||
Len uint32
|
Len uint32
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue