Skip to content

Commit 8624448

Browse files
committed
add pac file monitor that watches the pac file whether it is changed
1 parent f2b1f65 commit 8624448

3 files changed

Lines changed: 64 additions & 14 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module github.com/darren/pacroxy
22

3-
require github.com/darren/gpac v0.0.0-20190205064832-63757178eeaa
3+
require github.com/darren/gpac v0.0.0-20190205154740-ac48ff1eaf41

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
github.com/darren/gpac v0.0.0-20190205064832-63757178eeaa h1:vjvetKH0/jVzRp+/8TA2cc/7NW5Md19v/VPabcx0THs=
22
github.com/darren/gpac v0.0.0-20190205064832-63757178eeaa/go.mod h1:fK76ZiaaM0f4rW2A3sTomlo/wlY9jRV07KJ66DbOAXs=
3+
github.com/darren/gpac v0.0.0-20190205154740-ac48ff1eaf41 h1:xkADc3wb+Zb9diEuPy+Ib3DEJ0GzMDKuQDm370m/cxw=
4+
github.com/darren/gpac v0.0.0-20190205154740-ac48ff1eaf41/go.mod h1:fK76ZiaaM0f4rW2A3sTomlo/wlY9jRV07KJ66DbOAXs=
35
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d h1:1VUlQbCfkoSGv7qP7Y+ro3ap1P1pPZxgdGVqiTVy5C4=
46
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
57
gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=

main.go

Lines changed: 61 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,24 @@ import (
99
"net"
1010
"net/http"
1111
"strings"
12+
"sync"
13+
"time"
1214

1315
"github.com/darren/gpac"
1416
)
1517

1618
var pacfile = flag.String("p", "wpad.dat", "pac file to load")
1719
var addr = flag.String("l", "127.0.0.1:8080", "Listening address")
20+
var refresh = flag.Duration("r", 0, "Time duration to refresh pac file")
1821

1922
// Server the proxy server
2023
type Server struct {
2124
http.Server
22-
pac *gpac.Parser
25+
sync.Mutex
26+
27+
pacfile string
28+
pac *gpac.Parser
29+
refreshDuration time.Duration
2330
}
2431

2532
func (s *Server) handle(w http.ResponseWriter, r *http.Request) {
@@ -197,6 +204,57 @@ func (s *Server) handleHTTP(w http.ResponseWriter, req *http.Request) {
197204
http.Error(w, "No Proxy Available", http.StatusServiceUnavailable)
198205
}
199206

207+
func (s *Server) watch() {
208+
for {
209+
time.Sleep(s.refreshDuration)
210+
log.Printf("Try reloading from %s", s.pacfile)
211+
pac, err := gpac.From(s.pacfile)
212+
213+
if pac.Source() == s.pac.Source() {
214+
log.Println("Pac file not changed")
215+
continue
216+
}
217+
218+
if err != nil {
219+
log.Println("Refresh pac failed: %v", err)
220+
} else {
221+
log.Println("Refresh pac succeeded")
222+
}
223+
224+
s.Lock()
225+
s.pac = pac
226+
s.Unlock()
227+
}
228+
}
229+
230+
// Start starts the proxy server
231+
func (s *Server) Start() error {
232+
log.Printf("Start proxy on %s", s.Server.Addr)
233+
if s.refreshDuration > 0 {
234+
log.Printf("Start pac file watcher on: %s, refresh time: %v", s.pacfile, s.refreshDuration)
235+
go s.watch()
236+
}
237+
s.Handler = http.HandlerFunc(s.handle)
238+
return s.ListenAndServe()
239+
}
240+
241+
// New create the proxy server
242+
func New(addr string, pacf string, rintval time.Duration) (*Server, error) {
243+
pac, err := gpac.From(pacf)
244+
if err != nil {
245+
return nil, err
246+
}
247+
248+
return &Server{
249+
Server: http.Server{
250+
Addr: addr,
251+
},
252+
pac: pac,
253+
pacfile: pacf,
254+
refreshDuration: rintval,
255+
}, nil
256+
}
257+
200258
func cloneHeader(dst, src http.Header) {
201259
for k, vv := range src {
202260
for _, v := range vv {
@@ -209,20 +267,10 @@ func main() {
209267
log.SetFlags(log.LstdFlags | log.Lshortfile)
210268
flag.Parse()
211269

212-
log.Printf("Loading pac from %s", *pacfile)
213-
pac, err := gpac.From(*pacfile)
270+
server, err := New(*addr, *pacfile, *refresh)
214271
if err != nil {
215272
log.Fatal(err)
216273
}
217274

218-
log.Printf("Start proxy on %s", *addr)
219-
server := Server{
220-
Server: http.Server{
221-
Addr: *addr,
222-
},
223-
pac: pac,
224-
}
225-
226-
server.Handler = http.HandlerFunc(server.handle)
227-
log.Fatal(server.ListenAndServe())
275+
log.Fatal(server.Start())
228276
}

0 commit comments

Comments
 (0)