internal

package
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 18, 2024 License: MIT Imports: 16 Imported by: 0

Documentation

Overview

Package internal provides low-level helpers for WebDAV clients and servers.

Index

Constants

View Source
const Namespace = "DAV:"

Variables

View Source
var (
	ResourceTypeName     = xml.Name{Namespace, "resourcetype"}
	DisplayNameName      = xml.Name{Namespace, "displayname"}
	GetContentLengthName = xml.Name{Namespace, "getcontentlength"}
	GetContentTypeName   = xml.Name{Namespace, "getcontenttype"}
	GetLastModifiedName  = xml.Name{Namespace, "getlastmodified"}
	GetETagName          = xml.Name{Namespace, "getetag"}

	CurrentUserPrincipalName = xml.Name{Namespace, "current-user-principal"}
)
View Source
var CollectionName = xml.Name{Namespace, "collection"}

Functions

func DecodeXMLRequest

func DecodeXMLRequest(r *http.Request, v interface{}) error

func DiscoverContextURL added in v0.5.0

func DiscoverContextURL(ctx context.Context, service, domain string) (string, error)

DiscoverContextURL performs a DNS-based CardDAV/CalDAV service discovery as described in RFC 6352 section 11. It returns the URL to the CardDAV server.

func FormatOverwrite

func FormatOverwrite(overwrite bool) string

FormatOverwrite formats an Overwrite header.

func IsNotFound

func IsNotFound(err error) bool

func ParseOverwrite

func ParseOverwrite(s string) (bool, error)

ParseOverwrite parses an Overwrite header.

func ServeError

func ServeError(w http.ResponseWriter, err error)

func ServeMultiStatus added in v0.4.0

func ServeMultiStatus(w http.ResponseWriter, ms *MultiStatus) error

func ServeXML

func ServeXML(w http.ResponseWriter) *xml.Encoder

Types

type Backend

type Backend interface {
	Options(r *http.Request) (caps []string, allow []string, err error)
	HeadGet(w http.ResponseWriter, r *http.Request) error
	PropFind(r *http.Request, pf *PropFind, depth Depth) (*MultiStatus, error)
	PropPatch(r *http.Request, pu *PropertyUpdate) (*Response, error)
	Put(r *http.Request) (*Href, error)
	Delete(r *http.Request) error
	Mkcol(r *http.Request) error
	Copy(r *http.Request, dest *Href, recursive, overwrite bool) (created bool, err error)
	Move(r *http.Request, dest *Href, overwrite bool) (created bool, err error)
}

type Client

type Client struct {
	// contains filtered or unexported fields
}

func NewClient

func NewClient(c HTTPClient, endpoint string) (*Client, error)

func (*Client) Do

func (c *Client) Do(req *http.Request) (*http.Response, error)

func (*Client) DoMultiStatus

func (c *Client) DoMultiStatus(req *http.Request) (*MultiStatus, error)

func (*Client) NewRequest

func (c *Client) NewRequest(method string, path string, body io.Reader) (*http.Request, error)

func (*Client) NewXMLRequest

func (c *Client) NewXMLRequest(method string, path string, v interface{}) (*http.Request, error)

func (*Client) Options added in v0.3.0

func (c *Client) Options(ctx context.Context, path string) (classes map[string]bool, methods map[string]bool, err error)

func (*Client) PropFind added in v0.4.0

func (c *Client) PropFind(ctx context.Context, path string, depth Depth, propfind *PropFind) (*MultiStatus, error)

func (*Client) PropFindFlat added in v0.4.0

func (c *Client) PropFindFlat(ctx context.Context, path string, propfind *PropFind) (*Response, error)

PropfindFlat performs a PROPFIND request with a zero depth.

func (*Client) ResolveHref

func (c *Client) ResolveHref(p string) *url.URL

func (*Client) SyncCollection added in v0.3.1

func (c *Client) SyncCollection(ctx context.Context, path, syncToken string, level Depth, limit *Limit, prop *Prop) (*MultiStatus, error)

SyncCollection perform a `sync-collection` REPORT operation on a resource

type CurrentUserPrincipal

type CurrentUserPrincipal struct {
	XMLName         xml.Name  `xml:"DAV: current-user-principal"`
	Href            Href      `xml:"href,omitempty"`
	Unauthenticated *struct{} `xml:"unauthenticated,omitempty"`
}

https://tools.ietf.org/html/rfc5397#section-3

type Depth

type Depth int

Depth indicates whether a request applies to the resource's members. It's defined in RFC 4918 section 10.2.

const (
	// DepthZero indicates that the request applies only to the resource.
	DepthZero Depth = 0
	// DepthOne indicates that the request applies to the resource and its
	// internal members only.
	DepthOne Depth = 1
	// DepthInfinity indicates that the request applies to the resource and all
	// of its members.
	DepthInfinity Depth = -1
)

func ParseDepth

func ParseDepth(s string) (Depth, error)

ParseDepth parses a Depth header.

func (Depth) String

func (d Depth) String() string

String formats the depth.

type DisplayName

type DisplayName struct {
	XMLName xml.Name `xml:"DAV: displayname"`
	Name    string   `xml:",chardata"`
}

https://tools.ietf.org/html/rfc4918#section-15.2

type ETag added in v0.3.0

type ETag string

func (ETag) MarshalText added in v0.3.0

func (etag ETag) MarshalText() ([]byte, error)

func (ETag) String added in v0.3.0

func (etag ETag) String() string

func (*ETag) UnmarshalText added in v0.3.0

func (etag *ETag) UnmarshalText(b []byte) error

type Error

type Error struct {
	XMLName xml.Name      `xml:"DAV: error"`
	Raw     []RawXMLValue `xml:",any"`
}

https://tools.ietf.org/html/rfc4918#section-14.5

func (*Error) Error added in v0.3.0

func (err *Error) Error() string

type GetContentLength

type GetContentLength struct {
	XMLName xml.Name `xml:"DAV: getcontentlength"`
	Length  int64    `xml:",chardata"`
}

https://tools.ietf.org/html/rfc4918#section-15.4

type GetContentType

type GetContentType struct {
	XMLName xml.Name `xml:"DAV: getcontenttype"`
	Type    string   `xml:",chardata"`
}

https://tools.ietf.org/html/rfc4918#section-15.5

type GetETag

type GetETag struct {
	XMLName xml.Name `xml:"DAV: getetag"`
	ETag    ETag     `xml:",chardata"`
}

https://tools.ietf.org/html/rfc4918#section-15.6

type GetLastModified

type GetLastModified struct {
	XMLName      xml.Name `xml:"DAV: getlastmodified"`
	LastModified Time     `xml:",chardata"`
}

https://tools.ietf.org/html/rfc4918#section-15.7

type HTTPClient added in v0.3.0

type HTTPClient interface {
	Do(req *http.Request) (*http.Response, error)
}

HTTPClient performs HTTP requests. It's implemented by *http.Client.

type HTTPError

type HTTPError struct {
	Code int
	Err  error
}

func HTTPErrorFromError

func HTTPErrorFromError(err error) *HTTPError

func HTTPErrorf

func HTTPErrorf(code int, format string, a ...interface{}) *HTTPError

func (*HTTPError) Error

func (err *HTTPError) Error() string

func (*HTTPError) Unwrap added in v0.4.0

func (err *HTTPError) Unwrap() error

type Handler

type Handler struct {
	Backend Backend
}

func (*Handler) ServeHTTP

func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request)

type Href

type Href url.URL

func (*Href) MarshalText

func (h *Href) MarshalText() ([]byte, error)

func (*Href) String

func (h *Href) String() string

func (*Href) UnmarshalText

func (h *Href) UnmarshalText(b []byte) error

type Include

type Include struct {
	XMLName xml.Name      `xml:"DAV: include"`
	Raw     []RawXMLValue `xml:",any"`
}

https://tools.ietf.org/html/rfc4918#section-14.8

type Limit added in v0.3.1

type Limit struct {
	XMLName  xml.Name `xml:"DAV: limit"`
	NResults uint     `xml:"nresults"`
}

https://tools.ietf.org/html/rfc5323#section-5.17

type Location

type Location struct {
	XMLName xml.Name `xml:"DAV: location"`
	Href    Href     `xml:"href"`
}

https://tools.ietf.org/html/rfc4918#section-14.9

type MultiStatus added in v0.4.0

type MultiStatus struct {
	XMLName             xml.Name   `xml:"DAV: multistatus"`
	Responses           []Response `xml:"response"`
	ResponseDescription string     `xml:"responsedescription,omitempty"`
	SyncToken           string     `xml:"sync-token,omitempty"`
}

https://tools.ietf.org/html/rfc4918#section-14.16

func NewMultiStatus added in v0.4.0

func NewMultiStatus(resps ...Response) *MultiStatus

type Prop

type Prop struct {
	XMLName xml.Name      `xml:"DAV: prop"`
	Raw     []RawXMLValue `xml:",any"`
}

https://tools.ietf.org/html/rfc4918#section-14.18

func EncodeProp

func EncodeProp(values ...interface{}) (*Prop, error)

func (*Prop) Decode

func (p *Prop) Decode(v interface{}) error

func (*Prop) Get

func (p *Prop) Get(name xml.Name) *RawXMLValue

type PropFind added in v0.4.0

type PropFind struct {
	XMLName  xml.Name  `xml:"DAV: propfind"`
	Prop     *Prop     `xml:"prop,omitempty"`
	AllProp  *struct{} `xml:"allprop,omitempty"`
	Include  *Include  `xml:"include,omitempty"`
	PropName *struct{} `xml:"propname,omitempty"`
}

https://tools.ietf.org/html/rfc4918#section-14.20

func NewPropNamePropFind added in v0.4.0

func NewPropNamePropFind(names ...xml.Name) *PropFind

type PropFindFunc added in v0.4.0

type PropFindFunc func(raw *RawXMLValue) (interface{}, error)

type PropStat added in v0.4.0

type PropStat struct {
	XMLName             xml.Name `xml:"DAV: propstat"`
	Prop                Prop     `xml:"prop"`
	Status              Status   `xml:"status"`
	ResponseDescription string   `xml:"responsedescription,omitempty"`
	Error               *Error   `xml:"error,omitempty"`
}

https://tools.ietf.org/html/rfc4918#section-14.22

type PropertyUpdate added in v0.4.0

type PropertyUpdate struct {
	XMLName xml.Name `xml:"DAV: propertyupdate"`
	Remove  []Remove `xml:"remove"`
	Set     []Set    `xml:"set"`
}

https://tools.ietf.org/html/rfc4918#section-14.19

type RawXMLValue

type RawXMLValue struct {
	// contains filtered or unexported fields
}

RawXMLValue is a raw XML value. It implements xml.Unmarshaler and xml.Marshaler and can be used to delay XML decoding or precompute an XML encoding.

func EncodeRawXMLElement

func EncodeRawXMLElement(v interface{}) (*RawXMLValue, error)

EncodeRawXMLElement encodes a value into a new RawXMLValue. The XML value can only be used for marshalling.

func NewRawXMLElement

func NewRawXMLElement(name xml.Name, attr []xml.Attr, children []RawXMLValue) *RawXMLValue

NewRawXMLElement creates a new RawXMLValue for an element.

func (*RawXMLValue) Decode

func (val *RawXMLValue) Decode(v interface{}) error

func (*RawXMLValue) MarshalXML

func (val *RawXMLValue) MarshalXML(e *xml.Encoder, start xml.StartElement) error

MarshalXML implements xml.Marshaler.

func (*RawXMLValue) TokenReader

func (val *RawXMLValue) TokenReader() xml.TokenReader

TokenReader returns a stream of tokens for the XML value.

func (*RawXMLValue) UnmarshalXML

func (val *RawXMLValue) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error

UnmarshalXML implements xml.Unmarshaler.

func (*RawXMLValue) XMLName

func (val *RawXMLValue) XMLName() (name xml.Name, ok bool)

type Remove

type Remove struct {
	XMLName xml.Name `xml:"DAV: remove"`
	Prop    Prop     `xml:"prop"`
}

https://tools.ietf.org/html/rfc4918#section-14.23

type ResourceType

type ResourceType struct {
	XMLName xml.Name      `xml:"DAV: resourcetype"`
	Raw     []RawXMLValue `xml:",any"`
}

https://tools.ietf.org/html/rfc4918#section-15.9

func NewResourceType

func NewResourceType(names ...xml.Name) *ResourceType

func (*ResourceType) Is

func (t *ResourceType) Is(name xml.Name) bool

type Response

type Response struct {
	XMLName             xml.Name   `xml:"DAV: response"`
	Hrefs               []Href     `xml:"href"`
	PropStats           []PropStat `xml:"propstat,omitempty"`
	ResponseDescription string     `xml:"responsedescription,omitempty"`
	Status              *Status    `xml:"status,omitempty"`
	Error               *Error     `xml:"error,omitempty"`
	Location            *Location  `xml:"location,omitempty"`
}

https://tools.ietf.org/html/rfc4918#section-14.24

func NewErrorResponse added in v0.4.0

func NewErrorResponse(path string, err error) *Response

func NewOKResponse

func NewOKResponse(path string) *Response

func NewPropFindResponse added in v0.4.0

func NewPropFindResponse(path string, propfind *PropFind, props map[xml.Name]PropFindFunc) (*Response, error)

func (*Response) DecodeProp

func (resp *Response) DecodeProp(values ...interface{}) error

func (*Response) EncodeProp

func (resp *Response) EncodeProp(code int, v interface{}) error

func (*Response) Err added in v0.4.0

func (resp *Response) Err() error

func (*Response) Path

func (resp *Response) Path() (string, error)

type Set

type Set struct {
	XMLName xml.Name `xml:"DAV: set"`
	Prop    Prop     `xml:"prop"`
}

https://tools.ietf.org/html/rfc4918#section-14.26

type Status

type Status struct {
	Code int
	Text string
}

func (*Status) Err

func (s *Status) Err() error

func (*Status) MarshalText

func (s *Status) MarshalText() ([]byte, error)

func (*Status) UnmarshalText

func (s *Status) UnmarshalText(b []byte) error

type SyncCollectionQuery added in v0.3.1

type SyncCollectionQuery struct {
	XMLName   xml.Name `xml:"DAV: sync-collection"`
	SyncToken string   `xml:"sync-token"`
	Limit     *Limit   `xml:"limit,omitempty"`
	SyncLevel string   `xml:"sync-level"`
	Prop      *Prop    `xml:"prop"`
}

https://tools.ietf.org/html/rfc6578#section-6.1

type Time

type Time time.Time

func (*Time) MarshalText

func (t *Time) MarshalText() ([]byte, error)

func (*Time) UnmarshalText

func (t *Time) UnmarshalText(b []byte) error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL