MCPcopy Create free account
hub / github.com/OpenListTeam/OpenList / confirmLocks

Method confirmLocks

server/webdav/webdav.go:122–193  ·  view source on GitHub ↗
(r *http.Request, src, dst string)

Source from the content-addressed store, hash-verified

120}
121
122func (h *Handler) confirmLocks(r *http.Request, src, dst string) (release func(), status int, err error) {
123 hdr := r.Header.Get("If")
124 if hdr == "" {
125 // An empty If header means that the client hasn't previously created locks.
126 // Even if this client doesn't care about locks, we still need to check that
127 // the resources aren't locked by another client, so we create temporary
128 // locks that would conflict with another client's locks. These temporary
129 // locks are unlocked at the end of the HTTP request.
130 now, srcToken, dstToken := time.Now(), "", ""
131 if src != "" {
132 srcToken, status, err = h.lock(now, src)
133 if err != nil {
134 return nil, status, err
135 }
136 }
137 if dst != "" {
138 dstToken, status, err = h.lock(now, dst)
139 if err != nil {
140 if srcToken != "" {
141 h.LockSystem.Unlock(now, srcToken)
142 }
143 return nil, status, err
144 }
145 }
146
147 return func() {
148 if dstToken != "" {
149 h.LockSystem.Unlock(now, dstToken)
150 }
151 if srcToken != "" {
152 h.LockSystem.Unlock(now, srcToken)
153 }
154 }, 0, nil
155 }
156
157 ih, ok := parseIfHeader(hdr)
158 if !ok {
159 return nil, http.StatusBadRequest, errInvalidIfHeader
160 }
161 // ih is a disjunction (OR) of ifLists, so any ifList will do.
162 for _, l := range ih.lists {
163 lsrc := l.resourceTag
164 if lsrc == "" {
165 lsrc = src
166 } else {
167 u, err := url.Parse(lsrc)
168 if err != nil {
169 continue
170 }
171 if u.Host != r.Host {
172 continue
173 }
174 lsrc, status, err = h.stripPrefix(u.Path)
175 if err != nil {
176 return nil, status, err
177 }
178 }
179 release, err = h.LockSystem.Confirm(time.Now(), lsrc, dst, l.conditions...)

Callers 5

handleDeleteMethod · 0.95
handlePutMethod · 0.95
handleMkcolMethod · 0.95
handleCopyMoveMethod · 0.95
handleProppatchMethod · 0.95

Calls 7

lockMethod · 0.95
stripPrefixMethod · 0.95
parseIfHeaderFunction · 0.85
GetMethod · 0.65
NowMethod · 0.65
UnlockMethod · 0.65
ConfirmMethod · 0.65

Tested by

no test coverage detected