github.com/boynux/docker@v1.11.0-rc4/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 var timeout <-chan time.Time 59 if until > 0 || untilNano > 0 { 60 dur := time.Unix(until, untilNano).Sub(time.Now()) 61 timeout = time.NewTimer(dur).C 62 } 63 64 ef, err := filters.FromParam(r.Form.Get("filters")) 65 if err != nil { 66 return err 67 } 68 69 w.Header().Set("Content-Type", "application/json") 70 output := ioutils.NewWriteFlusher(w) 71 defer output.Close() 72 output.Flush() 73 74 enc := json.NewEncoder(output) 75 76 buffered, l := s.backend.SubscribeToEvents(since, sinceNano, ef) 77 defer s.backend.UnsubscribeFromEvents(l) 78 79 for _, ev := range buffered { 80 if err := enc.Encode(ev); err != nil { 81 return err 82 } 83 } 84 85 var closeNotify <-chan bool 86 if closeNotifier, ok := w.(http.CloseNotifier); ok { 87 closeNotify = closeNotifier.CloseNotify() 88 } 89 90 for { 91 select { 92 case ev := <-l: 93 jev, ok := ev.(events.Message) 94 if !ok { 95 logrus.Warnf("unexpected event message: %q", ev) 96 continue 97 } 98 if err := enc.Encode(jev); err != nil { 99 return err 100 } 101 case <-timeout: 102 return nil 103 case <-closeNotify: 104 logrus.Debug("Client disconnected, stop sending events") 105 return nil 106 } 107 } 108 } 109 110 func (s *systemRouter) postAuth(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 111 var config *types.AuthConfig 112 err := json.NewDecoder(r.Body).Decode(&config) 113 r.Body.Close() 114 if err != nil { 115 return err 116 } 117 status, token, err := s.backend.AuthenticateToRegistry(ctx, config) 118 if err != nil { 119 return err 120 } 121 return httputils.WriteJSON(w, http.StatusOK, &types.AuthResponse{ 122 Status: status, 123 IdentityToken: token, 124 }) 125 }