diff --git a/pkg/handler/unrouted_handler.go b/pkg/handler/unrouted_handler.go index 378a18d..6361175 100644 --- a/pkg/handler/unrouted_handler.go +++ b/pkg/handler/unrouted_handler.go @@ -53,6 +53,24 @@ func NewHTTPError(err error, statusCode int) HTTPError { return httpError{err, statusCode} } +type contextWithValues struct { + context.Context + valueHolder context.Context +} + +func (c contextWithValues) Value(key interface{}) interface{} { + return c.valueHolder.Value(key) +} + +func newContextWithValues(ctx context.Context) contextWithValues { + return contextWithValues{ + // Use background to not get cancel event + Context: context.Background(), + // Use request context to get stored values + valueHolder: ctx, + } +} + var ( ErrUnsupportedVersion = NewHTTPError(errors.New("unsupported version"), http.StatusPreconditionFailed) ErrMaxSizeExceeded = NewHTTPError(errors.New("maximum size exceeded"), http.StatusRequestEntityTooLarge) @@ -290,7 +308,7 @@ func (handler *UnroutedHandler) Middleware(h http.Handler) http.Handler { // PostFile creates a new file upload using the datastore after validating the // length and parsing the metadata. func (handler *UnroutedHandler) PostFile(w http.ResponseWriter, r *http.Request) { - ctx := context.Background() + ctx := newContextWithValues(r.Context()) // Check for presence of application/offset+octet-stream. If another content // type is defined, it will be ignored and treated as none was set because @@ -433,7 +451,7 @@ func (handler *UnroutedHandler) PostFile(w http.ResponseWriter, r *http.Request) // HeadFile returns the length and offset for the HEAD request func (handler *UnroutedHandler) HeadFile(w http.ResponseWriter, r *http.Request) { - ctx := context.Background() + ctx := newContextWithValues(r.Context()) id, err := extractIDFromPath(r.URL.Path) if err != nil { @@ -498,7 +516,7 @@ func (handler *UnroutedHandler) HeadFile(w http.ResponseWriter, r *http.Request) // PatchFile adds a chunk to an upload. This operation is only allowed // if enough space in the upload is left. func (handler *UnroutedHandler) PatchFile(w http.ResponseWriter, r *http.Request) { - ctx := context.Background() + ctx := newContextWithValues(r.Context()) // Check for presence of application/offset+octet-stream if r.Header.Get("Content-Type") != "application/offset+octet-stream" { @@ -727,7 +745,7 @@ func (handler *UnroutedHandler) finishUploadIfComplete(ctx context.Context, uplo // GetFile handles requests to download a file using a GET request. This is not // part of the specification. func (handler *UnroutedHandler) GetFile(w http.ResponseWriter, r *http.Request) { - ctx := context.Background() + ctx := newContextWithValues(r.Context()) id, err := extractIDFromPath(r.URL.Path) if err != nil { @@ -848,7 +866,7 @@ func filterContentType(info FileInfo) (contentType string, contentDisposition st // DelFile terminates an upload permanently. func (handler *UnroutedHandler) DelFile(w http.ResponseWriter, r *http.Request) { - ctx := context.Background() + ctx := newContextWithValues(r.Context()) // Abort the request handling if the required interface is not implemented if !handler.composer.UsesTerminater {