public Server(Kanel kanel,OpBase opBase) : base(kanel, opBase, PROTOCOL_KIND.TCP, USE_ACL.ON) { cache = new Cache(this.Logger,this.OpBase); // 上位プロキシを経由しないサーバのリスト Dat dat = opBase.ValDat("disableAddress"); foreach (OneLine oneLine in dat.Lines) { if (oneLine.Enabled) {//有効なデータだけを対象にする disableAddressList.Add((string)oneLine.ValList[0].Obj); } } //URL制限 limitUrl = new LimitUrl(opBase.ValDat("limitUrl"),(opBase.ValRadio("enableUrl")==0)?true:false); //リクエストを通常ログで表示する useRequestLog = opBase.ValBool("useRequestLog"); //コンテンツ制限 limitString = new LimitString(opBase.ValDat("limitString")); if (limitString.Length == 0) limitString = null; dataPort = dataPortMin; //初期化成功(isInitSuccess==trueでないとStart()を実行してもスレッド開始できない) isInitSuccess = true; }
int _indexServer; //サーバ側にどこまで送信を完了したかのインデックス #endregion Fields #region Constructors public ProxyHttp(Proxy proxy, Kernel kernel, Conf conf, Cache cache, LimitString limitString) : base(proxy) { _kernel = kernel; //_oneOption = oneOption; _conf = conf; _cache = cache; LimitString = limitString; KeepAlive = true;//デフォルトで継続型 }
public Server(Kernel kernel, Conf conf,OneBind oneBind) : base(kernel, conf,oneBind) { _cache = new Cache(kernel,this.Logger,conf); // 上位プロキシを経由しないサーバのリスト foreach (var o in (Dat)Conf.Get("disableAddress")) { if (o.Enable) {//有効なデータだけを対象にする _disableAddressList.Add(o.StrList[0]); } } //URL制限 var allow = (Dat)Conf.Get("limitUrlAllow"); var deny = (Dat)Conf.Get("limitUrlDeny"); //Ver5.4.5正規表現の誤りをチェックする for (var i = 0; i < 2; i++) { foreach (var a in (i == 0) ? allow : deny) { if (a.Enable && a.StrList[1] == "3") {//正規表現 try { var regex = new Regex(a.StrList[0]); } catch { Logger.Set(LogKind.Error, null, 28, a.StrList[0]); } } } } _limitUrl = new LimitUrl(allow,deny); //リクエストを通常ログで表示する _useRequestLog = (bool)Conf.Get("useRequestLog"); //コンテンツ制限 _limitString = new LimitString((Dat)Conf.Get("limitString")); if (_limitString.Length == 0) _limitString = null; _dataPort = DataPortMin; }
public new void Dispose() { if (_cache != null) _cache.Dispose(); _cache = null; base.Dispose(); }
public ProxyHttp(Kanel kanel,OpBase opBase,Proxy proxy,Cache cache,LimitString limitString) { this.kanel = kanel; this.opBase = opBase; this.proxy = proxy; this.Cache = cache; this.LimitString = limitString; }
//キャッシュ確認 public void CacheWrite(Cache cache) { if (!_isCacheTarget)//キャッシュ対象外 return; if (_response.Code != 200)//レスポンスコードが200のものだけが対象 return; //Ver5.6.1 if (!_oneObj.Body[CS.Server].CanUse) return; var oneCache = new OneCache(_oneObj.Request.HostName, _oneObj.Request.Port, _oneObj.Request.Uri); oneCache.Add(_oneObj.Header[CS.Server], _oneObj.Body[CS.Server].Get()); cache.Add(oneCache); }
//キャッシュ確認 public void CacheConform(Cache cache) { //キャッシュ対象のリクエストかどうかの確認 if (!_oneObj.Request.Cgi) { if (cache.IsTarget(_oneObj.Request.HostName, _oneObj.Request.Uri, _oneObj.Request.Ext)) { _isCacheTarget = true; // Pragma: no-cache が指定されている場合は、蓄積されたキャッシュを否定する var pragmaStr = _oneObj.Header[CS.Client].GetVal("Pragma"); if (pragmaStr != null && pragmaStr.ToLower().IndexOf("no-cache") >= 0) { _proxy.Logger.Set(LogKind.Detail, null, 16, _oneObj.Request.Uri); cache.Remove(_oneObj.Request.HostName, _oneObj.Request.Port, _oneObj.Request.Uri);//存在する場合は、無効化する } else { string modifiedStr = _oneObj.Header[CS.Client].GetVal("If-Modified-Since"); DateTime modified = Util.Str2Time(modifiedStr); OneCache oneCache = cache.Get(_oneObj.Request, modified); if (oneCache != null) { //キャッシュが見つかった場合 _proxy.Logger.Set(LogKind.Detail, null, 14, _oneObj.Request.Uri); _sideState[CS.Server] = HttpSideState.ServerSideRecvBody;//一気に受信完了 _sideState[CS.Client] = HttpSideState.ClientSideRecvRequest;//リクエスト受信完了まで進める _response.Recv("HTTP/1.1 200 OK"); _oneObj.Header[CS.Server] = new Header(oneCache.Header); _oneObj.Body[CS.Server].Set(new byte[oneCache.Body.Length]); //Buffer.BlockCopy(oneCache.Body, 0, oneObj.Body[CS.Server], 0, oneCache.Body.Length); _oneObj.Body[CS.Server].Set(oneCache.Body); _proxy.NoConnect(_oneObj.Request.HostName, _oneObj.Request.Port); //擬似的にContentLength形式で処理する _oneHttpKind = OneHttpKind.ContentLength; _contentLength = _oneObj.Body[CS.Server].Length; //キャッシュによる返答(このオブジェクトはキャッシュしない) _isCacheTarget = false; } } } } }