mirror of
https://github.com/folbricht/routedns.git
synced 2026-05-24 01:58:28 -05:00
53 lines
1.1 KiB
Go
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()
|
|
}
|