// HOST, URL, REAL 타입체크 void checkHost(Session oSession) { HostCheck patternCheck = PLinkCore.PLink.host.checkPattern(oSession.fullUrl); // 패턴 체크를 하고 if (patternCheck != null && patternCheck.Checked) { // 패턴이 체크 되어 있으면 , fullUrl 을 바꾸고 bool isCheck = checkUrlType(patternCheck, oSession); if (!isCheck) { return; } //return; } HostCheck check = PLinkCore.PLink.host.checkUrl(oSession.hostname, oSession.PathAndQuery); if (check == null) { return; } if (!check.Checked) { return; } // Host, Real 적용 if (check.isHost() || check.isReal()) { if (oSession.HTTPMethodIs("CONNECT")) { oSession.hostname = check.afterHost(); } else { oSession.bypassGateway = true; oSession["x-overrideHost"] = check.After; } } // URL, PATTERN 적용 else if (check.isUrl() || check.isPattern()) { if (oSession.HTTPMethodIs("CONNECT")) { oSession.hostname = check.afterHost(); } else { // 캐쉬된 정책 적용 string redirect = check.getHostItem().Redirect; if (!string.IsNullOrEmpty(redirect)) { check.After = redirect; } oSession.fullUrl = check.afterUrl(oSession.fullUrl); } } }
// 패턴 체크 실행 bool checkUrlType(HostCheck patternCheck, Session oSession) { if (oSession.HTTPMethodIs("CONNECT")) { oSession.hostname = patternCheck.afterHost(); } else { if (patternCheck.isStatus()) { int status = patternCheck.getStatusCode(); sendResponse(oSession, status, "text/html", new byte[0]); return(false); } if (patternCheck.isFolder() || patternCheck.isFile()) { string url = oSession.fullUrl; int idx = url.LastIndexOf(patternCheck.Before); FileInfo file; string target; if (patternCheck.isFolder()) { string first = url.Substring(0, idx); string second = patternCheck.Before; string last = url.Replace(first, "").Replace(second, ""); log(first + " : " + second + " : " + last); // 기본 디렉토리 지정 if (string.IsNullOrEmpty(last) || last.Equals("/")) { last = "/index.html"; } if (last[0] != '/') { last = "/" + last; } target = patternCheck.After + last; } else { target = patternCheck.After; } file = new FileInfo(target); if (file.Exists) { string content_type = MimeType.Get(file.Extension); byte[] data = File.ReadAllBytes(file.FullName); sendResponse(oSession, 200, content_type, data); return(false); } } else { oSession.fullUrl = patternCheck.afterUrl(oSession.fullUrl); } } return(true); }