From: Lanius Trolling Date: Sun, 5 May 2024 16:14:01 +0000 (-0400) Subject: Implement PROPPATCH method for WebDAV X-Git-Url: https://gitweb.starshipfights.net/?a=commitdiff_plain;h=56675e4bc8ec42f023abaedda057cb4e4b73d629;p=factbooks Implement PROPPATCH method for WebDAV --- diff --git a/src/jvmMain/kotlin/info/mechyrdia/route/ResourceWebDav.kt b/src/jvmMain/kotlin/info/mechyrdia/route/ResourceWebDav.kt index fcba745..36de95b 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/route/ResourceWebDav.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/route/ResourceWebDav.kt @@ -120,6 +120,16 @@ suspend fun getWebDavProperties(path: StoragePath, webRoot: String, depth: Int = } } +fun > C.webDavPropPatchResult(path: StoragePath, webRoot: String) = declaration() + .root("multistatus", namespace = "DAV:") { + "response" { + "href" { +"${webRoot.removeSuffix("/")}/$path".removeSuffix("/") } + "propstat" { + "status" { +"HTTP/1.1 200 OK" } + } + } + } + suspend fun FileStorage.copyWebDav(source: StoragePath, target: StoragePath): Boolean { return when (getType(source)) { StoredFileType.DIRECTORY -> createDir(target) && (listDir(source) @@ -199,6 +209,18 @@ suspend fun ApplicationCall.webDavPropFind(path: StoragePath) { } } +suspend fun ApplicationCall.webDavPropPatch(path: StoragePath) { + beforeWebDav() + + val exists = FileStorage.instance.getType(path) != null + if (exists) + respondXml(status = HttpStatusCode.MultiStatus) { + webDavPropPatchResult(path, WebDavDomainName) + } + else + respond(HttpStatusCode.NotFound) +} + suspend fun ApplicationCall.webDavGet(path: StoragePath) { beforeWebDav() @@ -343,6 +365,7 @@ fun Route.installWebDav() { route("{path...}") { method(HttpMethod.parse("OPTIONS")) { handle { call.webDavOptions() } } method(HttpMethod.parse("PROPFIND")) { handle { call.webDavPropFind(call.webDavPath) } } + method(HttpMethod.parse("PROPPATCH")) { handle { call.webDavPropPatch(call.webDavPath) } } method(HttpMethod.parse("GET")) { handle { call.webDavGet(call.webDavPath) } } method(HttpMethod.parse("MKCOL")) { handle { call.webDavMkCol(call.webDavPath) } } method(HttpMethod.parse("PUT")) { handle { call.webDavPut(call.webDavPath) } }