📄 abstractwebdavservlet.java
字号:
return; } long modSince = request.getDateHeader("If-Modified-Since"); if (modSince > IOUtil.UNDEFINED_TIME) { long modTime = resource.getModificationTime(); // test if resource has been modified. note that formatted modification // time lost the milli-second precision if (modTime != IOUtil.UNDEFINED_TIME && (modTime / 1000 * 1000) <= modSince) { // resource has not been modified since the time indicated in the // 'If-Modified-Since' header. response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); return; } } // spool resource properties and ev. resource content. OutputStream out = (sendContent) ? response.getOutputStream() : null; resource.spool(getOutputContext(response, out)); response.flushBuffer(); } /** * The PROPFIND method * * @param request * @param response * @param resource * @throws IOException */ protected void doPropFind(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { if (!resource.exists()) { response.sendError(DavServletResponse.SC_NOT_FOUND); return; } int depth = request.getDepth(DEPTH_INFINITY); DavPropertyNameSet requestProperties = request.getPropFindProperties(); int propfindType = request.getPropFindType(); MultiStatus mstatus = new MultiStatus(); mstatus.addResourceProperties(resource, requestProperties, propfindType, depth); response.sendMultiStatus(mstatus); } /** * The PROPPATCH method * * @param request * @param response * @param resource * @throws IOException */ protected void doPropPatch(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { List changeList = request.getPropPatchChangeList(); if (changeList.isEmpty()) { response.sendError(DavServletResponse.SC_BAD_REQUEST); return; } MultiStatus ms = new MultiStatus(); MultiStatusResponse msr = resource.alterProperties(changeList); ms.addResponse(msr); response.sendMultiStatus(ms); } /** * The POST method. Delegate to PUT * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doPost(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { doPut(request, response, resource); } /** * The PUT method * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doPut(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { DavResource parentResource = resource.getCollection(); if (parentResource == null || !parentResource.exists()) { // parent does not exist response.sendError(DavServletResponse.SC_CONFLICT); return; } int status; // test if resource already exists if (resource.exists()) { status = DavServletResponse.SC_NO_CONTENT; } else { status = DavServletResponse.SC_CREATED; } parentResource.addMember(resource, getInputContext(request, request.getInputStream())); response.setStatus(status); } /** * The MKCOL method * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doMkCol(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { DavResource parentResource = resource.getCollection(); if (parentResource == null || !parentResource.exists() || !parentResource.isCollection()) { // parent does not exist or is not a collection response.sendError(DavServletResponse.SC_CONFLICT); return; } // shortcut: mkcol is only allowed on deleted/non-existing resources if (resource.exists()) { response.sendError(DavServletResponse.SC_METHOD_NOT_ALLOWED); } if (request.getContentLength() > 0 || request.getHeader("Transfer-Encoding") != null) { parentResource.addMember(resource, getInputContext(request, request.getInputStream())); } else { parentResource.addMember(resource, getInputContext(request, null)); } response.setStatus(DavServletResponse.SC_CREATED); } /** * The DELETE method * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doDelete(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { DavResource parent = resource.getCollection(); if (parent != null) { parent.removeMember(resource); response.setStatus(DavServletResponse.SC_NO_CONTENT); } else { response.sendError(DavServletResponse.SC_FORBIDDEN, "Cannot remove the root resource."); } } /** * The COPY method * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doCopy(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { // only depth 0 and infinity is allowed int depth = request.getDepth(DEPTH_INFINITY); if (!(depth == DEPTH_0 || depth == DEPTH_INFINITY)) { response.sendError(DavServletResponse.SC_BAD_REQUEST); return; } DavResource destResource = getResourceFactory().createResource(request.getDestinationLocator(), request, response); int status = validateDestination(destResource, request); if (status > DavServletResponse.SC_NO_CONTENT) { response.sendError(status); return; } resource.copy(destResource, depth == DEPTH_0); response.setStatus(status); } /** * The MOVE method * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doMove(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { DavResource destResource = getResourceFactory().createResource(request.getDestinationLocator(), request, response); int status = validateDestination(destResource, request); if (status > DavServletResponse.SC_NO_CONTENT) { response.sendError(status); return; } resource.move(destResource); response.setStatus(status); } /** * Validate the given destination resource and return the proper status * code: Any return value greater/equal than {@link DavServletResponse#SC_NO_CONTENT} * indicates an error. * * @param destResource destination resource to be validated. * @param request * @return status code indicating whether the destination is valid. */ private int validateDestination(DavResource destResource, WebdavRequest request) throws DavException { String destHeader = request.getHeader(HEADER_DESTINATION); if (destHeader == null || "".equals(destHeader)) { return DavServletResponse.SC_BAD_REQUEST; } if (destResource.getLocator().equals(request.getRequestLocator())) { return DavServletResponse.SC_FORBIDDEN; } int status; if (destResource.exists()) { if (request.isOverwrite()) { // matching if-header required for existing resources if (!request.matchesIfHeader(destResource)) { return DavServletResponse.SC_PRECONDITION_FAILED; } else { // overwrite existing resource destResource.getCollection().removeMember(destResource); status = DavServletResponse.SC_NO_CONTENT; } } else { // cannot copy/move to an existing item, if overwrite is not forced return DavServletResponse.SC_PRECONDITION_FAILED; } } else { // destination does not exist >> copy/move can be performed status = DavServletResponse.SC_CREATED; } return status; } /** * The LOCK method * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doLock(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { LockInfo lockInfo = request.getLockInfo(); if (lockInfo.isRefreshLock()) { // refresh any matching existing locks ActiveLock[] activeLocks = resource.getLocks(); List lList = new ArrayList(); for (int i = 0; i < activeLocks.length; i++) { // adjust lockinfo with type/scope retrieved from the lock. lockInfo.setType(activeLocks[i].getType()); lockInfo.setScope(activeLocks[i].getScope()); DavProperty etagProp = resource.getProperty(DavPropertyName.GETETAG); String etag = etagProp != null ? String.valueOf(etagProp.getValue()) : ""; if (request.matchesIfHeader(resource.getHref(), activeLocks[i].getToken(), etag)) { lList.add(resource.refreshLock(lockInfo, activeLocks[i].getToken())); } } if (lList.isEmpty()) { throw new DavException(DavServletResponse.SC_PRECONDITION_FAILED); } ActiveLock[] refreshedLocks = (ActiveLock[]) lList.toArray(new ActiveLock[lList.size()]); response.sendRefreshLockResponse(refreshedLocks); } else { // create a new lock ActiveLock lock = resource.lock(lockInfo); response.sendLockResponse(lock); } } /** * The UNLOCK method * * @param request * @param response * @param resource * @throws DavException */ protected void doUnlock(WebdavRequest request, WebdavResponse response, DavResource resource) throws DavException { // get lock token from header String lockToken = request.getLockToken(); TransactionInfo tInfo = request.getTransactionInfo(); if (tInfo != null) { ((TransactionResource) resource).unlock(lockToken, tInfo); } else { resource.unlock(lockToken); } response.setStatus(DavServletResponse.SC_NO_CONTENT); } /** * The ORDERPATCH method * * @param request * @param response * @param resource * @throws java.io.IOException * @throws DavException */ protected void doOrderPatch(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { if (!(resource instanceof OrderingResource)) { response.sendError(DavServletResponse.SC_METHOD_NOT_ALLOWED); return; } OrderPatch op = request.getOrderPatch(); if (op == null) { response.sendError(DavServletResponse.SC_BAD_REQUEST); return; } // perform reordering of internal members ((OrderingResource) resource).orderMembers(op); response.setStatus(DavServletResponse.SC_OK); } /** * The SUBSCRIBE method * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doSubscribe(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { if (!(resource instanceof ObservationResource)) { response.sendError(DavServletResponse.SC_METHOD_NOT_ALLOWED); return; } SubscriptionInfo info = request.getSubscriptionInfo(); if (info == null) { response.sendError(DavServletResponse.SC_UNSUPPORTED_MEDIA_TYPE); return; } Subscription subs = ((ObservationResource) resource).subscribe(info, request.getSubscriptionId()); response.sendSubscriptionResponse(subs); } /** * The UNSUBSCRIBE method * * @param request * @param response * @param resource * @throws IOException * @throws DavException */ protected void doUnsubscribe(WebdavRequest request, WebdavResponse response,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -