447 |
447 |
448 return ret; |
448 return ret; |
449 } |
449 } |
450 |
450 |
451 |
451 |
|
452 static const char* proppatch_error2str(int error) { |
|
453 switch(error) { |
|
454 case PROPPATCH_PARSER_OK: return "ok"; |
|
455 case PROPPATCH_PARSER_NO_PROPERTYUPDATE: return "no property update"; |
|
456 case PROPPATCH_PARSER_NO_PROPERTIES: return "no properties"; |
|
457 case PROPPATCH_PARSER_INVALID_REQUEST: return "invalid proppatch request"; |
|
458 case PROPPATCH_PARSER_DUPLICATE: return "proppatch property duplicate"; |
|
459 case PROPPATCH_PARSER_OOM: return "OOM"; |
|
460 case PROPPATCH_PARSER_ERROR: return "proppatch parser error"; |
|
461 } |
|
462 return "error"; |
|
463 } |
|
464 |
452 int webdav_proppatch(pblock *pb, Session *sn, Request *rq) { |
465 int webdav_proppatch(pblock *pb, Session *sn, Request *rq) { |
453 char *expect = pblock_findkeyval(pb_key_expect, rq->headers); |
466 char *expect = pblock_findkeyval(pb_key_expect, rq->headers); |
454 if(expect) { |
467 if(expect) { |
455 if(!strcasecmp(expect, "100-continue")) { |
468 if(!strcasecmp(expect, "100-continue")) { |
456 if(http_send_continue(sn)) { |
469 if(http_send_continue(sn)) { |
471 reqbody->space, |
485 reqbody->space, |
472 reqbody->size, |
486 reqbody->size, |
473 &error); |
487 &error); |
474 ucx_buffer_free(reqbody); |
488 ucx_buffer_free(reqbody); |
475 if(!proppatch) { |
489 if(!proppatch) { |
476 switch(error) { |
490 log_ereport(LOG_FAILURE, "webdav-proppatch: %s", proppatch_error2str(error)); |
477 // TODO: handle all errors |
491 return REQ_ABORTED; |
478 default: return REQ_ABORTED; |
|
479 } |
|
480 } |
492 } |
481 |
493 |
482 WebdavBackend *dav = rq->davCollection ? |
494 WebdavBackend *dav = rq->davCollection ? |
483 rq->davCollection : &default_backend; |
495 rq->davCollection : &default_backend; |
484 |
496 |
508 |
520 |
509 int ret = REQ_PROCEED; |
521 int ret = REQ_PROCEED; |
510 |
522 |
511 // Execute proppatch |
523 // Execute proppatch |
512 if(webdav_op_proppatch(op, uri, path)) { |
524 if(webdav_op_proppatch(op, uri, path)) { |
|
525 log_ereport(LOG_FAILURE, "webdav-proppatch: proppatch operation failed"); |
513 ret = REQ_ABORTED; |
526 ret = REQ_ABORTED; |
514 } |
527 } |
515 |
528 |
516 // send response |
529 // send response |
517 if(ret == REQ_PROCEED && multistatus_send(ms, sn->csd)) { |
530 if(ret == REQ_PROCEED) { |
518 ret = REQ_ABORTED; |
531 if(multistatus_send(ms, sn->csd)) { |
519 // TODO: log error |
532 log_ereport(LOG_FAILURE, "webdav-proppatch: multistatus_send failed"); |
|
533 } |
520 } else { |
534 } else { |
521 // TODO: error response |
535 protocol_status(sn, rq, 500, NULL); |
522 } |
536 } |
523 |
537 |
524 // cleanup |
538 // cleanup |
525 xmlFreeDoc(proppatch->doc); |
539 xmlFreeDoc(proppatch->doc); |
526 |
540 |