/* 这个函数是webdav的辅助函数。 检查webdav的destination头,把destination解析,别名映射检查,并检查扩展映射。 如果成功,则会把注册变量DAV_DESTINATION,映射到物理地址上。 */ bool make_webdav_destination_env(KHttpRequest *rq, KRedirect *rd, KEnvInterface *env, bool chrooted) { bool make_result = false; size_t skip_length = 0; if (chrooted && rq->svh) { skip_length = rq->svh->vh->doc_root.size() - 1; } KHttpHeader *av = rq->parser.getHeaders(); while (av) { if (is_attr(av, "Destination")) { KUrl url; memset(&url, 0, sizeof(url)); char *val = xstrdup(av->val); url_decode(val, 0, &url); if (parse_url(val, &url)) { KFileName file; char *tripedDir = file.tripDir2(url.path, PATH_SPLIT_CHAR); char *new_path = rq->svh->vh->alias(TEST(rq->workModel,WORK_MODEL_INTERNAL)>0,tripedDir); //bool result; if (new_path) { file.giveName(new_path); } else { file.setName(rq->svh->vh->doc_root.c_str(), tripedDir, rq->getFollowLink()); } xfree(tripedDir); if (rq->svh->vh->isPathRedirect(rq, &file, true, rd)) { //todo register env env->addEnv("DAV_DESTINATION", file.getName() + skip_length); make_result = true; } } url.destroy(); xfree(val); break; } av = av->next; } return make_result; }