Files
routedns/blocklistloader-http.go
T
2020-04-07 18:52:46 -06:00

53 lines
1.1 KiB
Go

package rdns
import (
"bufio"
"context"
"fmt"
"net/http"
"time"
)
// HTTPLoader reads blocklist rules from a server via HTTP(S).
type HTTPLoader struct {
url string
}
var _ BlocklistLoader = &HTTPLoader{}
const httpTimeout = 30 * time.Minute
func NewHTTPLoader(url string) *HTTPLoader {
return &HTTPLoader{url}
}
func (l *HTTPLoader) Load() ([]string, error) {
log := Log.WithField("url", l.url)
log.Trace("loading blocklist")
ctx, cancel := context.WithTimeout(context.Background(), httpTimeout)
defer cancel()
req, err := http.NewRequestWithContext(ctx, "GET", l.url, nil)
if err != nil {
return nil, err
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode > 299 {
return nil, fmt.Errorf("got unexpected status code %d from %s", resp.StatusCode, l.url)
}
var rules []string
scanner := bufio.NewScanner(resp.Body)
for scanner.Scan() {
rules = append(rules, scanner.Text())
}
log.Trace("completed loading blocklist")
return rules, scanner.Err()
}