{"id":13514304,"url":"https://github.com/studio-b12/gowebdav","last_synced_at":"2026-01-20T19:10:41.677Z","repository":{"id":2340032,"uuid":"38101795","full_name":"studio-b12/gowebdav","owner":"studio-b12","description":"A golang WebDAV client library and command line tool.","archived":false,"fork":false,"pushed_at":"2025-09-05T20:08:07.000Z","size":154,"stargazers_count":347,"open_issues_count":8,"forks_count":103,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-09-05T21:29:28.416Z","etag":null,"topics":["cli","client","golang","library","webdav","webdav-client"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/studio-b12.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-06-26T09:07:34.000Z","updated_at":"2025-09-05T20:05:50.000Z","dependencies_parsed_at":"2024-06-18T12:27:31.390Z","dependency_job_id":"c776b99f-1e82-4d80-beb9-b0683827e34e","html_url":"https://github.com/studio-b12/gowebdav","commit_stats":{"total_commits":154,"total_committers":29,"mean_commits":5.310344827586207,"dds":0.525974025974026,"last_synced_commit":"3282f94193f2377a73ae2b0a4833980af33ea5df"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/studio-b12/gowebdav","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studio-b12%2Fgowebdav","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studio-b12%2Fgowebdav/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studio-b12%2Fgowebdav/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studio-b12%2Fgowebdav/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/studio-b12","download_url":"https://codeload.github.com/studio-b12/gowebdav/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studio-b12%2Fgowebdav/sbom","scorecard":{"id":856138,"data":{"date":"2025-08-11","repo":{"name":"github.com/studio-b12/gowebdav","commit":"1d8243f7da0c99e52c456089e7d05ed88bd93707"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.1,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":2,"reason":"Found 5/21 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/artifacts.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/studio-b12/gowebdav/artifacts.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/artifacts.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/studio-b12/gowebdav/artifacts.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/artifacts.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/studio-b12/gowebdav/artifacts.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/studio-b12/gowebdav/tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/studio-b12/gowebdav/tests.yml/master?enable=pin","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   2 out of   2 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/artifacts.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T23:56:15.192Z","repository_id":2340032,"created_at":"2025-08-23T23:56:15.192Z","updated_at":"2025-08-23T23:56:15.192Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28609848,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T18:56:40.769Z","status":"ssl_error","status_checked_at":"2026-01-20T18:54:26.653Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","client","golang","library","webdav","webdav-client"],"created_at":"2024-08-01T05:00:52.235Z","updated_at":"2026-01-20T19:10:41.624Z","avatar_url":"https://github.com/studio-b12.png","language":"Go","funding_links":[],"categories":["Libraries","Go"],"sub_categories":["Go"],"readme":"# GoWebDAV\n\n[![Unit Tests Status](https://github.com/studio-b12/gowebdav/actions/workflows/tests.yml/badge.svg)](https://github.com/studio-b12/gowebdav/actions/workflows/tests.yml)\n[![Build Artifacts Status](https://github.com/studio-b12/gowebdav/actions/workflows/artifacts.yml/badge.svg)](https://github.com/studio-b12/gowebdav/actions/workflows/artifacts.yml)\n[![GoDoc](https://godoc.org/github.com/studio-b12/gowebdav?status.svg)](https://godoc.org/github.com/studio-b12/gowebdav)\n[![Go Report Card](https://goreportcard.com/badge/github.com/studio-b12/gowebdav)](https://goreportcard.com/report/github.com/studio-b12/gowebdav)\n\nA pure Golang WebDAV client library that comes with a [reference implementation](https://github.com/studio-b12/gowebdav/tree/master/cmd/gowebdav).\n\n## Features at a glance\n\nOur `gowebdav` library allows to perform following actions on the remote WebDAV server:\n\n* [create path](#create-path-on-a-webdav-server)\n* [get files list](#get-files-list)\n* [download file](#download-file-to-byte-array)\n* [upload file](#upload-file-from-byte-array)\n* [get information about specified file/folder](#get-information-about-specified-filefolder)\n* [move file to another location](#move-file-to-another-location)\n* [copy file to another location](#copy-file-to-another-location)\n* [delete file](#delete-file)\n\nIt also provides an [authentication API](#type-authenticator) that makes it easy to encapsulate and control complex authentication challenges.\nThe default implementation negotiates the algorithm based on the user's preferences and the methods offered by the remote server.\n\nOut-of-box authentication support for:\n\n* [BasicAuth](https://en.wikipedia.org/wiki/Basic_access_authentication)\n* [DigestAuth](https://en.wikipedia.org/wiki/Digest_access_authentication)\n* [MS-PASS](https://github.com/studio-b12/gowebdav/pull/70#issuecomment-1421713726)\n* [WIP Kerberos](https://github.com/studio-b12/gowebdav/pull/71#issuecomment-1416465334)\n* [WIP Bearer Token](https://github.com/studio-b12/gowebdav/issues/61)\n\n## Usage\n\nFirst of all you should create `Client` instance using `NewClient()` function:\n\n```go\nroot := \"https://webdav.mydomain.me\"\nuser := \"user\"\npassword := \"password\"\n\nc := gowebdav.NewClient(root, user, password)\nc.Connect()\n// kick of your work!\n```\n\nAfter you can use this `Client` to perform actions, described below.\n\n**NOTICE:** We will not check for errors in the examples, to focus you on the `gowebdav` library's code, but you should do it in your code!\n\n### Create path on a WebDAV server\n```go\nerr := c.Mkdir(\"folder\", 0644)\n```\nIn case you want to create several folders you can use `c.MkdirAll()`:\n```go\nerr := c.MkdirAll(\"folder/subfolder/subfolder2\", 0644)\n```\n\n### Get files list\n```go\nfiles, _ := c.ReadDir(\"folder/subfolder\")\nfor _, file := range files {\n    //notice that [file] has os.FileInfo type\n    fmt.Println(file.Name())\n}\n```\n\n### Download file to byte array\n```go\nwebdavFilePath := \"folder/subfolder/file.txt\"\nlocalFilePath := \"/tmp/webdav/file.txt\"\n\nbytes, _ := c.Read(webdavFilePath)\nos.WriteFile(localFilePath, bytes, 0644)\n```\n\n### Download file via reader\nAlso you can use `c.ReadStream()` method:\n```go\nwebdavFilePath := \"folder/subfolder/file.txt\"\nlocalFilePath := \"/tmp/webdav/file.txt\"\n\nreader, _ := c.ReadStream(webdavFilePath)\n\nfile, _ := os.Create(localFilePath)\ndefer file.Close()\n\nio.Copy(file, reader)\n```\n\n### Upload file from byte array\n```go\nwebdavFilePath := \"folder/subfolder/file.txt\"\nlocalFilePath := \"/tmp/webdav/file.txt\"\n\nbytes, _ := os.ReadFile(localFilePath)\n\nc.Write(webdavFilePath, bytes, 0644)\n```\n\n### Upload file via writer\n```go\nwebdavFilePath := \"folder/subfolder/file.txt\"\nlocalFilePath := \"/tmp/webdav/file.txt\"\n\nfile, _ := os.Open(localFilePath)\ndefer file.Close()\n\nc.WriteStream(webdavFilePath, file, 0644)\n```\n\nFor non-seekable stream, this will read data into memory first\nto discover content length.\n\n### Upload file via writer with known length\n```go\nwebdavFilePath := \"folder/subfolder/file.txt\"\n\nbytes := []byte{0x20, 0x20}\n\nc.WriteStreamWithLength(webdavFilePath, bytes.NewBuffer(bytes), int64(len(data)), 0644)\n```\n\n### Get information about specified file/folder\n```go\nwebdavFilePath := \"folder/subfolder/file.txt\"\n\ninfo := c.Stat(webdavFilePath)\n//notice that [info] has os.FileInfo type\nfmt.Println(info)\n```\n\n### Move file to another location\n```go\noldPath := \"folder/subfolder/file.txt\"\nnewPath := \"folder/subfolder/moved.txt\"\nisOverwrite := true\n\nc.Rename(oldPath, newPath, isOverwrite)\n```\n\n### Copy file to another location\n```go\noldPath := \"folder/subfolder/file.txt\"\nnewPath := \"folder/subfolder/file-copy.txt\"\nisOverwrite := true\n\nc.Copy(oldPath, newPath, isOverwrite)\n```\n\n### Delete file\n```go\nwebdavFilePath := \"folder/subfolder/file.txt\"\n\nc.Remove(webdavFilePath)\n```\n\n## Links\n\nMore details about WebDAV server you can read from following resources:\n\n* [RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)](https://tools.ietf.org/html/rfc4918)\n* [RFC 5689 - Extended MKCOL for Web Distributed Authoring and Versioning (WebDAV)](https://tools.ietf.org/html/rfc5689)\n* [RFC 2616 - HTTP/1.1 Status Code Definitions](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html \"HTTP/1.1 Status Code Definitions\")\n* [WebDav: Next Generation Collaborative Web Authoring By Lisa Dusseaul](https://books.google.de/books?isbn=0130652083 \"WebDav: Next Generation Collaborative Web Authoring By Lisa Dusseault\")\n\n**NOTICE**: RFC 2518 is obsoleted by RFC 4918 in June 2007\n\n## Contributing\nAll contributing are welcome. If you have any suggestions or find some bug - please create an Issue to let us make this project better. We appreciate your help!\n\n## License\nThis library is distributed under the BSD 3-Clause license found in the [LICENSE](https://github.com/studio-b12/gowebdav/blob/master/LICENSE) file.\n\n## Stargazers over time\n[![Stargazers over time](https://starchart.cc/studio-b12/gowebdav.svg?variant=adaptive)](https://starchart.cc/studio-b12/gowebdav)\n\n## API\n\n`import \"github.com/studio-b12/gowebdav\"`\n\n* [Overview](#pkg-overview)\n* [Index](#pkg-index)\n* [Examples](#pkg-examples)\n* [Subdirectories](#pkg-subdirectories)\n\n### \u003ca name=\"pkg-overview\"\u003eOverview\u003c/a\u003e\nPackage gowebdav is a WebDAV client library with a command line tool\nincluded.\n\n### \u003ca name=\"pkg-index\"\u003eIndex\u003c/a\u003e\n* [Constants](#pkg-constants)\n* [Variables](#pkg-variables)\n* [func FixSlash(s string) string](#FixSlash)\n* [func FixSlashes(s string) string](#FixSlashes)\n* [func IsErrCode(err error, code int) bool](#IsErrCode)\n* [func IsErrNotFound(err error) bool](#IsErrNotFound)\n* [func Join(path0 string, path1 string) string](#Join)\n* [func NewPathError(op string, path string, statusCode int) error](#NewPathError)\n* [func NewPathErrorErr(op string, path string, err error) error](#NewPathErrorErr)\n* [func PathEscape(path string) string](#PathEscape)\n* [func ReadConfig(uri, netrc string) (string, string)](#ReadConfig)\n* [func String(r io.Reader) string](#String)\n* [type AuthFactory](#AuthFactory)\n* [type Authenticator](#Authenticator)\n  * [func NewDigestAuth(login, secret string, rs *http.Response) (Authenticator, error)](#NewDigestAuth)\n  * [func NewPassportAuth(c *http.Client, user, pw, partnerURL string, header *http.Header) (Authenticator, error)](#NewPassportAuth)\n* [type Authorizer](#Authorizer)\n  * [func NewAutoAuth(login string, secret string) Authorizer](#NewAutoAuth)\n  * [func NewEmptyAuth() Authorizer](#NewEmptyAuth)\n  * [func NewPreemptiveAuth(auth Authenticator) Authorizer](#NewPreemptiveAuth)\n* [type BasicAuth](#BasicAuth)\n  * [func (b *BasicAuth) Authorize(c *http.Client, rq *http.Request, path string) error](#BasicAuth.Authorize)\n  * [func (b *BasicAuth) Clone() Authenticator](#BasicAuth.Clone)\n  * [func (b *BasicAuth) Close() error](#BasicAuth.Close)\n  * [func (b *BasicAuth) String() string](#BasicAuth.String)\n  * [func (b *BasicAuth) Verify(c *http.Client, rs *http.Response, path string) (redo bool, err error)](#BasicAuth.Verify)\n* [type Client](#Client)\n  * [func NewAuthClient(uri string, auth Authorizer) *Client](#NewAuthClient)\n  * [func NewClient(uri, user, pw string) *Client](#NewClient)\n  * [func (c *Client) Connect() error](#Client.Connect)\n  * [func (c *Client) Copy(oldpath, newpath string, overwrite bool) error](#Client.Copy)\n  * [func (c *Client) Mkdir(path string, _ os.FileMode) (err error)](#Client.Mkdir)\n  * [func (c *Client) MkdirAll(path string, _ os.FileMode) (err error)](#Client.MkdirAll)\n  * [func (c *Client) Read(path string) ([]byte, error)](#Client.Read)\n  * [func (c *Client) ReadDir(path string) ([]os.FileInfo, error)](#Client.ReadDir)\n  * [func (c *Client) ReadStream(path string) (io.ReadCloser, error)](#Client.ReadStream)\n  * [func (c *Client) ReadStreamRange(path string, offset, length int64) (io.ReadCloser, error)](#Client.ReadStreamRange)\n  * [func (c *Client) Remove(path string) error](#Client.Remove)\n  * [func (c *Client) RemoveAll(path string) error](#Client.RemoveAll)\n  * [func (c *Client) Rename(oldpath, newpath string, overwrite bool) error](#Client.Rename)\n  * [func (c *Client) SetHeader(key, value string)](#Client.SetHeader)\n  * [func (c *Client) SetInterceptor(interceptor func(method string, rq *http.Request))](#Client.SetInterceptor)\n  * [func (c *Client) SetJar(jar http.CookieJar)](#Client.SetJar)\n  * [func (c *Client) SetTimeout(timeout time.Duration)](#Client.SetTimeout)\n  * [func (c *Client) SetTransport(transport http.RoundTripper)](#Client.SetTransport)\n  * [func (c *Client) Stat(path string) (os.FileInfo, error)](#Client.Stat)\n  * [func (c *Client) Write(path string, data []byte, _ os.FileMode) (err error)](#Client.Write)\n  * [func (c *Client) WriteStream(path string, stream io.Reader, _ os.FileMode) (err error)](#Client.WriteStream)\n  * [func (c *Client) WriteStreamWithLength(path string, stream io.Reader, contentLength int64, _ os.FileMode) (err error)](#Client.WriteStreamWithLength)\n* [type DigestAuth](#DigestAuth)\n  * [func (d *DigestAuth) Authorize(c *http.Client, rq *http.Request, path string) error](#DigestAuth.Authorize)\n  * [func (d *DigestAuth) Clone() Authenticator](#DigestAuth.Clone)\n  * [func (d *DigestAuth) Close() error](#DigestAuth.Close)\n  * [func (d *DigestAuth) String() string](#DigestAuth.String)\n  * [func (d *DigestAuth) Verify(c *http.Client, rs *http.Response, path string) (redo bool, err error)](#DigestAuth.Verify)\n* [type File](#File)\n  * [func (f File) ContentType() string](#File.ContentType)\n  * [func (f File) ETag() string](#File.ETag)\n  * [func (f File) IsDir() bool](#File.IsDir)\n  * [func (f File) ModTime() time.Time](#File.ModTime)\n  * [func (f File) Mode() os.FileMode](#File.Mode)\n  * [func (f File) Name() string](#File.Name)\n  * [func (f File) Path() string](#File.Path)\n  * [func (f File) Size() int64](#File.Size)\n  * [func (f File) String() string](#File.String)\n  * [func (f File) Sys() interface{}](#File.Sys)\n* [type PassportAuth](#PassportAuth)\n  * [func (p *PassportAuth) Authorize(c *http.Client, rq *http.Request, path string) error](#PassportAuth.Authorize)\n  * [func (p *PassportAuth) Clone() Authenticator](#PassportAuth.Clone)\n  * [func (p *PassportAuth) Close() error](#PassportAuth.Close)\n  * [func (p *PassportAuth) String() string](#PassportAuth.String)\n  * [func (p *PassportAuth) Verify(c *http.Client, rs *http.Response, path string) (redo bool, err error)](#PassportAuth.Verify)\n* [type StatusError](#StatusError)\n  * [func (se StatusError) Error() string](#StatusError.Error)\n\n##### \u003ca name=\"pkg-examples\"\u003eExamples\u003c/a\u003e\n* [PathEscape](#example_PathEscape)\n\n##### \u003ca name=\"pkg-files\"\u003ePackage files\u003c/a\u003e\n[auth.go](https://github.com/studio-b12/gowebdav/blob/master/auth.go) [basicAuth.go](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go) [client.go](https://github.com/studio-b12/gowebdav/blob/master/client.go) [digestAuth.go](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go) [doc.go](https://github.com/studio-b12/gowebdav/blob/master/doc.go) [errors.go](https://github.com/studio-b12/gowebdav/blob/master/errors.go) [file.go](https://github.com/studio-b12/gowebdav/blob/master/file.go) [netrc.go](https://github.com/studio-b12/gowebdav/blob/master/netrc.go) [passportAuth.go](https://github.com/studio-b12/gowebdav/blob/master/passportAuth.go) [requests.go](https://github.com/studio-b12/gowebdav/blob/master/requests.go) [utils.go](https://github.com/studio-b12/gowebdav/blob/master/utils.go) \n\n### \u003ca name=\"pkg-constants\"\u003eConstants\u003c/a\u003e\n``` go\nconst XInhibitRedirect = \"X-Gowebdav-Inhibit-Redirect\"\n```\n\n### \u003ca name=\"pkg-variables\"\u003eVariables\u003c/a\u003e\n``` go\nvar ErrAuthChanged = errors.New(\"authentication failed, change algorithm\")\n```\nErrAuthChanged must be returned from the Verify method as an error\nto trigger a re-authentication / negotiation with a new authenticator.\n\n``` go\nvar ErrTooManyRedirects = errors.New(\"stopped after 10 redirects\")\n```\nErrTooManyRedirects will be used as return error if a request exceeds 10 redirects.\n\n### \u003ca name=\"FixSlash\"\u003efunc\u003c/a\u003e [FixSlash](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=354:384#L23)\n``` go\nfunc FixSlash(s string) string\n```\nFixSlash appends a trailing / to our string\n\n### \u003ca name=\"FixSlashes\"\u003efunc\u003c/a\u003e [FixSlashes](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=506:538#L31)\n``` go\nfunc FixSlashes(s string) string\n```\nFixSlashes appends and prepends a / if they are missing\n\n### \u003ca name=\"IsErrCode\"\u003efunc\u003c/a\u003e [IsErrCode](https://github.com/studio-b12/gowebdav/blob/master/errors.go?s=740:780#L29)\n``` go\nfunc IsErrCode(err error, code int) bool\n```\nIsErrCode returns true if the given error\nis an os.PathError wrapping a StatusError\nwith the given status code.\n\n### \u003ca name=\"IsErrNotFound\"\u003efunc\u003c/a\u003e [IsErrNotFound](https://github.com/studio-b12/gowebdav/blob/master/errors.go?s=972:1006#L39)\n``` go\nfunc IsErrNotFound(err error) bool\n```\nIsErrNotFound is shorthand for IsErrCode\nfor status 404.\n\n### \u003ca name=\"Join\"\u003efunc\u003c/a\u003e [Join](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=639:683#L40)\n``` go\nfunc Join(path0 string, path1 string) string\n```\nJoin joins two paths\n\n### \u003ca name=\"NewPathError\"\u003efunc\u003c/a\u003e [NewPathError](https://github.com/studio-b12/gowebdav/blob/master/errors.go?s=1040:1103#L43)\n``` go\nfunc NewPathError(op string, path string, statusCode int) error\n```\n\n### \u003ca name=\"NewPathErrorErr\"\u003efunc\u003c/a\u003e [NewPathErrorErr](https://github.com/studio-b12/gowebdav/blob/master/errors.go?s=1194:1255#L51)\n``` go\nfunc NewPathErrorErr(op string, path string, err error) error\n```\n\n### \u003ca name=\"PathEscape\"\u003efunc\u003c/a\u003e [PathEscape](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=153:188#L14)\n``` go\nfunc PathEscape(path string) string\n```\nPathEscape escapes all segments of a given path\n\n### \u003ca name=\"ReadConfig\"\u003efunc\u003c/a\u003e [ReadConfig](https://github.com/studio-b12/gowebdav/blob/master/netrc.go?s=428:479#L27)\n``` go\nfunc ReadConfig(uri, netrc string) (string, string)\n```\nReadConfig reads login and password configuration from ~/.netrc\nmachine foo.com login username password 123456\n\n### \u003ca name=\"String\"\u003efunc\u003c/a\u003e [String](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=813:844#L45)\n``` go\nfunc String(r io.Reader) string\n```\nString pulls a string out of our io.Reader\n\n### \u003ca name=\"AuthFactory\"\u003etype\u003c/a\u003e [AuthFactory](https://github.com/studio-b12/gowebdav/blob/master/auth.go?s=150:251#L13)\n``` go\ntype AuthFactory func(c *http.Client, rs *http.Response, path string) (auth Authenticator, err error)\n```\nAuthFactory prototype function to create a new Authenticator\n\n### \u003ca name=\"Authenticator\"\u003etype\u003c/a\u003e [Authenticator](https://github.com/studio-b12/gowebdav/blob/master/auth.go?s=2156:2696#L56)\n``` go\ntype Authenticator interface {\n    // Authorizes a request. Usually by adding some authorization headers.\n    Authorize(c *http.Client, rq *http.Request, path string) error\n    // Verifies the response if the authorization was successful.\n    // May trigger some round trips to pass the authentication.\n    // May also trigger a new Authenticator negotiation by returning `ErrAuthChenged`\n    Verify(c *http.Client, rs *http.Response, path string) (redo bool, err error)\n    // Creates a copy of the underlying Authenticator.\n    Clone() Authenticator\n    io.Closer\n}\n```\nAn Authenticator implements a specific way to authorize requests.\nEach request is bound to a separate Authenticator instance.\n\nThe authentication flow itself is broken down into `Authorize`\nand `Verify` steps. The former method runs before, and the latter\nruns after the `Request` is submitted.\nThis makes it easy to encapsulate and control complex\nauthentication challenges.\n\nSome authentication flows causing authentication round trips,\nwhich can be archived by returning the `redo` of the Verify\nmethod. `True` restarts the authentication process for the\ncurrent action: A new `Request` is spawned, which must be\nauthorized, sent, and re-verified again, until the action\nis successfully submitted.\nThe preferred way is to handle the authentication ping-pong\nwithin `Verify`, and then `redo` with fresh credentials.\n\nThe result of the `Verify` method can also trigger an\n`Authenticator` change by returning the `ErrAuthChanged`\nas an error. Depending on the `Authorizer` this may trigger\nan `Authenticator` negotiation.\n\nSet the `XInhibitRedirect` header to '1' in the `Authorize`\nmethod to get control over request redirection.\nAttention! You must handle the incoming request yourself.\n\nTo store a shared session state the `Clone` method **must**\nreturn a new instance, initialized with the shared state.\n\n#### \u003ca name=\"NewDigestAuth\"\u003efunc\u003c/a\u003e [NewDigestAuth](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go?s=324:406#L21)\n``` go\nfunc NewDigestAuth(login, secret string, rs *http.Response) (Authenticator, error)\n```\nNewDigestAuth creates a new instance of our Digest Authenticator\n\n#### \u003ca name=\"NewPassportAuth\"\u003efunc\u003c/a\u003e [NewPassportAuth](https://github.com/studio-b12/gowebdav/blob/master/passportAuth.go?s=386:495#L21)\n``` go\nfunc NewPassportAuth(c *http.Client, user, pw, partnerURL string, header *http.Header) (Authenticator, error)\n```\nconstructor for PassportAuth creates a new PassportAuth object and\nautomatically authenticates against the given partnerURL\n\n### \u003ca name=\"Authorizer\"\u003etype\u003c/a\u003e [Authorizer](https://github.com/studio-b12/gowebdav/blob/master/auth.go?s=349:764#L17)\n``` go\ntype Authorizer interface {\n    // Creates a new Authenticator Shim per request.\n    // It may track request related states and perform payload buffering\n    // for authentication round trips.\n    // The underlying Authenticator will perform the real authentication.\n    NewAuthenticator(body io.Reader) (Authenticator, io.Reader)\n    // Registers a new Authenticator factory to a key.\n    AddAuthenticator(key string, fn AuthFactory)\n}\n```\nAuthorizer our Authenticator factory which creates an\n`Authenticator` per action/request.\n\n#### \u003ca name=\"NewAutoAuth\"\u003efunc\u003c/a\u003e [NewAutoAuth](https://github.com/studio-b12/gowebdav/blob/master/auth.go?s=3790:3846#L109)\n``` go\nfunc NewAutoAuth(login string, secret string) Authorizer\n```\nNewAutoAuth creates an auto Authenticator factory.\nIt negotiates the default authentication method\nbased on the order of the registered Authenticators\nand the remotely offered authentication methods.\nFirst In, First Out.\n\n#### \u003ca name=\"NewEmptyAuth\"\u003efunc\u003c/a\u003e [NewEmptyAuth](https://github.com/studio-b12/gowebdav/blob/master/auth.go?s=4695:4725#L132)\n``` go\nfunc NewEmptyAuth() Authorizer\n```\nNewEmptyAuth creates an empty Authenticator factory\nThe order of adding the Authenticator matters.\nFirst In, First Out.\nIt offers the `NewAutoAuth` features.\n\n#### \u003ca name=\"NewPreemptiveAuth\"\u003efunc\u003c/a\u003e [NewPreemptiveAuth](https://github.com/studio-b12/gowebdav/blob/master/auth.go?s=5301:5354#L148)\n``` go\nfunc NewPreemptiveAuth(auth Authenticator) Authorizer\n```\nNewPreemptiveAuth creates a preemptive Authenticator\nThe preemptive authorizer uses the provided Authenticator\nfor every request regardless of any `Www-Authenticate` header.\n\nIt may only have one authentication method,\nso calling `AddAuthenticator` **will panic**!\n\nLook out!! This offers the skinniest and slickest implementation\nwithout any synchronisation!!\nStill applicable with `BasicAuth` within go routines.\n\n### \u003ca name=\"BasicAuth\"\u003etype\u003c/a\u003e [BasicAuth](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go?s=94:145#L9)\n``` go\ntype BasicAuth struct {\n    // contains filtered or unexported fields\n}\n\n```\nBasicAuth structure holds our credentials\n\n#### \u003ca name=\"BasicAuth.Authorize\"\u003efunc\u003c/a\u003e (\\*BasicAuth) [Authorize](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go?s=180:262#L15)\n``` go\nfunc (b *BasicAuth) Authorize(c *http.Client, rq *http.Request, path string) error\n```\nAuthorize the current request\n\n#### \u003ca name=\"BasicAuth.Clone\"\u003efunc\u003c/a\u003e (\\*BasicAuth) [Clone](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go?s=666:707#L34)\n``` go\nfunc (b *BasicAuth) Clone() Authenticator\n```\nClone creates a Copy of itself\n\n#### \u003ca name=\"BasicAuth.Close\"\u003efunc\u003c/a\u003e (\\*BasicAuth) [Close](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go?s=581:614#L29)\n``` go\nfunc (b *BasicAuth) Close() error\n```\nClose cleans up all resources\n\n#### \u003ca name=\"BasicAuth.String\"\u003efunc\u003c/a\u003e (\\*BasicAuth) [String](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go?s=778:813#L40)\n``` go\nfunc (b *BasicAuth) String() string\n```\nString toString\n\n#### \u003ca name=\"BasicAuth.Verify\"\u003efunc\u003c/a\u003e (\\*BasicAuth) [Verify](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go?s=352:449#L21)\n``` go\nfunc (b *BasicAuth) Verify(c *http.Client, rs *http.Response, path string) (redo bool, err error)\n```\nVerify verifies if the authentication\n\n### \u003ca name=\"Client\"\u003etype\u003c/a\u003e [Client](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=220:388#L19)\n``` go\ntype Client struct {\n    // contains filtered or unexported fields\n}\n\n```\nClient defines our structure\n\n#### \u003ca name=\"NewAuthClient\"\u003efunc\u003c/a\u003e [NewAuthClient](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=608:663#L33)\n``` go\nfunc NewAuthClient(uri string, auth Authorizer) *Client\n```\nNewAuthClient creates a new client instance with a custom Authorizer\n\n#### \u003ca name=\"NewClient\"\u003efunc\u003c/a\u003e [NewClient](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=436:480#L28)\n``` go\nfunc NewClient(uri, user, pw string) *Client\n```\nNewClient creates a new instance of client\n\n#### \u003ca name=\"Client.Connect\"\u003efunc\u003c/a\u003e (\\*Client) [Connect](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=1829:1861#L74)\n``` go\nfunc (c *Client) Connect() error\n```\nConnect connects to our dav server\n\n#### \u003ca name=\"Client.Copy\"\u003efunc\u003c/a\u003e (\\*Client) [Copy](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=6815:6883#L310)\n``` go\nfunc (c *Client) Copy(oldpath, newpath string, overwrite bool) error\n```\nCopy copies a file from A to B\n\n#### \u003ca name=\"Client.Mkdir\"\u003efunc\u003c/a\u003e (\\*Client) [Mkdir](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=5790:5852#L259)\n``` go\nfunc (c *Client) Mkdir(path string, _ os.FileMode) (err error)\n```\nMkdir makes a directory\n\n#### \u003ca name=\"Client.MkdirAll\"\u003efunc\u003c/a\u003e (\\*Client) [MkdirAll](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=6065:6130#L273)\n``` go\nfunc (c *Client) MkdirAll(path string, _ os.FileMode) (err error)\n```\nMkdirAll like mkdir -p, but for webdav\n\n#### \u003ca name=\"Client.Read\"\u003efunc\u003c/a\u003e (\\*Client) [Read](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=6989:7039#L315)\n``` go\nfunc (c *Client) Read(path string) ([]byte, error)\n```\nRead reads the contents of a remote file\n\n#### \u003ca name=\"Client.ReadDir\"\u003efunc\u003c/a\u003e (\\*Client) [ReadDir](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=2855:2915#L117)\n``` go\nfunc (c *Client) ReadDir(path string) ([]os.FileInfo, error)\n```\nReadDir reads the contents of a remote directory\n\n#### \u003ca name=\"Client.ReadStream\"\u003efunc\u003c/a\u003e (\\*Client) [ReadStream](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=7350:7413#L333)\n``` go\nfunc (c *Client) ReadStream(path string) (io.ReadCloser, error)\n```\nReadStream reads the stream for a given path\n\n#### \u003ca name=\"Client.ReadStreamRange\"\u003efunc\u003c/a\u003e (\\*Client) [ReadStreamRange](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=8162:8252#L355)\n``` go\nfunc (c *Client) ReadStreamRange(path string, offset, length int64) (io.ReadCloser, error)\n```\nReadStreamRange reads the stream representing a subset of bytes for a given path,\nutilizing HTTP Range Requests if the server supports it.\nThe range is expressed as offset from the start of the file and length, for example\noffset=10, length=10 will return bytes 10 through 19.\n\nIf the server does not support partial content requests and returns full content instead,\nthis function will emulate the behavior by skipping `offset` bytes and limiting the result\nto `length`.\n\n#### \u003ca name=\"Client.Remove\"\u003efunc\u003c/a\u003e (\\*Client) [Remove](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=5296:5338#L236)\n``` go\nfunc (c *Client) Remove(path string) error\n```\nRemove removes a remote file\n\n#### \u003ca name=\"Client.RemoveAll\"\u003efunc\u003c/a\u003e (\\*Client) [RemoveAll](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=5404:5449#L241)\n``` go\nfunc (c *Client) RemoveAll(path string) error\n```\nRemoveAll removes remote files\n\n#### \u003ca name=\"Client.Rename\"\u003efunc\u003c/a\u003e (\\*Client) [Rename](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=6649:6719#L305)\n``` go\nfunc (c *Client) Rename(oldpath, newpath string, overwrite bool) error\n```\nRename moves a file from A to B\n\n#### \u003ca name=\"Client.SetHeader\"\u003efunc\u003c/a\u003e (\\*Client) [SetHeader](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=1092:1137#L49)\n``` go\nfunc (c *Client) SetHeader(key, value string)\n```\nSetHeader lets us set arbitrary headers for a given client\n\n#### \u003ca name=\"Client.SetInterceptor\"\u003efunc\u003c/a\u003e (\\*Client) [SetInterceptor](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=1244:1326#L54)\n``` go\nfunc (c *Client) SetInterceptor(interceptor func(method string, rq *http.Request))\n```\nSetInterceptor lets us set an arbitrary interceptor for a given client\n\n#### \u003ca name=\"Client.SetJar\"\u003efunc\u003c/a\u003e (\\*Client) [SetJar](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=1727:1770#L69)\n``` go\nfunc (c *Client) SetJar(jar http.CookieJar)\n```\nSetJar exposes the ability to set a cookie jar to the client.\n\n#### \u003ca name=\"Client.SetTimeout\"\u003efunc\u003c/a\u003e (\\*Client) [SetTimeout](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=1428:1478#L59)\n``` go\nfunc (c *Client) SetTimeout(timeout time.Duration)\n```\nSetTimeout exposes the ability to set a time limit for requests\n\n#### \u003ca name=\"Client.SetTransport\"\u003efunc\u003c/a\u003e (\\*Client) [SetTransport](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=1571:1629#L64)\n``` go\nfunc (c *Client) SetTransport(transport http.RoundTripper)\n```\nSetTransport exposes the ability to define custom transports\n\n#### \u003ca name=\"Client.Stat\"\u003efunc\u003c/a\u003e (\\*Client) [Stat](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=4241:4296#L184)\n``` go\nfunc (c *Client) Stat(path string) (os.FileInfo, error)\n```\nStat returns the file stats for a specified path\n\n#### \u003ca name=\"Client.Write\"\u003efunc\u003c/a\u003e (\\*Client) [Write](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=9272:9347#L389)\n``` go\nfunc (c *Client) Write(path string, data []byte, _ os.FileMode) (err error)\n```\nWrite writes data to a given path\n\n#### \u003ca name=\"Client.WriteStream\"\u003efunc\u003c/a\u003e (\\*Client) [WriteStream](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=9857:9943#L419)\n``` go\nfunc (c *Client) WriteStream(path string, stream io.Reader, _ os.FileMode) (err error)\n```\nWriteStream writes a stream - it will copy to memory for non-seekable streams\n\n#### \u003ca name=\"Client.WriteStreamWithLength\"\u003efunc\u003c/a\u003e (\\*Client) [WriteStreamWithLength](https://github.com/studio-b12/gowebdav/blob/master/client.go?s=10683:10800#L463)\n``` go\nfunc (c *Client) WriteStreamWithLength(path string, stream io.Reader, contentLength int64, _ os.FileMode) (err error)\n```\nWriteStream writes a stream with a known content length\n\n### \u003ca name=\"DigestAuth\"\u003etype\u003c/a\u003e [DigestAuth](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go?s=157:254#L14)\n``` go\ntype DigestAuth struct {\n    // contains filtered or unexported fields\n}\n\n```\nDigestAuth structure holds our credentials\n\n#### \u003ca name=\"DigestAuth.Authorize\"\u003efunc\u003c/a\u003e (\\*DigestAuth) [Authorize](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go?s=525:608#L26)\n``` go\nfunc (d *DigestAuth) Authorize(c *http.Client, rq *http.Request, path string) error\n```\nAuthorize the current request\n\n#### \u003ca name=\"DigestAuth.Clone\"\u003efunc\u003c/a\u003e (\\*DigestAuth) [Clone](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go?s=1303:1345#L54)\n``` go\nfunc (d *DigestAuth) Clone() Authenticator\n```\nClone creates a copy of itself\n\n#### \u003ca name=\"DigestAuth.Close\"\u003efunc\u003c/a\u003e (\\*DigestAuth) [Close](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go?s=1217:1251#L49)\n``` go\nfunc (d *DigestAuth) Close() error\n```\nClose cleans up all resources\n\n#### \u003ca name=\"DigestAuth.String\"\u003efunc\u003c/a\u003e (\\*DigestAuth) [String](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go?s=1541:1577#L63)\n``` go\nfunc (d *DigestAuth) String() string\n```\nString toString\n\n#### \u003ca name=\"DigestAuth.Verify\"\u003efunc\u003c/a\u003e (\\*DigestAuth) [Verify](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go?s=912:1010#L36)\n``` go\nfunc (d *DigestAuth) Verify(c *http.Client, rs *http.Response, path string) (redo bool, err error)\n```\nVerify checks for authentication issues and may trigger a re-authentication\n\n### \u003ca name=\"File\"\u003etype\u003c/a\u003e [File](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=93:253#L10)\n``` go\ntype File struct {\n    // contains filtered or unexported fields\n}\n\n```\nFile is our structure for a given file\n\n#### \u003ca name=\"File.ContentType\"\u003efunc\u003c/a\u003e (File) [ContentType](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=476:510#L31)\n``` go\nfunc (f File) ContentType() string\n```\nContentType returns the content type of a file\n\n#### \u003ca name=\"File.ETag\"\u003efunc\u003c/a\u003e (File) [ETag](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=929:956#L56)\n``` go\nfunc (f File) ETag() string\n```\nETag returns the ETag of a file\n\n#### \u003ca name=\"File.IsDir\"\u003efunc\u003c/a\u003e (File) [IsDir](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=1035:1061#L61)\n``` go\nfunc (f File) IsDir() bool\n```\nIsDir let us see if a given file is a directory or not\n\n#### \u003ca name=\"File.ModTime\"\u003efunc\u003c/a\u003e (File) [ModTime](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=836:869#L51)\n``` go\nfunc (f File) ModTime() time.Time\n```\nModTime returns the modified time of a file\n\n#### \u003ca name=\"File.Mode\"\u003efunc\u003c/a\u003e (File) [Mode](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=665:697#L41)\n``` go\nfunc (f File) Mode() os.FileMode\n```\nMode will return the mode of a given file\n\n#### \u003ca name=\"File.Name\"\u003efunc\u003c/a\u003e (File) [Name](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=378:405#L26)\n``` go\nfunc (f File) Name() string\n```\nName returns the name of a file\n\n#### \u003ca name=\"File.Path\"\u003efunc\u003c/a\u003e (File) [Path](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=295:322#L21)\n``` go\nfunc (f File) Path() string\n```\nPath returns the full path of a file\n\n#### \u003ca name=\"File.Size\"\u003efunc\u003c/a\u003e (File) [Size](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=573:599#L36)\n``` go\nfunc (f File) Size() int64\n```\nSize returns the size of a file\n\n#### \u003ca name=\"File.String\"\u003efunc\u003c/a\u003e (File) [String](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=1183:1212#L71)\n``` go\nfunc (f File) String() string\n```\nString lets us see file information\n\n#### \u003ca name=\"File.Sys\"\u003efunc\u003c/a\u003e (File) [Sys](https://github.com/studio-b12/gowebdav/blob/master/file.go?s=1095:1126#L66)\n``` go\nfunc (f File) Sys() interface{}\n```\nSys ????\n\n### \u003ca name=\"PassportAuth\"\u003etype\u003c/a\u003e [PassportAuth](https://github.com/studio-b12/gowebdav/blob/master/passportAuth.go?s=125:254#L12)\n``` go\ntype PassportAuth struct {\n    // contains filtered or unexported fields\n}\n\n```\nPassportAuth structure holds our credentials\n\n#### \u003ca name=\"PassportAuth.Authorize\"\u003efunc\u003c/a\u003e (\\*PassportAuth) [Authorize](https://github.com/studio-b12/gowebdav/blob/master/passportAuth.go?s=690:775#L32)\n``` go\nfunc (p *PassportAuth) Authorize(c *http.Client, rq *http.Request, path string) error\n```\nAuthorize the current request\n\n#### \u003ca name=\"PassportAuth.Clone\"\u003efunc\u003c/a\u003e (\\*PassportAuth) [Clone](https://github.com/studio-b12/gowebdav/blob/master/passportAuth.go?s=1701:1745#L69)\n``` go\nfunc (p *PassportAuth) Clone() Authenticator\n```\nClone creates a Copy of itself\n\n#### \u003ca name=\"PassportAuth.Close\"\u003efunc\u003c/a\u003e (\\*PassportAuth) [Close](https://github.com/studio-b12/gowebdav/blob/master/passportAuth.go?s=1613:1649#L64)\n``` go\nfunc (p *PassportAuth) Close() error\n```\nClose cleans up all resources\n\n#### \u003ca name=\"PassportAuth.String\"\u003efunc\u003c/a\u003e (\\*PassportAuth) [String](https://github.com/studio-b12/gowebdav/blob/master/passportAuth.go?s=2048:2086#L83)\n``` go\nfunc (p *PassportAuth) String() string\n```\nString toString\n\n#### \u003ca name=\"PassportAuth.Verify\"\u003efunc\u003c/a\u003e (\\*PassportAuth) [Verify](https://github.com/studio-b12/gowebdav/blob/master/passportAuth.go?s=1075:1175#L46)\n``` go\nfunc (p *PassportAuth) Verify(c *http.Client, rs *http.Response, path string) (redo bool, err error)\n```\nVerify verifies if the authentication is good\n\n### \u003ca name=\"StatusError\"\u003etype\u003c/a\u003e [StatusError](https://github.com/studio-b12/gowebdav/blob/master/errors.go?s=499:538#L18)\n``` go\ntype StatusError struct {\n    Status int\n}\n\n```\nStatusError implements error and wraps\nan erroneous status code.\n\n#### \u003ca name=\"StatusError.Error\"\u003efunc\u003c/a\u003e (StatusError) [Error](https://github.com/studio-b12/gowebdav/blob/master/errors.go?s=540:576#L22)\n``` go\nfunc (se StatusError) Error() string\n```\n\n- - -\nGenerated by [godoc2md](http://godoc.org/github.com/davecheney/godoc2md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstudio-b12%2Fgowebdav","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstudio-b12%2Fgowebdav","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstudio-b12%2Fgowebdav/lists"}