@@ -9,17 +9,24 @@ import (
99 "net"
1010 "net/http"
1111 "strings"
12+ "sync"
13+ "time"
1214
1315 "github.com/darren/gpac"
1416)
1517
1618var pacfile = flag .String ("p" , "wpad.dat" , "pac file to load" )
1719var 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
2023type 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
2532func (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+
200258func 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