func NewFilter(config *Config) (filters.Filter, error) { f1, err := filters.NewFilter(config.Transport) if err != nil { return nil, err } f2, ok := f1.(filters.RoundTripFilter) if !ok { return nil, fmt.Errorf("%#v was not a filters.RoundTripFilter", f1) } fetchServers := make([]*FetchServer, 0) for _, fs := range config.FetchServers { u, err := url.Parse(fs.URL) if err != nil { return nil, err } fs := &FetchServer{ URL: u, Password: fs.Password, SSLVerify: fs.SSLVerify, } fetchServers = append(fetchServers, fs) } return &Filter{ FetchServers: fetchServers, Transport: f2, Sites: httpproxy.NewHostMatcher(config.Sites), }, nil }
func NewFilter(config *Config) (filters.Filter, error) { f1, err := filters.GetFilter(config.Transport) if err != nil { return nil, err } f2, ok := f1.(filters.RoundTripFilter) if !ok { return nil, fmt.Errorf("%#v was not a filters.RoundTripFilter", f1) } fetchServers := make([]*FetchServer, 0) for _, appid := range config.AppIds { u, err := url.Parse(fmt.Sprintf("%s://%s.%s%s", config.Scheme, appid, config.Domain, config.Path)) if err != nil { return nil, err } fs := &FetchServer{ URL: u, Password: config.Password, SSLVerify: config.SSLVerify, } fetchServers = append(fetchServers, fs) } return &Filter{ FetchServers: fetchServers, Transport: f2, Sites: httpproxy.NewHostMatcher(config.Sites), }, nil }
func NewFilter(config *Config) (filters.Filter, error) { fetchServers := make([]*FetchServer, 0) for _, fs := range config.FetchServers { u, err := url.Parse(fs.URL) if err != nil { return nil, err } transport := &http2.Transport{ InsecureTLSDial: true, Proxy: func(req *http.Request) (*url.URL, error) { return u, nil }, } fs := &FetchServer{ URL: u, Username: fs.Username, Password: fs.Password, SSLVerify: fs.SSLVerify, Transport: transport, } fetchServers = append(fetchServers, fs) } return &Filter{ FetchServers: fetchServers, Sites: httpproxy.NewHostMatcher(config.Sites), }, nil }
func NewFilter(config *Config) (_ filters.Filter, err error) { var gfwlist GFWList gfwlist.Encoding = config.GFWList.Encoding gfwlist.Filename = config.GFWList.File gfwlist.Duration = time.Duration(config.GFWList.Duration) * time.Second gfwlist.URL, err = url.Parse(config.GFWList.URL) if err != nil { return nil, err } store, err := storage.OpenURI(filters.LookupConfigStoreURI(filterName)) if err != nil { return nil, err } if _, err := store.HeadObject(gfwlist.Filename); err != nil { return nil, err } autoproxy2pac := &AutoProxy2Pac{ Sites: config.Sites, } object, err := store.GetObject(gfwlist.Filename, -1, -1) if err != nil { return nil, err } rc := object.Body() defer rc.Close() err = autoproxy2pac.Read(rc) if err != nil { return nil, err } f1, err := filters.NewFilter(config.Transport) if err != nil { return nil, err } f2, ok := f1.(filters.RoundTripFilter) if !ok { return nil, fmt.Errorf("%#v was not a filters.RoundTripFilter", f1) } f := &Filter{ Store: store, Sites: httpproxy.NewHostMatcher(config.Sites), GFWList: &gfwlist, AutoProxy2Pac: autoproxy2pac, Transport: f2, } go onceUpdater.Do(f.updater) return f, nil }
func NewIplist(lists map[string][]string, dnsservers []string, blacklist []string, dualStack bool) (*Iplist, error) { iplist := &Iplist{ lists: lists, dnsservers: dnsservers, blacklist: httpproxy.NewHostMatcher(blacklist), dnsCache: lrucache.NewMultiLRUCache(4, 10240), dualStack: dualStack, } return iplist, nil }
func NewFilter(config *Config) (_ filters.Filter, err error) { var gfwlist GFWList gfwlist.Encoding = config.GFWList.Encoding gfwlist.Filename = config.GFWList.File gfwlist.Duration = time.Duration(config.GFWList.Duration) * time.Second gfwlist.URL, err = url.Parse(config.GFWList.URL) if err != nil { return nil, err } store, err := storage.OpenURI(filters.LookupConfigStoreURI(filterName)) if err != nil { return nil, err } if _, err := store.HeadObject(gfwlist.Filename); err != nil { return nil, err } autoproxy2pac := &AutoProxy2Pac{ Sites: config.Sites, } object, err := store.GetObject(gfwlist.Filename, -1, -1) if err != nil { return nil, err } rc := object.Body() defer rc.Close() var r io.Reader br := bufio.NewReader(rc) if data, err := br.Peek(20); err == nil { if bytes.HasPrefix(data, []byte("[AutoProxy ")) { r = br } else { r = base64.NewDecoder(base64.StdEncoding, br) } } err = autoproxy2pac.Read(r) if err != nil { return nil, err } transport := &http.Transport{ Proxy: http.ProxyFromEnvironment, } f := &Filter{ Store: store, Sites: httpproxy.NewHostMatcher(config.Sites), GFWList: &gfwlist, AutoProxy2Pac: autoproxy2pac, Transport: transport, UpdateChan: make(chan struct{}), } go onceUpdater.Do(f.updater) return f, nil }