context.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package context
  2. import (
  3. "encoding/xml"
  4. "net/http"
  5. "sync"
  6. )
  7. // Context struct
  8. type Context struct {
  9. *Config
  10. Writer http.ResponseWriter
  11. Request *http.Request
  12. //accessTokenLock 读写锁 同一个AppID一个
  13. accessTokenLock *sync.RWMutex
  14. //jsAPITicket 读写锁 同一个AppID一个
  15. jsAPITicketLock *sync.RWMutex
  16. HTTPClient *http.Client
  17. SHTTPClient *http.Client //SSL client
  18. }
  19. // Query 返回键入的url查询值(如果存在)
  20. func (ctx *Context) Query(key string) string {
  21. value, _ := ctx.GetQuery(key)
  22. return value
  23. }
  24. // GetQuery 类似于Query(),它返回键入的url查询值
  25. func (ctx *Context) GetQuery(key string) (string, bool) {
  26. req := ctx.Request
  27. if values, ok := req.URL.Query()[key]; ok && len(values) > 0 {
  28. return values[0], true
  29. }
  30. return "", false
  31. }
  32. // SetJsAPITicketLock 设置jsAPITicket的lock
  33. func (ctx *Context) SetJsAPITicketLock(lock *sync.RWMutex) {
  34. ctx.jsAPITicketLock = lock
  35. }
  36. // GetJsAPITicketLock 获取jsAPITicket 的lock
  37. func (ctx *Context) GetJsAPITicketLock() *sync.RWMutex {
  38. return ctx.jsAPITicketLock
  39. }
  40. var xmlContentType = []string{"application/xml; charset=utf-8"}
  41. var plainContentType = []string{"text/plain; charset=utf-8"}
  42. //Render render from bytes
  43. func (ctx *Context) Render(bytes []byte) {
  44. //debug
  45. // fmt.Println("response msg = ", string(bytes))
  46. ctx.Writer.WriteHeader(200)
  47. _, err := ctx.Writer.Write(bytes)
  48. if err != nil {
  49. panic(err)
  50. }
  51. }
  52. //String render from string
  53. func (ctx *Context) String(str string) {
  54. writeContextType(ctx.Writer, plainContentType)
  55. ctx.Render([]byte(str))
  56. }
  57. //XML render to xml
  58. func (ctx *Context) XML(obj interface{}) {
  59. writeContextType(ctx.Writer, xmlContentType)
  60. bytes, err := xml.Marshal(obj)
  61. if err != nil {
  62. panic(err)
  63. }
  64. ctx.Render(bytes)
  65. }
  66. func writeContextType(w http.ResponseWriter, value []string) {
  67. header := w.Header()
  68. if val := header["Content-Type"]; len(val) == 0 {
  69. header["Content-Type"] = value
  70. }
  71. }