Caldav: Process request before sending response to avoid sending headers twice on error

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1217 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2010-07-20 09:53:47 +00:00
parent 173fa38526
commit efcb9bfa74
1 changed files with 22 additions and 11 deletions

View File

@ -384,9 +384,7 @@ public class CaldavConnection extends AbstractConnection {
* @return Exchange folder object
* @throws IOException on error
*/
public ExchangeSession.Folder appendFolder(CaldavResponse response, CaldavRequest request, String subFolder) throws IOException {
ExchangeSession.Folder folder = session.getFolder(request.getFolderPath(subFolder));
public ExchangeSession.Folder appendFolder(CaldavResponse response, CaldavRequest request, ExchangeSession.Folder folder, String subFolder) throws IOException {
response.startResponse(URIUtil.encodePath(request.getPath(subFolder)));
response.startPropstat();
@ -582,19 +580,32 @@ public class CaldavConnection extends AbstractConnection {
*/
public void sendFolder(CaldavRequest request) throws IOException {
String folderPath = request.getFolderPath();
// process request before sending response to avoid sending headers twice on error
ExchangeSession.Folder folder = session.getFolder(request.getFolderPath(null));
List<ExchangeSession.Contact> contacts = null;
List<ExchangeSession.Event> events = null;
List<ExchangeSession.Folder> folderList = null;
if (folder.isContact()) {
contacts = session.getAllContacts(folderPath);
} else {
events = session.getAllEvents(folderPath);
if (!folderPath.startsWith("/public")) {
folderList = session.getSubCalendarFolders(folderPath, false);
}
}
CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS);
response.startMultistatus();
ExchangeSession.Folder folder = appendFolder(response, request, null);
appendFolder(response, request, folder, null);
if (request.getDepth() == 1) {
if (folder.isContact()) {
appendContactsResponses(response, request, session.getAllContacts(folderPath));
appendContactsResponses(response, request, contacts);
} else {
appendEventsResponses(response, request, session.getAllEvents(folderPath));
appendEventsResponses(response, request, events);
// Send sub folders for multi-calendar support under iCal, except for public folders
if (!folderPath.startsWith("/public")) {
List<ExchangeSession.Folder> folderList = session.getSubCalendarFolders(folderPath, false);
if (folderList != null) {
for (ExchangeSession.Folder subFolder : folderList) {
appendFolder(response, request, subFolder.folderPath.substring(subFolder.folderPath.indexOf('/') + 1));
appendFolder(response, request, subFolder, subFolder.folderPath.substring(subFolder.folderPath.indexOf('/') + 1));
}
}
}
@ -731,8 +742,8 @@ public class CaldavConnection extends AbstractConnection {
if (request.getDepth() == 1) {
appendInbox(response, request, "inbox");
appendOutbox(response, request, "outbox");
appendFolder(response, request, "calendar");
appendFolder(response, request, "contacts");
appendFolder(response, request, session.getFolder(request.getFolderPath("calendar")), "calendar");
appendFolder(response, request, session.getFolder(request.getFolderPath("contacts")), "contacts");
}
response.endResponse();
response.endMultistatus();