go-tower: first release v0.1.0
This commit is contained in:
117
context.go
Normal file
117
context.go
Normal file
@@ -0,0 +1,117 @@
|
||||
package tower
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"encoding/xml"
|
||||
"net/http"
|
||||
|
||||
"github.com/julienschmidt/httprouter"
|
||||
)
|
||||
|
||||
type Context struct {
|
||||
request *http.Request
|
||||
response *responseWriter
|
||||
params httprouter.Params
|
||||
}
|
||||
|
||||
type ContextKey string
|
||||
|
||||
func (c *Context) Request() *http.Request {
|
||||
return c.request
|
||||
}
|
||||
|
||||
func (c *Context) Response() http.ResponseWriter {
|
||||
return c.response
|
||||
}
|
||||
|
||||
func (c *Context) Query(key string) string {
|
||||
return c.request.URL.Query().Get(key)
|
||||
}
|
||||
|
||||
func (c *Context) Param(key string) string {
|
||||
return c.params.ByName(key)
|
||||
}
|
||||
|
||||
func (c *Context) Value(key ContextKey) any {
|
||||
return c.request.Context().Value(key)
|
||||
}
|
||||
|
||||
func (c *Context) SetValue(key ContextKey, value any) {
|
||||
ctx := context.WithValue(c.request.Context(), key, value)
|
||||
c.request = c.request.WithContext(ctx)
|
||||
}
|
||||
|
||||
func (c *Context) Cookie(key string) (*http.Cookie, error) {
|
||||
return c.request.Cookie(key)
|
||||
}
|
||||
|
||||
func (c *Context) SetCookie(cookie *http.Cookie) {
|
||||
http.SetCookie(c.response, cookie)
|
||||
}
|
||||
|
||||
func (c *Context) Header(key string) string {
|
||||
return c.request.Header.Get(key)
|
||||
}
|
||||
|
||||
func (c *Context) SetHeader(key, value string) {
|
||||
c.response.Header().Set(key, value)
|
||||
}
|
||||
|
||||
func (c *Context) Status() int {
|
||||
return c.response.Status()
|
||||
}
|
||||
|
||||
func (c *Context) SetStatus(code int) {
|
||||
c.response.WriteHeader(code)
|
||||
}
|
||||
|
||||
func (c *Context) ClientIP() string {
|
||||
if ip := c.Header("X-Forwarded-For"); ip != "" {
|
||||
return ip
|
||||
}
|
||||
|
||||
if ip := c.Header("X-Real-IP"); ip != "" {
|
||||
return ip
|
||||
}
|
||||
|
||||
return c.request.RemoteAddr
|
||||
}
|
||||
|
||||
func (c *Context) Redirect(code int, url string) {
|
||||
http.Redirect(c.response, c.request, url, code)
|
||||
}
|
||||
|
||||
func (c *Context) WriteBytes(code int, b []byte, contentType string) error {
|
||||
c.SetStatus(code)
|
||||
c.SetHeader("Content-Type", contentType)
|
||||
_, err := c.response.Write(b)
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *Context) WriteString(code int, v string) error {
|
||||
c.SetStatus(code)
|
||||
c.SetHeader("Content-Type", "text/plain; charset=utf-8")
|
||||
_, err := c.response.Write([]byte(v))
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *Context) WriteJSON(code int, v any) error {
|
||||
c.SetStatus(code)
|
||||
c.SetHeader("Content-Type", "application/json; charset=utf-8")
|
||||
return json.NewEncoder(c.response).Encode(v)
|
||||
}
|
||||
|
||||
func (c *Context) WriteXML(code int, v any) error {
|
||||
c.SetStatus(code)
|
||||
c.SetHeader("Content-Type", "application/xml; charset=utf-8")
|
||||
return xml.NewEncoder(c.response).Encode(v)
|
||||
}
|
||||
|
||||
func (c *Context) BindJSON(v any) error {
|
||||
return json.NewDecoder(c.request.Body).Decode(v)
|
||||
}
|
||||
|
||||
func (c *Context) BindXML(v any) error {
|
||||
return xml.NewDecoder(c.request.Body).Decode(v)
|
||||
}
|
||||
Reference in New Issue
Block a user