//PROPFIND public int PropFind() { if (_webDavKind == WebDavKind.Non) { return(500); } if (_targetKind == TargetKind.Non) { return(404); } if (_depth == Depth.Null) { _depth = Depth.DepthInfinity;//指定されない場合は、「infinity」とする RFC2518(8.1 PROPFIND) } const int responseCode = 207; //PROPFINDの情報を蓄積してレスポンスを生成するクラス var propFindResponce = new PropFindResponce(_webDavDb); //if(target.Kind == TARGET_KIND.DIR) {//1コレクションのプロパテイ値の取得 if (_targetKind == TargetKind.Dir) //1コレクションのプロパテイ値の取得 { const bool isCollection = true; //コレクション var di = new DirectoryInfo(_fullPath); propFindResponce.Add(isCollection, di.Name, _hrefHost, _hrefUri, "", //contentType "", //etag 0, //Directoryのサイズは0で初期化する di.CreationTime, di.LastWriteTime); if (_depth != Depth.Depth0) { //直下のリソースのプロパテイ値の取得 FindAll(propFindResponce, _depth, _hrefHost, _hrefUri, _fullPath, _useEtag); } } else //1リソースのプロパテイ値の取得 { const bool isCollection = false; //非コレクション var info = new FileInfo(_fullPath); propFindResponce.Add(isCollection, info.Name, _hrefHost, _hrefUri, _contentType.Get(_fullPath), _useEtag ? WebServerUtil.Etag(info) : "", info.Length, info.CreationTime, info.LastWriteTime); } //レスポンス作成 _document.CreateFromXml(propFindResponce.ToString()); return(responseCode); }
//階層下リソースのプロパティ値の取得 void FindAll(PropFindResponce propFindResponce, Depth depth, string hrefHost, string hrefUri, string path, bool useEtag) { if (hrefUri.Length > 1 && hrefUri[hrefUri.Length - 1] != '/') { hrefUri = hrefUri + "/"; } var di = new DirectoryInfo(path); var isCollection = true; foreach (DirectoryInfo info in di.GetDirectories("*.*")) { propFindResponce.Add(isCollection, info.Name, hrefHost, hrefUri + info.Name + "/", "", //contentType "", //etag 0, //Directoryのサイズは0で初期化する info.CreationTime, info.LastWriteTime); if (depth == Depth.DepthInfinity) { //さらに階層下を再帰処理 string newPath = path + info.Name; if (path[path.Length - 1] != '\\') { newPath = path + "\\" + info.Name; } FindAll(propFindResponce, depth, hrefHost, hrefUri + info.Name + "/", newPath, useEtag); } } isCollection = false; foreach (FileInfo info in di.GetFiles("*.*")) { propFindResponce.Add(isCollection, info.Name, hrefHost, hrefUri + info.Name, _contentType.Get(info.Name), useEtag ? WebServerUtil.Etag(info) : "", //Etag info.Length, info.CreationTime, info.LastWriteTime); } }
//階層下リソースのプロパティ値の取得 void FindAll(PropFindResponce propFindResponce, Depth depth, string hrefHost, string hrefUri, string path, bool useEtag) { if (hrefUri.Length > 1 && hrefUri[hrefUri.Length - 1] != '/') { hrefUri = hrefUri + "/"; } var di = new DirectoryInfo(path); var isCollection = true; foreach (DirectoryInfo info in di.GetDirectories("*.*")) { propFindResponce.Add(isCollection, info.Name, hrefHost, hrefUri + info.Name + "/", "", //contentType "", //etag 0, //Directoryのサイズは0で初期化する info.CreationTime, info.LastWriteTime); if (depth == Depth.DepthInfinity) { //さらに階層下を再帰処理 string newPath = path + info.Name; if (path[path.Length - 1] != '\\') newPath = path + "\\" + info.Name; FindAll(propFindResponce, depth, hrefHost, hrefUri + info.Name + "/", newPath, useEtag); } } isCollection = false; foreach (FileInfo info in di.GetFiles("*.*")) { propFindResponce.Add(isCollection, info.Name, hrefHost, hrefUri + info.Name, _contentType.Get(info.Name), useEtag ? WebServerUtil.Etag(info) : "", //Etag info.Length, info.CreationTime, info.LastWriteTime); } }
//PROPFIND public int PropFind() { if (_webDavKind == WebDavKind.Non) return 500; if (_targetKind == TargetKind.Non) return 404; if (_depth == Depth.Null) _depth = Depth.DepthInfinity;//指定されない場合は、「infinity」とする RFC2518(8.1 PROPFIND) const int responseCode = 207; //PROPFINDの情報を蓄積してレスポンスを生成するクラス var propFindResponce = new PropFindResponce(_webDavDb); //if(target.Kind == TARGET_KIND.DIR) {//1コレクションのプロパテイ値の取得 if (_targetKind == TargetKind.Dir) { //1コレクションのプロパテイ値の取得 const bool isCollection = true; //コレクション var di = new DirectoryInfo(_fullPath); propFindResponce.Add(isCollection, di.Name, _hrefHost, _hrefUri, "", //contentType "", //etag 0, //Directoryのサイズは0で初期化する di.CreationTime, di.LastWriteTime); if (_depth != Depth.Depth0) { //直下のリソースのプロパテイ値の取得 FindAll(propFindResponce, _depth, _hrefHost, _hrefUri, _fullPath, _useEtag); } } else { //1リソースのプロパテイ値の取得 const bool isCollection = false; //非コレクション var info = new FileInfo(_fullPath); propFindResponce.Add(isCollection, info.Name, _hrefHost, _hrefUri, _contentType.Get(_fullPath), _useEtag ? WebServerUtil.Etag(info) : "", info.Length, info.CreationTime, info.LastWriteTime); } //レスポンス作成 _document.CreateFromXml(propFindResponce.ToString()); return responseCode; }