Пример #1
0
        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;
        }
Пример #2
0
        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;//デフォルトで継続型
        }
Пример #3
0
        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;
        }
Пример #4
0
        public new void Dispose()
        {
            if (_cache != null)
                _cache.Dispose();
            _cache = null;

            base.Dispose();
        }
Пример #5
0
 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;
 }
Пример #6
0
        //キャッシュ確認
        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);
        }
Пример #7
0
        //キャッシュ確認
        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;
                        }
                    }
                }
            }
        }