얼마 전에 WebDAV에 대해 포스팅한 것을 보면 톰캣을 이용해 서비스를 하는 것이다. 톰캣(7.0.37)을 이용하여 서비스를 하면 WebdavServlet이라는 서블릿을 이용하게 되는데 윈도우7에서 WebDAV에 붙어 사용할 때 파일복사가 안되는 문제가 발생한다. CentOS의 보안설정 문제인가 싶어서 Apache 서버를 올려서 테스트 해보았다. 아파치에 붙을 때는 파일복사가 좀 불안하긴 하지만 성공적으로 되었다. 즉 OS단의 문제는 아니였다. WebDAV를 구현하는 톰캣의 Webdavservlet이 문제인 것이다.

그래서 구글링을 했는데, 톰캣 소스의 WebdavServlet.java 파일을 수정하면 된다고 했다. 코드를 보니 좀 쌩뚱맞게 xml를 response에 뿌려주는데 수정하고 컴파일하고 적용해 보니 파일복사가 되었다.


수정하는 절차는 다음과 같다.

1. http://tomcat.apache.org/download-70.cgi 에서 톰캣의 소스를 다운받는다. 포스팅하는 시점의 버전은 7.0.37이다.

2. 임의의 폴더에 압축을 푼다.

3. org.apache.tomcat.servlets 패키지의 WebdavServlet.java 파일을 편집기로 열고 다음과 같이 doProppatch(HttpServletRequest req, HttpServletResponse resp) 메소드를 수정한다. 수정되는 부분은 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); 부분을 주석처리하고 다른 로직을 넣는 부분이다.

/**
* do not return default response
*/
//resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
/**
 * ========== ALL NEW CODE ==========
 * create multi-status response for three basic windows properties:
 * Win32CreationTime, Win32LastAccessTime, Win32LastModifiedTime
 */
XMLWriter generatedXML = new XMLWriter();
generatedXML.writeXMLHeader();
generatedXML.writeElement("D", DEFAULT_NAMESPACE,"multistatus", XMLWriter.OPENING);
generatedXML.writeElement("D", "response",XMLWriter.OPENING);
generatedXML.writeElement("D", "href",XMLWriter.OPENING);
generatedXML.writeText(req.getRequestURI());
generatedXML.writeElement("D", "href",XMLWriter.CLOSING);
generatedXML.writeElement("D", "propstat",XMLWriter.OPENING);
generatedXML.writeElement("D", "status",XMLWriter.OPENING);
//generatedXML.writeText("HTTP/1.1 " + WebdavStatus.SC_FAILED_DEPENDENCY + " " + WebdavStatus.getStatusText(WebdavStatus.SC_FAILED_DEPENDENCY));
generatedXML.writeElement("D", "status",XMLWriter.CLOSING);
generatedXML.writeElement("D", "prop",XMLWriter.OPENING);
generatedXML.writeText ("<n3:Win32CreationTime/><n3:Win32LastAccessTime/><n3:Win32LastModifiedTime/>");
generatedXML.writeElement("D", "prop",XMLWriter.CLOSING);
generatedXML.writeElement("D", "propstat",XMLWriter.CLOSING);
generatedXML.writeElement("D", "response",XMLWriter.CLOSING);
generatedXML.writeElement("D", "multistatus",XMLWriter.CLOSING);
Writer writer = resp.getWriter();
writer.write(generatedXML.toString());
writer.close();

4. jdk 1.6 환경하에서 ant를 이용해 빌드한다.

5. 소스파일을 압축해제한 곳에서 output/build/lib 폴더를 보면 catalina.jar 파일이 보인다. 이를 톰캣의 lib 폴더에 복사하고 WebDAV를 테스트해본다.


혹시 모르니 WebdavServlet.java 파일을 첨부하니 참고하면 되겠다.

WebdavServlet.java

 

참고사이트 : http://www.armedia.com/blog/2012/08/webdav-and-windows-7-adventure

위 소스파일은 참고사이트에서 가져와서 오류나는 부분을 주석처리한 것이다. 그러니 참고사이트의 코드와는 조금 다른 부분이 있을 것이다. 참고하시기 바란다.


저작자 표시 비영리 변경 금지
신고
Posted by Life 스토리