code: func (handler *UnroutedHandler) GetFile(w http.ResponseWriter, r *http.Request) {
  	if !handler.composer.UsesGetReader {
  		handler.sendError(w, r, ErrNotImplemented)
  		return
  	}
  
  	id, err := extractIDFromPath(r.URL.Path)
  	if err != nil {
  		handler.sendError(w, r, err)
  		return
  	}
  
  	if handler.composer.UsesLocker {
  		locker := handler.composer.Locker
  		if err := locker.LockUpload(id); err != nil {
  			handler.sendError(w, r, err)
  			return
  		}
  
  		defer locker.UnlockUpload(id)
  	}
  
  	info, err := handler.composer.Core.GetInfo(id)
  	if err != nil {
  		handler.sendError(w, r, err)
  		return
  	}
  
  	// Set headers before sending responses
  	w.Header().Set("Content-Length", strconv.FormatInt(info.Offset, 10))
  
  	contentType, contentDisposition := filterContentType(info)
  	w.Header().Set("Content-Type", contentType)
  	w.Header().Set("Content-Disposition", contentDisposition)
  
  	// If no data has been uploaded yet, respond with an empty "204 No Content" status.
  	if info.Offset == 0 {
  		handler.sendResp(w, r, http.StatusNoContent)
  		return
  	}
  
  	src, err := handler.composer.GetReader.GetReader(id)
  	if err != nil {
  		handler.sendError(w, r, err)
  		return
  	}
  
  	handler.sendResp(w, r, http.StatusOK)
  	io.Copy(w, src)
  
  	// Try to close the reader if the io.Closer interface is implemented
  	if closer, ok := src.(io.Closer); ok {
  		closer.Close()
  	}
  }
docs: // GetFile handles requests to download a file using a GET request. This is not
  // part of the specification.