diff --git a/control.go b/control.go index d1d459f5..ada72697 100644 --- a/control.go +++ b/control.go @@ -559,15 +559,10 @@ func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) { } // Check for duplicates - config.RLock() - for i := range config.Filters { - if config.Filters[i].URL == f.URL { - config.RUnlock() - httpError(w, http.StatusBadRequest, "Filter URL already added -- %s", f.URL) - return - } + if filterExists(f.URL) { + httpError(w, http.StatusBadRequest, "Filter URL already added -- %s", f.URL) + return } - config.RUnlock() // Set necessary properties f.ID = assignUniqueFilterID() @@ -597,20 +592,11 @@ func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) { // URL is deemed valid, append it to filters, update config, write new filter file and tell dns to reload it // TODO: since we directly feed filters in-memory, revisit if writing configs is always necessary - config.Lock() - - // Check for duplicates - for i := range config.Filters { - if config.Filters[i].URL == f.URL { - config.Unlock() - httpError(w, http.StatusBadRequest, "Filter URL already added -- %s", f.URL) - return - } + if !filterAdd(f) { + httpError(w, http.StatusBadRequest, "Filter URL already added -- %s", f.URL) + return } - config.Filters = append(config.Filters, f) - config.Unlock() - err = writeAllConfigs() if err != nil { httpError(w, http.StatusInternalServerError, "Couldn't write config file: %s", err) diff --git a/filter.go b/filter.go index 6dedadc1..c294b3b5 100644 --- a/filter.go +++ b/filter.go @@ -72,6 +72,38 @@ func filterEnable(url string, enable bool) bool { return r } +// Return TRUE if a filter with this URL exists +func filterExists(url string) bool { + r := false + config.RLock() + for i := range config.Filters { + if config.Filters[i].URL == url { + r = true + break + } + } + config.RUnlock() + return r +} + +// Add a filter +// Return FALSE if a filter with this URL exists +func filterAdd(f filter) bool { + config.Lock() + + // Check for duplicates + for i := range config.Filters { + if config.Filters[i].URL == f.URL { + config.Unlock() + return false + } + } + + config.Filters = append(config.Filters, f) + config.Unlock() + return true +} + // Load filters from the disk // And if any filter has zero ID, assign a new one func loadFilters() {