package snap import ( "bytes" "encoding/json" "net/http" "github.com/gorilla/mux" "git.twelvetwelve.org/library/snap/auth" ) type ServiceRequest struct { r *http.Request auth *auth.AuthData vars *Vars form *Form query *Query } func (c *ServiceRequest) GetUser() string { if c.auth == nil { return "" } return c.auth.User } func (c *ServiceRequest) ReplyMessage(code int, msg string) *ServiceResponse { return &ServiceResponse{ Code: code, Message: []byte(msg), } } func (c *ServiceRequest) ReplyObject(code int, obj interface{}) *ServiceResponse { var err error resp := &ServiceResponse{ Code: code, } resp.Message, err = json.Marshal(obj) if err != nil { resp.Code = http.StatusInternalServerError resp.Message = []byte("Internal Server Error") } compact := c.r.Header.Get("Compact") if compact == "" { var pretty bytes.Buffer err := json.Indent(&pretty, resp.Message, "", " ") if err == nil { resp.Message = pretty.Bytes() } } return resp } func (c *ServiceRequest) GetObject(object interface{}) error { decoder := json.NewDecoder(c.r.Body) return decoder.Decode(object) } func (c *ServiceRequest) Form() (*Options, error) { if c.form != nil { return &Options{ kv: c.form, }, nil } err := c.r.ParseForm() if err != nil { return nil, err } c.form = &Form{ r: c.r, } return &Options{ kv: c.form, }, nil } func (c *ServiceRequest) Query() *Options { if c.query != nil { return &Options{ kv: c.query, } } c.query = &Query{ Values: c.r.URL.Query(), } return &Options{ kv: c.query, } } func (c *ServiceRequest) Vars() *Options { if c.vars != nil { return &Options{ kv: c.vars, } } c.vars = &Vars{ vars: mux.Vars(c.r), } return &Options{ kv: c.vars, } } // Options get compound options func (c *ServiceRequest) Options() *Options { opts := &CompoundOptions{} opts.kvs = append(opts.kvs, &Vars{ vars: mux.Vars(c.r), }) opts.kvs = append(opts.kvs, &Query{ Values: c.r.URL.Query(), }) err := c.r.ParseForm() if err == nil { opts.kvs = append(opts.kvs, &Form{ r: c.r, }) } return &Options{ kv: opts, } } func (c *ServiceRequest) GetRequest() *http.Request { return c.r }