github.com/hustcat/docker@v1.3.3-0.20160314103604-901c67a8eeab/api/server/router/system/system_routes.go (about) 1 package system 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "time" 7 8 "github.com/Sirupsen/logrus" 9 "github.com/docker/docker/api" 10 "github.com/docker/docker/api/server/httputils" 11 "github.com/docker/docker/pkg/ioutils" 12 "github.com/docker/engine-api/types" 13 "github.com/docker/engine-api/types/events" 14 "github.com/docker/engine-api/types/filters" 15 timetypes "github.com/docker/engine-api/types/time" 16 "golang.org/x/net/context" 17 ) 18 19 func optionsHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 20 w.WriteHeader(http.StatusOK) 21 return nil 22 } 23 24 func pingHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 25 _, err := w.Write([]byte{'O', 'K'}) 26 return err 27 } 28 29 func (s *systemRouter) getInfo(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 30 info, err := s.backend.SystemInfo() 31 if err != nil { 32 return err 33 } 34 35 return httputils.WriteJSON(w, http.StatusOK, info) 36 } 37 38 func (s *systemRouter) getVersion(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 39 info := s.backend.SystemVersion() 40 info.APIVersion = api.DefaultVersion.String() 41 42 return httputils.WriteJSON(w, http.StatusOK, info) 43 } 44 45 func (s *systemRouter) getEvents(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 46 if err := httputils.ParseForm(r); err != nil { 47 return err 48 } 49 since, sinceNano, err := timetypes.ParseTimestamps(r.Form.Get("since"), -1) 50 if err != nil { 51 return err 52 } 53 until, untilNano, err := timetypes.ParseTimestamps(r.Form.Get("until"), -1) 54 if err != nil { 55 return err 56 } 57 58 timer := time.NewTimer(0) 59 timer.Stop() 60 if until > 0 || untilNano > 0 { 61 dur := time.Unix(until, untilNano).Sub(time.Now()) 62 timer = time.NewTimer(dur) 63 } 64 65 ef, err := filters.FromParam(r.Form.Get("filters")) 66 if err != nil { 67 return err 68 } 69 70 w.Header().Set("Content-Type", "application/json") 71 output := ioutils.NewWriteFlusher(w) 72 defer output.Close() 73 output.Flush() 74 75 enc := json.NewEncoder(output) 76 77 buffered, l := s.backend.SubscribeToEvents(since, sinceNano, ef) 78 defer s.backend.UnsubscribeFromEvents(l) 79 80 for _, ev := range buffered { 81 if err := enc.Encode(ev); err != nil { 82 return err 83 } 84 } 85 86 var closeNotify <-chan bool 87 if closeNotifier, ok := w.(http.CloseNotifier); ok { 88 closeNotify = closeNotifier.CloseNotify() 89 } 90 91 for { 92 select { 93 case ev := <-l: 94 jev, ok := ev.(events.Message) 95 if !ok { 96 logrus.Warnf("unexpected event message: %q", ev) 97 continue 98 } 99 if err := enc.Encode(jev); err != nil { 100 return err 101 } 102 case <-timer.C: 103 return nil 104 case <-closeNotify: 105 logrus.Debug("Client disconnected, stop sending events") 106 return nil 107 } 108 } 109 } 110 111 func (s *systemRouter) postAuth(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 112 var config *types.AuthConfig 113 err := json.NewDecoder(r.Body).Decode(&config) 114 r.Body.Close() 115 if err != nil { 116 return err 117 } 118 status, err := s.backend.AuthenticateToRegistry(config) 119 if err != nil { 120 return err 121 } 122 return httputils.WriteJSON(w, http.StatusOK, &types.AuthResponse{ 123 Status: status, 124 }) 125 }