common.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package network
  2. import (
  3. "database/sql"
  4. "io/ioutil"
  5. "net/http"
  6. "strconv"
  7. "notabug.org/apiote/gott"
  8. )
  9. type Request struct {
  10. Id string
  11. Etag string
  12. Language string
  13. Subid string
  14. Connection *sql.DB
  15. }
  16. type Result struct {
  17. Client *http.Client
  18. Request *http.Request
  19. Response *http.Response
  20. Body []byte
  21. Etag string
  22. Result interface{}
  23. }
  24. type HttpError struct {
  25. Status int
  26. }
  27. func (e HttpError) Error() string {
  28. return strconv.FormatInt(int64(e.Status), 10)
  29. }
  30. func AddHeaders(args ...interface{}) interface{} {
  31. request := args[0].(*Request)
  32. result := args[1].(*Result)
  33. result.Request.Header.Add("If-None-Match", request.Etag)
  34. return gott.Tuple(args)
  35. }
  36. func DoRequest(args ...interface{}) (interface{}, error) {
  37. result := args[1].(*Result)
  38. resp, err := result.Client.Do(result.Request)
  39. if err == nil && resp.StatusCode != 304 {
  40. result.Response = resp
  41. }
  42. return gott.Tuple(args), err
  43. }
  44. func HandleRequestError(args ...interface{}) (interface{}, error) {
  45. result := args[1].(*Result)
  46. if result.Response != nil && result.Response.StatusCode != 200 {
  47. return gott.Tuple(args), HttpError{result.Response.StatusCode}
  48. }
  49. return gott.Tuple(args), nil
  50. }
  51. func ReadResponse(args ...interface{}) (interface{}, error) {
  52. result := args[1].(*Result)
  53. if result.Response != nil {
  54. defer result.Response.Body.Close()
  55. body, err := ioutil.ReadAll(result.Response.Body)
  56. result.Body = body
  57. result.Etag = result.Response.Header.Get("Etag")
  58. return gott.Tuple(args), err
  59. }
  60. return gott.Tuple(args), nil
  61. }