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, 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 }