/** * WebDAV PROPPATCH * * This method is called to update properties on a Node. The request is an XML body with all the mutations. * In this XML body it is specified which properties should be set/updated and/or deleted * * @param RequestInterface $request * @param ResponseInterface $response * @return bool */ function httpPropPatch(RequestInterface $request, ResponseInterface $response) { $path = $request->getPath(); $newProperties = $this->server->parsePropPatchRequest($request->getBodyAsString()); $result = $this->server->updateProperties($path, $newProperties); $prefer = $this->server->getHTTPPrefer(); $response->setHeader('Vary', 'Brief,Prefer'); if ($prefer['return-minimal']) { // If return-minimal is specified, we only have to check if the // request was succesful, and don't need to return the // multi-status. $ok = true; foreach ($result as $prop => $code) { if ((int) $code > 299) { $ok = false; } } if ($ok) { $response->setStatus(204); return false; } } $response->setStatus(207); $response->setHeader('Content-Type', 'application/xml; charset=utf-8'); // Reorganizing the result for generateMultiStatus $multiStatus = []; foreach ($result as $propertyName => $code) { if (isset($multiStatus[$code])) { $multiStatus[$code][$propertyName] = null; } else { $multiStatus[$code] = [$propertyName => null]; } } $multiStatus['href'] = $path; $response->setBody($this->server->generateMultiStatus([$multiStatus])); // Sending back false will interupt the event chain and tell the server // we've handled this method. return false; }