The changes simplify the `req` method by moving the
authentication-related code into the API.
This makes it easy to add additional authentication methods.
The API introduces an `Authorizer` that acts as an
authenticator factory. The authentication flow itself
is divided down into `Authorize` and `Verify` steps in order
to encapsulate and control complex authentication challenges.
The default `NewAutoAuth` negotiates the algorithms.
Under the hood, it creates an authenticator shim per request,
which delegates the authentication flow to our authenticators.
The `NewEmptyAuth` and `NewPreemptiveAuth` authorizers
allow you to have more control over algorithms and resources.
The API also allows interception of the redirect mechanism by setting
the `XInhibitRedirect` header.
This closes: #15#24#38
Client.Stat was not returning a proper Go err for not found files, the
ideal way to check this is using `errors.Is(err, fs.ErrNotExist)` but
the client was returning a generic error.
I've updated the `propfind` to take 404 errors into account, retuning
the above error making easier to evaluate that kind of situations.
* bubble up request errors [#28]
* inhibit stream close on request
* add `StatusError`
* `PUT`: check if given target is a directory
* Revert "inhibit stream close on request"
Cherry-picked into branch dev-bodyclosing.
This reverts commit 2889239999.
Co-authored-by: Christoph Polcin <coco@miconoco.de>
It passes "Range: bytes=X-Y" and if the server returns HTTP 206,
we know it complied with the request.
For servers that don't understand range and return HTTP 200 instead we
discard some bytes and limit the result to emulate this behavior.
This will greatly help https://github.com/kopia/kopia which relies on
partial reads from pack blobs.