Update vendor directory
This commit is contained in:
parent
5b8b379feb
commit
1cad759306
69 changed files with 4846 additions and 897 deletions
42
vendor/golang.org/x/crypto/ssh/terminal/terminal.go
generated
vendored
42
vendor/golang.org/x/crypto/ssh/terminal/terminal.go
generated
vendored
|
@ -132,8 +132,11 @@ const (
|
|||
keyPasteEnd
|
||||
)
|
||||
|
||||
var pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
|
||||
var pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'}
|
||||
var (
|
||||
crlf = []byte{'\r', '\n'}
|
||||
pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
|
||||
pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'}
|
||||
)
|
||||
|
||||
// bytesToKey tries to parse a key sequence from b. If successful, it returns
|
||||
// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
|
||||
|
@ -333,7 +336,7 @@ func (t *Terminal) advanceCursor(places int) {
|
|||
// So, if we are stopping at the end of a line, we
|
||||
// need to write a newline so that our cursor can be
|
||||
// advanced to the next line.
|
||||
t.outBuf = append(t.outBuf, '\n')
|
||||
t.outBuf = append(t.outBuf, '\r', '\n')
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -593,6 +596,35 @@ func (t *Terminal) writeLine(line []rune) {
|
|||
}
|
||||
}
|
||||
|
||||
// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n.
|
||||
func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) {
|
||||
for len(buf) > 0 {
|
||||
i := bytes.IndexByte(buf, '\n')
|
||||
todo := len(buf)
|
||||
if i >= 0 {
|
||||
todo = i
|
||||
}
|
||||
|
||||
var nn int
|
||||
nn, err = w.Write(buf[:todo])
|
||||
n += nn
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
buf = buf[todo:]
|
||||
|
||||
if i >= 0 {
|
||||
if _, err = w.Write(crlf); err != nil {
|
||||
return n, err
|
||||
}
|
||||
n += 1
|
||||
buf = buf[1:]
|
||||
}
|
||||
}
|
||||
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (t *Terminal) Write(buf []byte) (n int, err error) {
|
||||
t.lock.Lock()
|
||||
defer t.lock.Unlock()
|
||||
|
@ -600,7 +632,7 @@ func (t *Terminal) Write(buf []byte) (n int, err error) {
|
|||
if t.cursorX == 0 && t.cursorY == 0 {
|
||||
// This is the easy case: there's nothing on the screen that we
|
||||
// have to move out of the way.
|
||||
return t.c.Write(buf)
|
||||
return writeWithCRLF(t.c, buf)
|
||||
}
|
||||
|
||||
// We have a prompt and possibly user input on the screen. We
|
||||
|
@ -620,7 +652,7 @@ func (t *Terminal) Write(buf []byte) (n int, err error) {
|
|||
}
|
||||
t.outBuf = t.outBuf[:0]
|
||||
|
||||
if n, err = t.c.Write(buf); err != nil {
|
||||
if n, err = writeWithCRLF(t.c, buf); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
29
vendor/golang.org/x/net/http2/frame.go
generated
vendored
29
vendor/golang.org/x/net/http2/frame.go
generated
vendored
|
@ -317,10 +317,12 @@ type Framer struct {
|
|||
// non-Continuation or Continuation on a different stream is
|
||||
// attempted to be written.
|
||||
|
||||
logReads bool
|
||||
logReads, logWrites bool
|
||||
|
||||
debugFramer *Framer // only use for logging written writes
|
||||
debugFramerBuf *bytes.Buffer
|
||||
debugFramer *Framer // only use for logging written writes
|
||||
debugFramerBuf *bytes.Buffer
|
||||
debugReadLoggerf func(string, ...interface{})
|
||||
debugWriteLoggerf func(string, ...interface{})
|
||||
}
|
||||
|
||||
func (fr *Framer) maxHeaderListSize() uint32 {
|
||||
|
@ -355,7 +357,7 @@ func (f *Framer) endWrite() error {
|
|||
byte(length>>16),
|
||||
byte(length>>8),
|
||||
byte(length))
|
||||
if logFrameWrites {
|
||||
if f.logWrites {
|
||||
f.logWrite()
|
||||
}
|
||||
|
||||
|
@ -378,10 +380,10 @@ func (f *Framer) logWrite() {
|
|||
f.debugFramerBuf.Write(f.wbuf)
|
||||
fr, err := f.debugFramer.ReadFrame()
|
||||
if err != nil {
|
||||
log.Printf("http2: Framer %p: failed to decode just-written frame", f)
|
||||
f.debugWriteLoggerf("http2: Framer %p: failed to decode just-written frame", f)
|
||||
return
|
||||
}
|
||||
log.Printf("http2: Framer %p: wrote %v", f, summarizeFrame(fr))
|
||||
f.debugWriteLoggerf("http2: Framer %p: wrote %v", f, summarizeFrame(fr))
|
||||
}
|
||||
|
||||
func (f *Framer) writeByte(v byte) { f.wbuf = append(f.wbuf, v) }
|
||||
|
@ -399,9 +401,12 @@ const (
|
|||
// NewFramer returns a Framer that writes frames to w and reads them from r.
|
||||
func NewFramer(w io.Writer, r io.Reader) *Framer {
|
||||
fr := &Framer{
|
||||
w: w,
|
||||
r: r,
|
||||
logReads: logFrameReads,
|
||||
w: w,
|
||||
r: r,
|
||||
logReads: logFrameReads,
|
||||
logWrites: logFrameWrites,
|
||||
debugReadLoggerf: log.Printf,
|
||||
debugWriteLoggerf: log.Printf,
|
||||
}
|
||||
fr.getReadBuf = func(size uint32) []byte {
|
||||
if cap(fr.readBuf) >= int(size) {
|
||||
|
@ -483,7 +488,7 @@ func (fr *Framer) ReadFrame() (Frame, error) {
|
|||
return nil, err
|
||||
}
|
||||
if fr.logReads {
|
||||
log.Printf("http2: Framer %p: read %v", fr, summarizeFrame(f))
|
||||
fr.debugReadLoggerf("http2: Framer %p: read %v", fr, summarizeFrame(f))
|
||||
}
|
||||
if fh.Type == FrameHeaders && fr.ReadMetaHeaders != nil {
|
||||
return fr.readMetaFrame(f.(*HeadersFrame))
|
||||
|
@ -1419,8 +1424,8 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
|
|||
hdec.SetEmitEnabled(true)
|
||||
hdec.SetMaxStringLength(fr.maxHeaderStringLen())
|
||||
hdec.SetEmitFunc(func(hf hpack.HeaderField) {
|
||||
if VerboseLogs && logFrameReads {
|
||||
log.Printf("http2: decoded hpack field %+v", hf)
|
||||
if VerboseLogs && fr.logReads {
|
||||
fr.debugReadLoggerf("http2: decoded hpack field %+v", hf)
|
||||
}
|
||||
if !httplex.ValidHeaderFieldValue(hf.Value) {
|
||||
invalid = headerFieldValueError(hf.Value)
|
||||
|
|
9
vendor/golang.org/x/net/http2/go18.go
generated
vendored
9
vendor/golang.org/x/net/http2/go18.go
generated
vendored
|
@ -8,6 +8,7 @@ package http2
|
|||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"io"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
|
@ -39,3 +40,11 @@ func configureServer18(h1 *http.Server, h2 *Server) error {
|
|||
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
|
||||
}
|
||||
|
|
11
vendor/golang.org/x/net/http2/not_go18.go
generated
vendored
11
vendor/golang.org/x/net/http2/not_go18.go
generated
vendored
|
@ -6,7 +6,10 @@
|
|||
|
||||
package http2
|
||||
|
||||
import "net/http"
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func configureServer18(h1 *http.Server, h2 *Server) error {
|
||||
// No IdleTimeout to sync prior to Go 1.8.
|
||||
|
@ -16,3 +19,9 @@ func configureServer18(h1 *http.Server, h2 *Server) error {
|
|||
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 }
|
||||
|
|
131
vendor/golang.org/x/net/http2/server.go
generated
vendored
131
vendor/golang.org/x/net/http2/server.go
generated
vendored
|
@ -278,6 +278,16 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
|
|||
pushEnabled: true,
|
||||
}
|
||||
|
||||
// The net/http package sets the write deadline from the
|
||||
// http.Server.WriteTimeout during the TLS handshake, but then
|
||||
// passes the connection off to us with the deadline already
|
||||
// set. Disarm it here so that it is not applied to additional
|
||||
// streams opened on this connection.
|
||||
// TODO: implement WriteTimeout fully. See Issue 18437.
|
||||
if sc.hs.WriteTimeout != 0 {
|
||||
sc.conn.SetWriteDeadline(time.Time{})
|
||||
}
|
||||
|
||||
if s.NewWriteScheduler != nil {
|
||||
sc.writeSched = s.NewWriteScheduler()
|
||||
} else {
|
||||
|
@ -423,6 +433,11 @@ func (sc *serverConn) maxHeaderListSize() uint32 {
|
|||
return uint32(n + typicalHeaders*perFieldOverhead)
|
||||
}
|
||||
|
||||
func (sc *serverConn) curOpenStreams() uint32 {
|
||||
sc.serveG.check()
|
||||
return sc.curClientStreams + sc.curPushedStreams
|
||||
}
|
||||
|
||||
// stream represents a stream. This is the minimal metadata needed by
|
||||
// the serve goroutine. Most of the actual stream state is owned by
|
||||
// the http.Handler's goroutine in the responseWriter. Because the
|
||||
|
@ -448,8 +463,7 @@ type stream struct {
|
|||
numTrailerValues int64
|
||||
weight uint8
|
||||
state streamState
|
||||
sentReset bool // only true once detached from streams map
|
||||
gotReset bool // only true once detacted from streams map
|
||||
resetQueued bool // RST_STREAM queued for write; set by sc.resetStream
|
||||
gotTrailerHeader bool // HEADER frame for trailers was seen
|
||||
wroteHeaders bool // whether we wrote headers (not status 100)
|
||||
reqBuf []byte // if non-nil, body pipe buffer to return later at EOF
|
||||
|
@ -753,7 +767,7 @@ func (sc *serverConn) serve() {
|
|||
fn(loopNum)
|
||||
}
|
||||
|
||||
if sc.inGoAway && sc.curClientStreams == 0 && !sc.needToSendGoAway && !sc.writingFrame {
|
||||
if sc.inGoAway && sc.curOpenStreams() == 0 && !sc.needToSendGoAway && !sc.writingFrame {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -869,8 +883,34 @@ func (sc *serverConn) writeFrameFromHandler(wr FrameWriteRequest) error {
|
|||
func (sc *serverConn) writeFrame(wr FrameWriteRequest) {
|
||||
sc.serveG.check()
|
||||
|
||||
// If true, wr will not be written and wr.done will not be signaled.
|
||||
var ignoreWrite bool
|
||||
|
||||
// We are not allowed to write frames on closed streams. RFC 7540 Section
|
||||
// 5.1.1 says: "An endpoint MUST NOT send frames other than PRIORITY on
|
||||
// a closed stream." Our server never sends PRIORITY, so that exception
|
||||
// does not apply.
|
||||
//
|
||||
// The serverConn might close an open stream while the stream's handler
|
||||
// is still running. For example, the server might close a stream when it
|
||||
// receives bad data from the client. If this happens, the handler might
|
||||
// attempt to write a frame after the stream has been closed (since the
|
||||
// handler hasn't yet been notified of the close). In this case, we simply
|
||||
// ignore the frame. The handler will notice that the stream is closed when
|
||||
// it waits for the frame to be written.
|
||||
//
|
||||
// As an exception to this rule, we allow sending RST_STREAM after close.
|
||||
// This allows us to immediately reject new streams without tracking any
|
||||
// state for those streams (except for the queued RST_STREAM frame). This
|
||||
// may result in duplicate RST_STREAMs in some cases, but the client should
|
||||
// ignore those.
|
||||
if wr.StreamID() != 0 {
|
||||
_, isReset := wr.write.(StreamError)
|
||||
if state, _ := sc.state(wr.StreamID()); state == stateClosed && !isReset {
|
||||
ignoreWrite = true
|
||||
}
|
||||
}
|
||||
|
||||
// Don't send a 100-continue response if we've already sent headers.
|
||||
// See golang.org/issue/14030.
|
||||
switch wr.write.(type) {
|
||||
|
@ -878,6 +918,11 @@ func (sc *serverConn) writeFrame(wr FrameWriteRequest) {
|
|||
wr.stream.wroteHeaders = true
|
||||
case write100ContinueHeadersFrame:
|
||||
if wr.stream.wroteHeaders {
|
||||
// We do not need to notify wr.done because this frame is
|
||||
// never written with wr.done != nil.
|
||||
if wr.done != nil {
|
||||
panic("wr.done != nil for write100ContinueHeadersFrame")
|
||||
}
|
||||
ignoreWrite = true
|
||||
}
|
||||
}
|
||||
|
@ -901,14 +946,15 @@ func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) {
|
|||
if st != nil {
|
||||
switch st.state {
|
||||
case stateHalfClosedLocal:
|
||||
panic("internal error: attempt to send frame on half-closed-local stream")
|
||||
case stateClosed:
|
||||
if st.sentReset || st.gotReset {
|
||||
// Skip this frame.
|
||||
sc.scheduleFrameWrite()
|
||||
return
|
||||
switch wr.write.(type) {
|
||||
case StreamError, handlerPanicRST, writeWindowUpdate:
|
||||
// RFC 7540 Section 5.1 allows sending RST_STREAM, PRIORITY, and WINDOW_UPDATE
|
||||
// in this state. (We never send PRIORITY from the server, so that is not checked.)
|
||||
default:
|
||||
panic(fmt.Sprintf("internal error: attempt to send frame on a half-closed-local stream: %v", wr))
|
||||
}
|
||||
panic(fmt.Sprintf("internal error: attempt to send a write %v on a closed stream", wr))
|
||||
case stateClosed:
|
||||
panic(fmt.Sprintf("internal error: attempt to send frame on a closed stream: %v", wr))
|
||||
}
|
||||
}
|
||||
if wpp, ok := wr.write.(*writePushPromise); ok {
|
||||
|
@ -916,9 +962,7 @@ func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) {
|
|||
wpp.promisedID, err = wpp.allocatePromisedID()
|
||||
if err != nil {
|
||||
sc.writingFrameAsync = false
|
||||
if wr.done != nil {
|
||||
wr.done <- err
|
||||
}
|
||||
wr.replyToWriter(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -951,25 +995,9 @@ func (sc *serverConn) wroteFrame(res frameWriteResult) {
|
|||
sc.writingFrameAsync = false
|
||||
|
||||
wr := res.wr
|
||||
st := wr.stream
|
||||
|
||||
closeStream := endsStream(wr.write)
|
||||
|
||||
if _, ok := wr.write.(handlerPanicRST); ok {
|
||||
sc.closeStream(st, errHandlerPanicked)
|
||||
}
|
||||
|
||||
// Reply (if requested) to the blocked ServeHTTP goroutine.
|
||||
if ch := wr.done; ch != nil {
|
||||
select {
|
||||
case ch <- res.err:
|
||||
default:
|
||||
panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wr.write))
|
||||
}
|
||||
}
|
||||
wr.write = nil // prevent use (assume it's tainted after wr.done send)
|
||||
|
||||
if closeStream {
|
||||
if writeEndsStream(wr.write) {
|
||||
st := wr.stream
|
||||
if st == nil {
|
||||
panic("internal error: expecting non-nil stream")
|
||||
}
|
||||
|
@ -982,15 +1010,29 @@ func (sc *serverConn) wroteFrame(res frameWriteResult) {
|
|||
// reading data (see possible TODO at top of
|
||||
// this file), we go into closed state here
|
||||
// anyway, after telling the peer we're
|
||||
// hanging up on them.
|
||||
st.state = stateHalfClosedLocal // won't last long, but necessary for closeStream via resetStream
|
||||
errCancel := streamError(st.id, ErrCodeCancel)
|
||||
sc.resetStream(errCancel)
|
||||
// hanging up on them. We'll transition to
|
||||
// stateClosed after the RST_STREAM frame is
|
||||
// written.
|
||||
st.state = stateHalfClosedLocal
|
||||
sc.resetStream(streamError(st.id, ErrCodeCancel))
|
||||
case stateHalfClosedRemote:
|
||||
sc.closeStream(st, errHandlerComplete)
|
||||
}
|
||||
} else {
|
||||
switch v := wr.write.(type) {
|
||||
case StreamError:
|
||||
// st may be unknown if the RST_STREAM was generated to reject bad input.
|
||||
if st, ok := sc.streams[v.StreamID]; ok {
|
||||
sc.closeStream(st, v)
|
||||
}
|
||||
case handlerPanicRST:
|
||||
sc.closeStream(wr.stream, errHandlerPanicked)
|
||||
}
|
||||
}
|
||||
|
||||
// Reply (if requested) to unblock the ServeHTTP goroutine.
|
||||
wr.replyToWriter(res.err)
|
||||
|
||||
sc.scheduleFrameWrite()
|
||||
}
|
||||
|
||||
|
@ -1087,8 +1129,7 @@ func (sc *serverConn) resetStream(se StreamError) {
|
|||
sc.serveG.check()
|
||||
sc.writeFrame(FrameWriteRequest{write: se})
|
||||
if st, ok := sc.streams[se.StreamID]; ok {
|
||||
st.sentReset = true
|
||||
sc.closeStream(st, se)
|
||||
st.resetQueued = true
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1252,7 +1293,6 @@ func (sc *serverConn) processResetStream(f *RSTStreamFrame) error {
|
|||
return ConnectionError(ErrCodeProtocol)
|
||||
}
|
||||
if st != nil {
|
||||
st.gotReset = true
|
||||
st.cancelCtx()
|
||||
sc.closeStream(st, streamError(f.StreamID, f.ErrCode))
|
||||
}
|
||||
|
@ -1391,7 +1431,7 @@ func (sc *serverConn) processData(f *DataFrame) error {
|
|||
// type PROTOCOL_ERROR."
|
||||
return ConnectionError(ErrCodeProtocol)
|
||||
}
|
||||
if st == nil || state != stateOpen || st.gotTrailerHeader {
|
||||
if st == nil || state != stateOpen || st.gotTrailerHeader || st.resetQueued {
|
||||
// This includes sending a RST_STREAM if the stream is
|
||||
// in stateHalfClosedLocal (which currently means that
|
||||
// the http.Handler returned, so it's done reading &
|
||||
|
@ -1411,6 +1451,10 @@ func (sc *serverConn) processData(f *DataFrame) error {
|
|||
sc.inflow.take(int32(f.Length))
|
||||
sc.sendWindowUpdate(nil, int(f.Length)) // conn-level
|
||||
|
||||
if st != nil && st.resetQueued {
|
||||
// Already have a stream error in flight. Don't send another.
|
||||
return nil
|
||||
}
|
||||
return streamError(id, ErrCodeStreamClosed)
|
||||
}
|
||||
if st.body == nil {
|
||||
|
@ -1519,6 +1563,11 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
|||
// open, let it process its own HEADERS frame (trailers at this
|
||||
// point, if it's valid).
|
||||
if st := sc.streams[f.StreamID]; st != nil {
|
||||
if st.resetQueued {
|
||||
// We're sending RST_STREAM to close the stream, so don't bother
|
||||
// processing this frame.
|
||||
return nil
|
||||
}
|
||||
return st.processTrailerHeaders(f)
|
||||
}
|
||||
|
||||
|
@ -1681,7 +1730,7 @@ func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream
|
|||
} else {
|
||||
sc.curClientStreams++
|
||||
}
|
||||
if sc.curClientStreams+sc.curPushedStreams == 1 {
|
||||
if sc.curOpenStreams() == 1 {
|
||||
sc.setConnState(http.StateActive)
|
||||
}
|
||||
|
||||
|
@ -2556,7 +2605,7 @@ func (sc *serverConn) startPush(msg startPushRequest) {
|
|||
scheme: msg.url.Scheme,
|
||||
authority: msg.url.Host,
|
||||
path: msg.url.RequestURI(),
|
||||
header: msg.header,
|
||||
header: cloneHeader(msg.header), // clone since handler runs concurrently with writing the PUSH_PROMISE
|
||||
})
|
||||
if err != nil {
|
||||
// Should not happen, since we've already validated msg.url.
|
||||
|
|
67
vendor/golang.org/x/net/http2/transport.go
generated
vendored
67
vendor/golang.org/x/net/http2/transport.go
generated
vendored
|
@ -191,6 +191,7 @@ type clientStream struct {
|
|||
ID uint32
|
||||
resc chan resAndError
|
||||
bufPipe pipe // buffered pipe with the flow-controlled response payload
|
||||
startedWrite bool // started request body write; guarded by cc.mu
|
||||
requestedGzip bool
|
||||
on100 func() // optional code to run if get a 100 continue response
|
||||
|
||||
|
@ -314,6 +315,10 @@ func authorityAddr(scheme string, authority string) (addr string) {
|
|||
if a, err := idna.ToASCII(host); err == nil {
|
||||
host = a
|
||||
}
|
||||
// IPv6 address literal, without a port:
|
||||
if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") {
|
||||
return host + ":" + port
|
||||
}
|
||||
return net.JoinHostPort(host, port)
|
||||
}
|
||||
|
||||
|
@ -332,8 +337,10 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res
|
|||
}
|
||||
traceGotConn(req, cc)
|
||||
res, err := cc.RoundTrip(req)
|
||||
if shouldRetryRequest(req, err) {
|
||||
continue
|
||||
if err != nil {
|
||||
if req, err = shouldRetryRequest(req, err); err == nil {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
t.vlogf("RoundTrip failure: %v", err)
|
||||
|
@ -355,12 +362,41 @@ func (t *Transport) CloseIdleConnections() {
|
|||
var (
|
||||
errClientConnClosed = errors.New("http2: client conn is closed")
|
||||
errClientConnUnusable = errors.New("http2: client conn not usable")
|
||||
|
||||
errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY")
|
||||
errClientConnGotGoAwayAfterSomeReqBody = errors.New("http2: Transport received Server's graceful shutdown GOAWAY; some request body already written")
|
||||
)
|
||||
|
||||
func shouldRetryRequest(req *http.Request, err error) bool {
|
||||
// TODO: retry GET requests (no bodies) more aggressively, if shutdown
|
||||
// before response.
|
||||
return err == errClientConnUnusable
|
||||
// shouldRetryRequest is called by RoundTrip when a request fails to get
|
||||
// response headers. It is always called with a non-nil error.
|
||||
// It returns either a request to retry (either the same request, or a
|
||||
// modified clone), or an error if the request can't be replayed.
|
||||
func shouldRetryRequest(req *http.Request, err error) (*http.Request, error) {
|
||||
switch err {
|
||||
default:
|
||||
return nil, err
|
||||
case errClientConnUnusable, errClientConnGotGoAway:
|
||||
return req, nil
|
||||
case errClientConnGotGoAwayAfterSomeReqBody:
|
||||
// If the Body is nil (or http.NoBody), it's safe to reuse
|
||||
// this request and its Body.
|
||||
if req.Body == nil || reqBodyIsNoBody(req.Body) {
|
||||
return req, nil
|
||||
}
|
||||
// Otherwise we depend on the Request having its GetBody
|
||||
// func defined.
|
||||
getBody := reqGetBody(req) // Go 1.8: getBody = req.GetBody
|
||||
if getBody == nil {
|
||||
return nil, errors.New("http2: Transport: peer server initiated graceful shutdown after some of Request.Body was written; define Request.GetBody to avoid this error")
|
||||
}
|
||||
body, err := getBody()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newReq := *req
|
||||
newReq.Body = body
|
||||
return &newReq, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, error) {
|
||||
|
@ -513,6 +549,15 @@ func (cc *ClientConn) setGoAway(f *GoAwayFrame) {
|
|||
if old != nil && old.ErrCode != ErrCodeNo {
|
||||
cc.goAway.ErrCode = old.ErrCode
|
||||
}
|
||||
last := f.LastStreamID
|
||||
for streamID, cs := range cc.streams {
|
||||
if streamID > last {
|
||||
select {
|
||||
case cs.resc <- resAndError{err: errClientConnGotGoAway}:
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (cc *ClientConn) CanTakeNewRequest() bool {
|
||||
|
@ -773,6 +818,13 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
|
|||
cs.abortRequestBodyWrite(errStopReqBodyWrite)
|
||||
}
|
||||
if re.err != nil {
|
||||
if re.err == errClientConnGotGoAway {
|
||||
cc.mu.Lock()
|
||||
if cs.startedWrite {
|
||||
re.err = errClientConnGotGoAwayAfterSomeReqBody
|
||||
}
|
||||
cc.mu.Unlock()
|
||||
}
|
||||
cc.forgetStreamID(cs.ID)
|
||||
return nil, re.err
|
||||
}
|
||||
|
@ -2013,6 +2065,9 @@ func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s body
|
|||
resc := make(chan error, 1)
|
||||
s.resc = resc
|
||||
s.fn = func() {
|
||||
cs.cc.mu.Lock()
|
||||
cs.startedWrite = true
|
||||
cs.cc.mu.Unlock()
|
||||
resc <- cs.writeRequestBody(body, cs.req.Body)
|
||||
}
|
||||
s.delay = t.expectContinueTimeout()
|
||||
|
|
9
vendor/golang.org/x/net/http2/write.go
generated
vendored
9
vendor/golang.org/x/net/http2/write.go
generated
vendored
|
@ -45,9 +45,10 @@ type writeContext interface {
|
|||
HeaderEncoder() (*hpack.Encoder, *bytes.Buffer)
|
||||
}
|
||||
|
||||
// endsStream reports whether the given frame writer w will locally
|
||||
// close the stream.
|
||||
func endsStream(w writeFramer) bool {
|
||||
// writeEndsStream reports whether w writes a frame that will transition
|
||||
// the stream to a half-closed local state. This returns false for RST_STREAM,
|
||||
// which closes the entire stream (not just the local half).
|
||||
func writeEndsStream(w writeFramer) bool {
|
||||
switch v := w.(type) {
|
||||
case *writeData:
|
||||
return v.endStream
|
||||
|
@ -57,7 +58,7 @@ func endsStream(w writeFramer) bool {
|
|||
// This can only happen if the caller reuses w after it's
|
||||
// been intentionally nil'ed out to prevent use. Keep this
|
||||
// here to catch future refactoring breaking it.
|
||||
panic("endsStream called on nil writeFramer")
|
||||
panic("writeEndsStream called on nil writeFramer")
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
|
14
vendor/golang.org/x/net/http2/writesched.go
generated
vendored
14
vendor/golang.org/x/net/http2/writesched.go
generated
vendored
|
@ -160,6 +160,20 @@ func (wr FrameWriteRequest) String() string {
|
|||
return fmt.Sprintf("[FrameWriteRequest stream=%d, ch=%v, writer=%v]", wr.StreamID(), wr.done != nil, des)
|
||||
}
|
||||
|
||||
// replyToWriter sends err to wr.done and panics if the send must block
|
||||
// This does nothing if wr.done is nil.
|
||||
func (wr *FrameWriteRequest) replyToWriter(err error) {
|
||||
if wr.done == nil {
|
||||
return
|
||||
}
|
||||
select {
|
||||
case wr.done <- err:
|
||||
default:
|
||||
panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wr.write))
|
||||
}
|
||||
wr.write = nil // prevent use (assume it's tainted after wr.done send)
|
||||
}
|
||||
|
||||
// writeQueue is used by implementations of WriteScheduler.
|
||||
type writeQueue struct {
|
||||
s []FrameWriteRequest
|
||||
|
|
12
vendor/golang.org/x/oauth2/google/sdk.go
generated
vendored
12
vendor/golang.org/x/oauth2/google/sdk.go
generated
vendored
|
@ -160,9 +160,13 @@ var sdkConfigPath = func() (string, error) {
|
|||
}
|
||||
|
||||
func guessUnixHomeDir() string {
|
||||
usr, err := user.Current()
|
||||
if err == nil {
|
||||
return usr.HomeDir
|
||||
// Prefer $HOME over user.Current due to glibc bug: golang.org/issue/13470
|
||||
if v := os.Getenv("HOME"); v != "" {
|
||||
return v
|
||||
}
|
||||
return os.Getenv("HOME")
|
||||
// Else, fall back to user.Current:
|
||||
if u, err := user.Current(); err == nil {
|
||||
return u.HomeDir
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
|
2
vendor/golang.org/x/oauth2/internal/token.go
generated
vendored
2
vendor/golang.org/x/oauth2/internal/token.go
generated
vendored
|
@ -117,6 +117,8 @@ var brokenAuthHeaderProviders = []string{
|
|||
"https://www.strava.com/oauth/",
|
||||
"https://www.wunderlist.com/oauth/",
|
||||
"https://api.patreon.com/",
|
||||
"https://sandbox.codeswholesale.com/oauth/token",
|
||||
"https://api.codeswholesale.com/oauth/token",
|
||||
}
|
||||
|
||||
func RegisterBrokenAuthHeaderProvider(tokenURL string) {
|
||||
|
|
4
vendor/golang.org/x/oauth2/jwt/jwt.go
generated
vendored
4
vendor/golang.org/x/oauth2/jwt/jwt.go
generated
vendored
|
@ -105,7 +105,9 @@ func (js jwtSource) Token() (*oauth2.Token, error) {
|
|||
if t := js.conf.Expires; t > 0 {
|
||||
claimSet.Exp = time.Now().Add(t).Unix()
|
||||
}
|
||||
payload, err := jws.Encode(defaultHeader, claimSet, pk)
|
||||
h := *defaultHeader
|
||||
h.KeyID = js.conf.PrivateKeyID
|
||||
payload, err := jws.Encode(&h, claimSet, pk)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
5
vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
generated
vendored
5
vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
generated
vendored
|
@ -6,8 +6,6 @@
|
|||
|
||||
package unix
|
||||
|
||||
import "syscall"
|
||||
|
||||
//sys Dup2(oldfd int, newfd int) (err error)
|
||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
|
||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
|
||||
|
@ -63,9 +61,6 @@ import "syscall"
|
|||
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
|
||||
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
|
||||
|
||||
//go:noescape
|
||||
func gettimeofday(tv *Timeval) (err syscall.Errno)
|
||||
|
||||
func Gettimeofday(tv *Timeval) (err error) {
|
||||
errno := gettimeofday(tv)
|
||||
if errno != 0 {
|
||||
|
|
13
vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go
generated
vendored
Normal file
13
vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
// 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 amd64,linux
|
||||
// +build !gccgo
|
||||
|
||||
package unix
|
||||
|
||||
import "syscall"
|
||||
|
||||
//go:noescape
|
||||
func gettimeofday(tv *Timeval) (err syscall.Errno)
|
5
vendor/golang.org/x/sys/unix/syscall_unix.go
generated
vendored
5
vendor/golang.org/x/sys/unix/syscall_unix.go
generated
vendored
|
@ -49,11 +49,6 @@ func errnoErr(e syscall.Errno) error {
|
|||
return e
|
||||
}
|
||||
|
||||
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||
|
||||
// Mmap manager, for use by operating system-specific implementations.
|
||||
|
||||
type mmapper struct {
|
||||
|
|
15
vendor/golang.org/x/sys/unix/syscall_unix_gc.go
generated
vendored
Normal file
15
vendor/golang.org/x/sys/unix/syscall_unix_gc.go
generated
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
// 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 darwin dragonfly freebsd linux netbsd openbsd solaris
|
||||
// +build !gccgo
|
||||
|
||||
package unix
|
||||
|
||||
import "syscall"
|
||||
|
||||
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
Loading…
Add table
Add a link
Reference in a new issue