diff options
Diffstat (limited to 'vendor/golang.org/x/net')
| -rw-r--r-- | vendor/golang.org/x/net/LICENSE | 27 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/PATENTS | 22 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/context/context.go | 156 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/context/ctxhttp/cancelreq.go | 19 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/context/ctxhttp/cancelreq_go14.go | 23 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go | 145 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/context/go17.go | 72 | ||||
| -rw-r--r-- | vendor/golang.org/x/net/context/pre_go17.go | 300 | 
8 files changed, 764 insertions, 0 deletions
| diff --git a/vendor/golang.org/x/net/LICENSE b/vendor/golang.org/x/net/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/vendor/golang.org/x/net/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +   * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +   * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. +   * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/net/PATENTS b/vendor/golang.org/x/net/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/vendor/golang.org/x/net/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go.  This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation.  If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go new file mode 100644 index 0000000..56efb95 --- /dev/null +++ b/vendor/golang.org/x/net/context/context.go @@ -0,0 +1,156 @@ +// Copyright 2014 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. + +// Package context defines the Context type, which carries deadlines, +// cancelation signals, and other request-scoped values across API boundaries +// and between processes. +// +// Incoming requests to a server should create a Context, and outgoing calls to +// servers should accept a Context.  The chain of function calls between must +// propagate the Context, optionally replacing it with a modified copy created +// using WithDeadline, WithTimeout, WithCancel, or WithValue. +// +// Programs that use Contexts should follow these rules to keep interfaces +// consistent across packages and enable static analysis tools to check context +// propagation: +// +// Do not store Contexts inside a struct type; instead, pass a Context +// explicitly to each function that needs it.  The Context should be the first +// parameter, typically named ctx: +// +// 	func DoSomething(ctx context.Context, arg Arg) error { +// 		// ... use ctx ... +// 	} +// +// Do not pass a nil Context, even if a function permits it.  Pass context.TODO +// if you are unsure about which Context to use. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +// +// The same Context may be passed to functions running in different goroutines; +// Contexts are safe for simultaneous use by multiple goroutines. +// +// See http://blog.golang.org/context for example code for a server that uses +// Contexts. +package context + +import "time" + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { +	// Deadline returns the time when work done on behalf of this context +	// should be canceled.  Deadline returns ok==false when no deadline is +	// set.  Successive calls to Deadline return the same results. +	Deadline() (deadline time.Time, ok bool) + +	// Done returns a channel that's closed when work done on behalf of this +	// context should be canceled.  Done may return nil if this context can +	// never be canceled.  Successive calls to Done return the same value. +	// +	// WithCancel arranges for Done to be closed when cancel is called; +	// WithDeadline arranges for Done to be closed when the deadline +	// expires; WithTimeout arranges for Done to be closed when the timeout +	// elapses. +	// +	// Done is provided for use in select statements: +	// +	//  // Stream generates values with DoSomething and sends them to out +	//  // until DoSomething returns an error or ctx.Done is closed. +	//  func Stream(ctx context.Context, out <-chan Value) error { +	//  	for { +	//  		v, err := DoSomething(ctx) +	//  		if err != nil { +	//  			return err +	//  		} +	//  		select { +	//  		case <-ctx.Done(): +	//  			return ctx.Err() +	//  		case out <- v: +	//  		} +	//  	} +	//  } +	// +	// See http://blog.golang.org/pipelines for more examples of how to use +	// a Done channel for cancelation. +	Done() <-chan struct{} + +	// Err returns a non-nil error value after Done is closed.  Err returns +	// Canceled if the context was canceled or DeadlineExceeded if the +	// context's deadline passed.  No other values for Err are defined. +	// After Done is closed, successive calls to Err return the same value. +	Err() error + +	// Value returns the value associated with this context for key, or nil +	// if no value is associated with key.  Successive calls to Value with +	// the same key returns the same result. +	// +	// Use context values only for request-scoped data that transits +	// processes and API boundaries, not for passing optional parameters to +	// functions. +	// +	// A key identifies a specific value in a Context.  Functions that wish +	// to store values in Context typically allocate a key in a global +	// variable then use that key as the argument to context.WithValue and +	// Context.Value.  A key can be any type that supports equality; +	// packages should define keys as an unexported type to avoid +	// collisions. +	// +	// Packages that define a Context key should provide type-safe accessors +	// for the values stores using that key: +	// +	// 	// Package user defines a User type that's stored in Contexts. +	// 	package user +	// +	// 	import "golang.org/x/net/context" +	// +	// 	// User is the type of value stored in the Contexts. +	// 	type User struct {...} +	// +	// 	// key is an unexported type for keys defined in this package. +	// 	// This prevents collisions with keys defined in other packages. +	// 	type key int +	// +	// 	// userKey is the key for user.User values in Contexts.  It is +	// 	// unexported; clients use user.NewContext and user.FromContext +	// 	// instead of using this key directly. +	// 	var userKey key = 0 +	// +	// 	// NewContext returns a new Context that carries value u. +	// 	func NewContext(ctx context.Context, u *User) context.Context { +	// 		return context.WithValue(ctx, userKey, u) +	// 	} +	// +	// 	// FromContext returns the User value stored in ctx, if any. +	// 	func FromContext(ctx context.Context) (*User, bool) { +	// 		u, ok := ctx.Value(userKey).(*User) +	// 		return u, ok +	// 	} +	Value(key interface{}) interface{} +} + +// Background returns a non-nil, empty Context. It is never canceled, has no +// values, and has no deadline.  It is typically used by the main function, +// initialization, and tests, and as the top-level Context for incoming +// requests. +func Background() Context { +	return background +} + +// TODO returns a non-nil, empty Context.  Code should use context.TODO when +// it's unclear which Context to use or it is not yet available (because the +// surrounding function has not yet been extended to accept a Context +// parameter).  TODO is recognized by static analysis tools that determine +// whether Contexts are propagated correctly in a program. +func TODO() Context { +	return todo +} + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc func() diff --git a/vendor/golang.org/x/net/context/ctxhttp/cancelreq.go b/vendor/golang.org/x/net/context/ctxhttp/cancelreq.go new file mode 100644 index 0000000..e3170e3 --- /dev/null +++ b/vendor/golang.org/x/net/context/ctxhttp/cancelreq.go @@ -0,0 +1,19 @@ +// 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.5 + +package ctxhttp + +import "net/http" + +func canceler(client *http.Client, req *http.Request) func() { +	// TODO(djd): Respect any existing value of req.Cancel. +	ch := make(chan struct{}) +	req.Cancel = ch + +	return func() { +		close(ch) +	} +} diff --git a/vendor/golang.org/x/net/context/ctxhttp/cancelreq_go14.go b/vendor/golang.org/x/net/context/ctxhttp/cancelreq_go14.go new file mode 100644 index 0000000..56bcbad --- /dev/null +++ b/vendor/golang.org/x/net/context/ctxhttp/cancelreq_go14.go @@ -0,0 +1,23 @@ +// 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.5 + +package ctxhttp + +import "net/http" + +type requestCanceler interface { +	CancelRequest(*http.Request) +} + +func canceler(client *http.Client, req *http.Request) func() { +	rc, ok := client.Transport.(requestCanceler) +	if !ok { +		return func() {} +	} +	return func() { +		rc.CancelRequest(req) +	} +} diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go new file mode 100644 index 0000000..e35860a --- /dev/null +++ b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go @@ -0,0 +1,145 @@ +// 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. + +// Package ctxhttp provides helper functions for performing context-aware HTTP requests. +package 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 +	} + +	// Request cancelation changed in Go 1.5, see cancelreq.go and cancelreq_go14.go. +	cancel := canceler(client, req) + +	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() +		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(): +			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 +} diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go new file mode 100644 index 0000000..f8cda19 --- /dev/null +++ b/vendor/golang.org/x/net/context/go17.go @@ -0,0 +1,72 @@ +// 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 context + +import ( +	"context" // standard library's context, as of Go 1.7 +	"time" +) + +var ( +	todo       = context.TODO() +	background = context.Background() +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = context.Canceled + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = context.DeadlineExceeded + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { +	ctx, f := context.WithCancel(parent) +	return ctx, CancelFunc(f) +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d.  If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent.  The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { +	ctx, f := context.WithDeadline(parent, deadline) +	return ctx, CancelFunc(f) +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// 	func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// 		ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// 		defer cancel()  // releases resources if slowOperation completes before timeout elapses +// 		return slowOperation(ctx) +// 	} +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { +	return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { +	return context.WithValue(parent, key, val) +} diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go new file mode 100644 index 0000000..5a30aca --- /dev/null +++ b/vendor/golang.org/x/net/context/pre_go17.go @@ -0,0 +1,300 @@ +// Copyright 2014 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 context + +import ( +	"errors" +	"fmt" +	"sync" +	"time" +) + +// An emptyCtx is never canceled, has no values, and has no deadline.  It is not +// struct{}, since vars of this type must have distinct addresses. +type emptyCtx int + +func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { +	return +} + +func (*emptyCtx) Done() <-chan struct{} { +	return nil +} + +func (*emptyCtx) Err() error { +	return nil +} + +func (*emptyCtx) Value(key interface{}) interface{} { +	return nil +} + +func (e *emptyCtx) String() string { +	switch e { +	case background: +		return "context.Background" +	case todo: +		return "context.TODO" +	} +	return "unknown empty Context" +} + +var ( +	background = new(emptyCtx) +	todo       = new(emptyCtx) +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = errors.New("context canceled") + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = errors.New("context deadline exceeded") + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { +	c := newCancelCtx(parent) +	propagateCancel(parent, c) +	return c, func() { c.cancel(true, Canceled) } +} + +// newCancelCtx returns an initialized cancelCtx. +func newCancelCtx(parent Context) *cancelCtx { +	return &cancelCtx{ +		Context: parent, +		done:    make(chan struct{}), +	} +} + +// propagateCancel arranges for child to be canceled when parent is. +func propagateCancel(parent Context, child canceler) { +	if parent.Done() == nil { +		return // parent is never canceled +	} +	if p, ok := parentCancelCtx(parent); ok { +		p.mu.Lock() +		if p.err != nil { +			// parent has already been canceled +			child.cancel(false, p.err) +		} else { +			if p.children == nil { +				p.children = make(map[canceler]bool) +			} +			p.children[child] = true +		} +		p.mu.Unlock() +	} else { +		go func() { +			select { +			case <-parent.Done(): +				child.cancel(false, parent.Err()) +			case <-child.Done(): +			} +		}() +	} +} + +// parentCancelCtx follows a chain of parent references until it finds a +// *cancelCtx.  This function understands how each of the concrete types in this +// package represents its parent. +func parentCancelCtx(parent Context) (*cancelCtx, bool) { +	for { +		switch c := parent.(type) { +		case *cancelCtx: +			return c, true +		case *timerCtx: +			return c.cancelCtx, true +		case *valueCtx: +			parent = c.Context +		default: +			return nil, false +		} +	} +} + +// removeChild removes a context from its parent. +func removeChild(parent Context, child canceler) { +	p, ok := parentCancelCtx(parent) +	if !ok { +		return +	} +	p.mu.Lock() +	if p.children != nil { +		delete(p.children, child) +	} +	p.mu.Unlock() +} + +// A canceler is a context type that can be canceled directly.  The +// implementations are *cancelCtx and *timerCtx. +type canceler interface { +	cancel(removeFromParent bool, err error) +	Done() <-chan struct{} +} + +// A cancelCtx can be canceled.  When canceled, it also cancels any children +// that implement canceler. +type cancelCtx struct { +	Context + +	done chan struct{} // closed by the first cancel call. + +	mu       sync.Mutex +	children map[canceler]bool // set to nil by the first cancel call +	err      error             // set to non-nil by the first cancel call +} + +func (c *cancelCtx) Done() <-chan struct{} { +	return c.done +} + +func (c *cancelCtx) Err() error { +	c.mu.Lock() +	defer c.mu.Unlock() +	return c.err +} + +func (c *cancelCtx) String() string { +	return fmt.Sprintf("%v.WithCancel", c.Context) +} + +// cancel closes c.done, cancels each of c's children, and, if +// removeFromParent is true, removes c from its parent's children. +func (c *cancelCtx) cancel(removeFromParent bool, err error) { +	if err == nil { +		panic("context: internal error: missing cancel error") +	} +	c.mu.Lock() +	if c.err != nil { +		c.mu.Unlock() +		return // already canceled +	} +	c.err = err +	close(c.done) +	for child := range c.children { +		// NOTE: acquiring the child's lock while holding parent's lock. +		child.cancel(false, err) +	} +	c.children = nil +	c.mu.Unlock() + +	if removeFromParent { +		removeChild(c.Context, c) +	} +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d.  If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent.  The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { +	if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { +		// The current deadline is already sooner than the new one. +		return WithCancel(parent) +	} +	c := &timerCtx{ +		cancelCtx: newCancelCtx(parent), +		deadline:  deadline, +	} +	propagateCancel(parent, c) +	d := deadline.Sub(time.Now()) +	if d <= 0 { +		c.cancel(true, DeadlineExceeded) // deadline has already passed +		return c, func() { c.cancel(true, Canceled) } +	} +	c.mu.Lock() +	defer c.mu.Unlock() +	if c.err == nil { +		c.timer = time.AfterFunc(d, func() { +			c.cancel(true, DeadlineExceeded) +		}) +	} +	return c, func() { c.cancel(true, Canceled) } +} + +// A timerCtx carries a timer and a deadline.  It embeds a cancelCtx to +// implement Done and Err.  It implements cancel by stopping its timer then +// delegating to cancelCtx.cancel. +type timerCtx struct { +	*cancelCtx +	timer *time.Timer // Under cancelCtx.mu. + +	deadline time.Time +} + +func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { +	return c.deadline, true +} + +func (c *timerCtx) String() string { +	return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) +} + +func (c *timerCtx) cancel(removeFromParent bool, err error) { +	c.cancelCtx.cancel(false, err) +	if removeFromParent { +		// Remove this timerCtx from its parent cancelCtx's children. +		removeChild(c.cancelCtx.Context, c) +	} +	c.mu.Lock() +	if c.timer != nil { +		c.timer.Stop() +		c.timer = nil +	} +	c.mu.Unlock() +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// 	func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// 		ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// 		defer cancel()  // releases resources if slowOperation completes before timeout elapses +// 		return slowOperation(ctx) +// 	} +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { +	return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { +	return &valueCtx{parent, key, val} +} + +// A valueCtx carries a key-value pair.  It implements Value for that key and +// delegates all other calls to the embedded Context. +type valueCtx struct { +	Context +	key, val interface{} +} + +func (c *valueCtx) String() string { +	return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) +} + +func (c *valueCtx) Value(key interface{}) interface{} { +	if c.key == key { +		return c.val +	} +	return c.Context.Value(key) +} | 
