| 52 | } |
| 53 | |
| 54 | func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
| 55 | status, err := http.StatusBadRequest, errUnsupportedMethod |
| 56 | brw := newBufferedResponseWriter() |
| 57 | useBufferedWriter := true |
| 58 | if h.LockSystem == nil { |
| 59 | status, err = http.StatusInternalServerError, errNoLockSystem |
| 60 | } else { |
| 61 | switch r.Method { |
| 62 | case "OPTIONS": |
| 63 | status, err = h.handleOptions(brw, r) |
| 64 | case "GET", "HEAD", "POST": |
| 65 | useBufferedWriter = false |
| 66 | Writer := &common.WrittenResponseWriter{ResponseWriter: w} |
| 67 | status, err = h.handleGetHeadPost(Writer, r) |
| 68 | if status != 0 && Writer.IsWritten() { |
| 69 | status = 0 |
| 70 | } |
| 71 | case "DELETE": |
| 72 | status, err = h.handleDelete(brw, r) |
| 73 | case "PUT": |
| 74 | status, err = h.handlePut(brw, r) |
| 75 | case "MKCOL": |
| 76 | status, err = h.handleMkcol(brw, r) |
| 77 | case "COPY", "MOVE": |
| 78 | status, err = h.handleCopyMove(brw, r) |
| 79 | case "LOCK": |
| 80 | status, err = h.handleLock(brw, r) |
| 81 | case "UNLOCK": |
| 82 | status, err = h.handleUnlock(brw, r) |
| 83 | case "PROPFIND": |
| 84 | status, err = h.handlePropfind(brw, r) |
| 85 | // if there is a error for PROPFIND, we should be as an empty folder to the client |
| 86 | if err != nil { |
| 87 | status = http.StatusNotFound |
| 88 | } |
| 89 | case "PROPPATCH": |
| 90 | status, err = h.handleProppatch(brw, r) |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | if status != 0 { |
| 95 | w.WriteHeader(status) |
| 96 | if status != http.StatusNoContent { |
| 97 | w.Write([]byte(StatusText(status))) |
| 98 | } |
| 99 | } else if useBufferedWriter { |
| 100 | brw.WriteToResponse(w) |
| 101 | } |
| 102 | if h.Logger != nil && err != nil { |
| 103 | h.Logger(r, err) |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | func (h *Handler) lock(now time.Time, root string) (token string, status int, err error) { |
| 108 | token, err = h.LockSystem.Create(now, LockDetails{ |