src/server/webdav/webdav.c

changeset 412
a4e2ce073c0f
parent 396
77d81f2bb9f7
child 414
99a34860c105
equal deleted inserted replaced
411:bbd82eee568e 412:a4e2ce073c0f
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)) {
459 } 472 }
460 } 473 }
461 474
462 UcxBuffer *reqbody = rqbody2buffer(sn, rq); 475 UcxBuffer *reqbody = rqbody2buffer(sn, rq);
463 if(!reqbody) { 476 if(!reqbody) {
477 // most likely OOM
464 return REQ_ABORTED; 478 return REQ_ABORTED;
465 } 479 }
466 480
467 int error = 0; 481 int error = 0;
468 WebdavProppatchRequest *proppatch = proppatch_parse( 482 WebdavProppatchRequest *proppatch = proppatch_parse(
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

mercurial