/// <summary> /// get target, enum WikiFileType /// </summary> private static WikiFileType _WikiGetTarget(WikiRequestType type, string src) { switch (src) { case stDokuWiki.WikiEngine.WikiFile.wikiLocalPage: { return(((type == WikiRequestType.Put) || (type == WikiRequestType.Del)) ? WikiFileType.FileWriteMd : WikiFileType.FileReadMd ); } case stDokuWiki.WikiEngine.WikiFile.wikiLocalMedia: { return(((type == WikiRequestType.Put) || (type == WikiRequestType.Del)) ? WikiFileType.FileWriteBinary : WikiFileType.FileReadBinary ); } case stDokuWiki.WikiEngine.WikiFile.wikiLocalAttic: { return(((type == WikiRequestType.Put) || (type == WikiRequestType.Del)) ? WikiFileType.FileWriteAttic : WikiFileType.FileReadAttic ); } case stDokuWiki.WikiEngine.WikiFile.wikiLocalMeta: { return(((type == WikiRequestType.Put) || (type == WikiRequestType.Del)) ? WikiFileType.FileWriteMeta : WikiFileType.FileReadMeta ); } default: { return(WikiFileType.None); } } }
internal static WikiFileType WikiFileStringToType(WikiRequestType type, string src) { switch (src) { case WikiEngine.WikiFile.wikiLocalPage: { return(((type == WikiRequestType.Put) || (type == WikiRequestType.Del)) ? WikiFileType.FileWriteMd : WikiFileType.FileReadMd ); } case WikiEngine.WikiFile.wikiLocalMedia: { return(((type == WikiRequestType.Put) || (type == WikiRequestType.Del)) ? WikiFileType.FileWriteBinary : WikiFileType.FileReadBinary ); } case WikiEngine.WikiFile.wikiLocalAttic: { return(((type == WikiRequestType.Put) || (type == WikiRequestType.Del)) ? WikiFileType.FileWriteAttic : WikiFileType.FileReadAttic ); } case WikiEngine.WikiFile.wikiLocalMeta: { return(((type == WikiRequestType.Put) || (type == WikiRequestType.Del)) ? WikiFileType.FileWriteMeta : WikiFileType.FileReadMeta ); } default: { return(WikiFileType.None); } } }
public static byte[] WebWikiRouteTree(string url, Configuration conf, WikiFileMeta wfm = null) { try { List <string> urlPart = url.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries).Skip(1).ToList(); // Uri part, folders array switch (urlPart.Count) { case 0: { // root, get home page template // return Exception WikiHomePageException stCore.stConsole.WriteHeader("0: Count"); throw new WikiHomePageException(); } case 1: { // not complette request, // only WikiRequestType is set? switch (CoCWebSrv._WikiGetAction(urlPart[0])) { default: case WikiRequestType.None: { // get Exception Home page default (html template) // return Exception WikiHomePageException stCore.stConsole.WriteHeader("1: WikiRequestType.None:0"); _WikiGetHome(conf.WikiEngine, urlPart[0]); break; } case WikiRequestType.List: { // get page list default ? // return Md format txt stCore.stConsole.WriteHeader("1: WikiRequestType.List:0"); return(_WikiGetList(conf.WikiEngine, WikiFileType.FileReadMd, String.Empty)); } case WikiRequestType.Find: { // get find page default ? // return Md format txt stCore.stConsole.WriteHeader("1: WikiRequestType.Find:0"); throw new WikiSearchException("search pattern is empty"); } } break; } case 2: { // get List/Page/Media ? WikiRequestType wrt = CoCWebSrv._WikiGetAction(urlPart[0]); WikiFileType wft = CoCWebSrv._WikiGetTarget(wrt, urlPart[1]); switch (wrt) { default: case WikiRequestType.Del: case WikiRequestType.Put: case WikiRequestType.None: { // get Exception Home page default (html template) // return Exception WikiHomePageException stCore.stConsole.WriteHeader("2: _WikiGetHome"); _WikiGetHome( conf.WikiEngine, ((wft == WikiFileType.None) ? urlPart[1] : String.Empty) ); break; } case WikiRequestType.Find: { // get page list default ? stCore.stConsole.WriteHeader("2: _WikiFindList"); if ( ((wft == WikiFileType.None) && (string.IsNullOrWhiteSpace(urlPart[1]))) || (wft != WikiFileType.None) ) { throw new WikiSearchException("search pattern is empty"); } return(_WikiFindList( conf.WikiEngine, ((wft == WikiFileType.None) ? WikiFileType.FileReadMd : wft), urlPart[1] )); } case WikiRequestType.List: { // get page list default ? stCore.stConsole.WriteHeader("2: _WikiGetList"); return(_WikiGetList( conf.WikiEngine, ((wft == WikiFileType.None) ? WikiFileType.FileReadMd : wft), ((wft == WikiFileType.None) ? urlPart[1] : String.Empty) )); } case WikiRequestType.Get: { // get page/media default ? eturn start page stCore.stConsole.WriteHeader("2: _WikiGetFile"); return(_WikiGetFile( conf.WikiEngine, ((wft == WikiFileType.None) ? WikiFileType.FileReadMd : wft), ((wft == WikiFileType.None) ? urlPart[1] : String.Empty) )); } } break; } case 3: { WikiRequestType wrtAct = CoCWebSrv._WikiGetAction(urlPart[0]); WikiFileType wrtTarget = CoCWebSrv._WikiGetTarget(wrtAct, urlPart[1]); if ( (wrtAct == WikiRequestType.None) || (wrtTarget == WikiFileType.None) || (string.IsNullOrWhiteSpace(urlPart[2])) || (!urlPart[2].Contains(":")) ) { // error request param // return Exception WikiHomePageException _WikiGetHome(conf.WikiEngine, urlPart[2]); } List <string> wikiPart = urlPart[2].Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries).ToList(); switch (wikiPart.Count) { case 0: { // WikiRequestType and WikiFileType is valid, // namespace not found, return default switch (wrtAct) { case WikiRequestType.Get: { return(_WikiGetFile( conf.WikiEngine, wrtTarget, String.Empty )); } case WikiRequestType.Find: { if (string.IsNullOrWhiteSpace(urlPart[2])) { throw new WikiSearchException("search pattern is empty"); } return(_WikiFindList( conf.WikiEngine, wrtTarget, urlPart[2] )); } case WikiRequestType.List: { return(_WikiGetList( conf.WikiEngine, wrtTarget, String.Empty )); } case WikiRequestType.Put: case WikiRequestType.Del: { throw new WikiErrorPageException( string.Format( "not update, name space {0} incorrected", urlPart[2] ) ); } } break; } default: { // wikiPart.Count > 0 // namespace and page/file name switch (wrtAct) { case WikiRequestType.Get: { stCore.stConsole.WriteHeader("3:default _WikiGetFile: " + urlPart[2]); return(_WikiGetFile(conf.WikiEngine, wrtTarget, urlPart[2])); } case WikiRequestType.List: { stCore.stConsole.WriteHeader("3:default _WikiGetList: " + " : " + wrtTarget + " : " + urlPart[2]); return(_WikiGetList(conf.WikiEngine, wrtTarget, urlPart[2])); } case WikiRequestType.Find: { stCore.stConsole.WriteHeader("3:default _WikiFindList: " + " : " + wrtTarget + " : " + urlPart[2] + " : " + wikiPart[(wikiPart.Count - 1)]); int idx = (wikiPart.Count - 1); if ( (idx < 0) || (string.IsNullOrWhiteSpace(wikiPart[idx])) ) { throw new WikiSearchException("search pattern is empty, index: " + idx); } return(_WikiFindList( conf.WikiEngine, wrtTarget, wikiPart[idx] )); } case WikiRequestType.Put: case WikiRequestType.Del: { stCore.stConsole.WriteHeader("3:default _WikiPutFile: " + urlPart[2]); if (wfm == null) { throw new WikiErrorPageException( string.Format( "meta data is empty, not change", urlPart[2] ) ); } if (!wfm.IsAuth) { throw new WikiAuthException( string.Format( "Auth error, file not change", urlPart[2] ), wfm ); } return(_WikiPutFile(conf.WikiEngine, wrtTarget, urlPart[2], wfm)); } } break; } } break; } default: { _WikiGetHome(conf.WikiEngine, urlPart[0]); break; } } } catch (WikiErrorPageException e) { // error page WikiErrorPageException conf.ILog.LogError( string.Format( Properties.Resources.fmtMainError, string.Format(fmtClassName, "Wiki Parser"), e.GetType().Name, e.Message ) ); return(null); } catch (WikiHomePageException e) { // home page WikiHomePageException conf.ILog.LogError( string.Format( Properties.Resources.fmtMainError, string.Format(fmtClassName, "Wiki Parser"), e.GetType().Name, e.Message ) ); return(null); } #if DEBUG catch (Exception e) { conf.ILog.LogError( string.Format( Properties.Resources.fmtMainError, string.Format(fmtClassName, "Wiki Parser"), e.GetType().Name, e.Message ) ); #else catch (Exception) { #endif return(null); } return(null); }
/// <summary> /// Wiki Route tree (Web) /// return requested resource from wiki file system. /// </summary> /// <example> /// Uri: /wiki/get/pages|attic|media|meta/clan:test1 /// Uri: /wiki/put/pages|attic|media/clan:test1 /// Uri: /wiki/del/pages|attic|media/clan:test1 /// Uri: /wiki/list/pages|attic|media/clan: /// Uri: /wiki/find/part-of-serch-page-name /// enum <see cref="WikiEngine.WikiRequestType"/>WikiEngine.WikiRequestType: get|put|del|list|find /// enum <see cref="WikiEngine.WikiFileType"/>WikiEngine.WikiFileType: pages|attic|media|meta /// </example> /// <remarks> /// Example routing Uri: /// /// "/wiki/get/pages/clan:test1" OK /// "/wiki/get/clan:test1" OK /// "/wiki/clan:test1" -> HomeException /// "/wiki/clan:" -> HomeException /// "/wiki/" -> HomeException (redirect) /// /// "/wiki/list/pages/clan:" OK /// "/wiki/list/clan:" OK (default pages) /// "/wiki/list/" OK (default pages and default namespace) /// /// "/wiki/list/media/clan:" OK /// "/wiki/list/media/" OK (default namespace) /// /// "/wiki/find/pages/tes" OK /// "/wiki/find/media/tes" OK /// "/wiki/find/attic/tes" OK /// "/wiki/find/tes" OK (default pages and default namespace) /// /// </remarks> /// <exception cref="WikiEngine.Exceptions.WikiEngineAuthException">WikiEngineAuthException</exception> /// <exception cref="WikiEngine.Exceptions.WikiEngineSearchException">WikiEngineSearchException</exception> /// <exception cref="WikiEngine.Exceptions.WikiEngineHomePageException">WikiEngineHomePageException</exception> /// <exception cref="WikiEngine.Exceptions.WikiEngineErrorPageException">WikiEngineErrorPageException</exception> /// <exception cref="WikiEngine.Exceptions.WikiEngineNotImplementPageException">WikiEngineNotImplementPageException</exception> /// <param name="url">given raw url requested</param> /// <param name="wfm"><see cref="WikiEngine.WikiFileMeta"/>WikiEngine.WikiFileMeta</param> /// <returns>byte[] from requested source</returns> public byte [] RouteTree(string url, WikiFileMeta wfm = null) { try { List <string> urlPart = url.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries).Skip(1).ToList(); // Uri part, folders array switch (urlPart.Count) { case 0: { // root, get home page template // return Exception WikiHomePageException Console.WriteLine("0: Count"); throw new WikiEngine.Exceptions.WikiEngineHomePageException(); } case 1: { // command line: (/get | /put | /del | /list) // not complette request, // only WikiRequestType is set? switch (DokuUtil.WikiFileStringToMethod(urlPart[0])) { default: case WikiRequestType.None: { // get Exception Home page default (html template) // return Exception WikiHomePageException Console.WriteLine("1: WikiRequestType.None:0"); if (!string.IsNullOrWhiteSpace(urlPart[0])) { if (urlPart[0].EndsWith(":")) { return(_WikiGetList( WikiFileType.FileReadMd, urlPart[0] )); } else if (urlPart[0].Contains(":")) { return(_WikiGetFile( WikiFileType.FileReadMd, urlPart[0] )); } } throw new WikiEngine.Exceptions.WikiEngineHomePageException(urlPart[0]); } case WikiRequestType.List: { // get page list default ? // return Md format txt Console.WriteLine("1: WikiRequestType.List:0"); return(_WikiGetList(WikiFileType.FileReadMd, String.Empty)); } case WikiRequestType.Find: { // get find page default ? // return Md format txt Console.WriteLine("1: WikiRequestType.Find:0"); throw new WikiEngineSearchException("search pattern is empty"); } } } case 2: { // command line: /get (/pages | /media | /attic | /meta) // get List/Page/Media ? string nssource = String.Empty; WikiRequestType wrt = DokuUtil.WikiFileStringToMethod(urlPart[0]); WikiFileType wft = DokuUtil.WikiFileStringToType(wrt, urlPart[1]); switch (wrt) { case WikiRequestType.None: { if (wft == WikiFileType.None) { if ((wft = DokuUtil.WikiFileStringToType(wrt, urlPart[0])) != WikiFileType.None) { wrt = WikiRequestType.Get; nssource = urlPart[1]; } } break; } default: { if (wft == WikiFileType.None) { nssource = urlPart[1]; wft = WikiFileType.FileReadMd; } else { nssource = this._defaultNameSpace; } break; } } switch (wrt) { default: case WikiRequestType.Del: case WikiRequestType.Put: case WikiRequestType.None: { // get Exception Home page default (html template) // return Exception WikiHomePageException Console.WriteLine("2: _WikiGetHome"); throw new WikiEngine.Exceptions.WikiEngineHomePageException( nssource ); } case WikiRequestType.Find: { // find pages list (default from nssource) Console.WriteLine("2: _WikiFindList"); return(_WikiFindList(wft, nssource)); } case WikiRequestType.List: { // get pages list (default from nssource) Console.WriteLine("2: _WikiGetList"); return(_WikiGetList(wft, nssource)); } case WikiRequestType.Get: { // get page/media resource (default from nssource) Console.WriteLine("2: _WikiGetFile"); return(_WikiGetFile(wft, nssource)); } } } case 3: { WikiRequestType wrtAct = DokuUtil.WikiFileStringToMethod(urlPart[0]); WikiFileType wrtTarget = DokuUtil.WikiFileStringToType(wrtAct, urlPart[1]); if ( (wrtAct == WikiRequestType.None) || (wrtTarget == WikiFileType.None) || (string.IsNullOrWhiteSpace(urlPart[2])) || ( (wrtAct != WikiRequestType.Find) && (!urlPart[2].Contains(":")) ) ) { // error request param // return Exception WikiHomePageException throw new WikiEngineHomePageException(urlPart[2]); } List <string> wikiPart = urlPart[2].Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries).ToList(); switch (wikiPart.Count) { case 0: { // WikiRequestType and WikiFileType is valid, // namespace not found, return default switch (wrtAct) { case WikiRequestType.Get: { return(_WikiGetFile(wrtTarget, this._defaultNameSpace)); } case WikiRequestType.List: { return(_WikiGetList(wrtTarget, this._defaultNameSpace)); } case WikiRequestType.Find: { if (string.IsNullOrWhiteSpace(urlPart[2])) { throw new WikiEngineSearchException( string.Format( Properties.ResourceWikiEngine.txtErrorSearchPaternEmpty, "0" ) ); } return(_WikiFindList(wrtTarget, urlPart[2])); } case WikiRequestType.Put: case WikiRequestType.Del: { throw new WikiEngineErrorPageException( string.Format( Properties.ResourceWikiEngine.fmtErrorNSError, wrtAct.ToString(), urlPart[2] ) ); } } break; } default: { // wikiPart.Count > 0 // namespace and page/file name switch (wrtAct) { case WikiRequestType.Get: { Console.WriteLine("3:default _WikiGetFile: " + urlPart[2]); return(_WikiGetFile(wrtTarget, urlPart[2])); } case WikiRequestType.List: { Console.WriteLine("3:default _WikiGetList: " + " : " + wrtTarget + " : " + urlPart[2]); return(_WikiGetList(wrtTarget, urlPart[2])); } case WikiRequestType.Find: { Console.WriteLine("3:default _WikiFindList: " + " : " + wrtTarget + " : " + urlPart[2] + " : " + wikiPart[(wikiPart.Count - 1)]); int idx = (wikiPart.Count - 1); if ( (idx < 0) || (string.IsNullOrWhiteSpace(wikiPart[idx])) ) { throw new WikiEngineSearchException( string.Format( Properties.ResourceWikiEngine.txtErrorSearchPaternEmpty, idx ) ); } return(_WikiFindList(wrtTarget, wikiPart[idx])); } case WikiRequestType.Put: case WikiRequestType.Del: { Console.WriteLine("3:default _WikiPutFile: " + urlPart[2]); if (wfm == null) { throw new WikiEngineAuthException( string.Format( Properties.ResourceWikiEngine.fmtErrorMetaEmpty, urlPart[2] ) ); } if (!wfm.IsAuth) { throw new WikiEngineAuthException( string.Format( Properties.ResourceWikiEngine.fmtErrorAuthEmpty, urlPart[2] ), wfm ); } return(this._WikiPutFile(wrtTarget, urlPart[2], wfm)); } } break; } } break; } default: { throw new WikiEngineHomePageException(urlPart[0]); } } } catch (Exception e) { if (!this._isMapExceptions) { throw e; } } return(null); }