printer.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package httpexpect
  2. import (
  3. "net/http"
  4. "net/http/httputil"
  5. "strings"
  6. "time"
  7. "github.com/moul/http2curl"
  8. )
  9. // CompactPrinter implements Printer. It prints requests in compact form.
  10. type CompactPrinter struct {
  11. logger Logger
  12. }
  13. // NewCompactPrinter returns a new CompactPrinter given a logger.
  14. func NewCompactPrinter(logger Logger) CompactPrinter {
  15. return CompactPrinter{logger}
  16. }
  17. // Request implements Printer.Request.
  18. func (p CompactPrinter) Request(req *http.Request) {
  19. if req != nil {
  20. p.logger.Logf("%s %s", req.Method, req.URL)
  21. }
  22. }
  23. // Response implements Printer.Response.
  24. func (CompactPrinter) Response(*http.Response, time.Duration) {
  25. }
  26. // DebugPrinter implements Printer. Uses net/http/httputil to dump
  27. // both requests and responses.
  28. type DebugPrinter struct {
  29. logger Logger
  30. body bool
  31. }
  32. // NewDebugPrinter returns a new DebugPrinter given a logger and body
  33. // flag. If body is true, request and response body is also printed.
  34. func NewDebugPrinter(logger Logger, body bool) DebugPrinter {
  35. return DebugPrinter{logger, body}
  36. }
  37. // Request implements Printer.Request.
  38. func (p DebugPrinter) Request(req *http.Request) {
  39. if req == nil {
  40. return
  41. }
  42. dump, err := httputil.DumpRequest(req, p.body)
  43. if err != nil {
  44. panic(err)
  45. }
  46. p.logger.Logf("%s", dump)
  47. }
  48. // Response implements Printer.Response.
  49. func (p DebugPrinter) Response(resp *http.Response, duration time.Duration) {
  50. if resp == nil {
  51. return
  52. }
  53. dump, err := httputil.DumpResponse(resp, p.body)
  54. if err != nil {
  55. panic(err)
  56. }
  57. text := strings.Replace(string(dump), "\r\n", "\n", -1)
  58. lines := strings.SplitN(text, "\n", 2)
  59. p.logger.Logf("%s %s\n%s", lines[0], duration, lines[1])
  60. }
  61. // CurlPrinter implements Printer. Uses http2curl to dump requests as
  62. // curl commands.
  63. type CurlPrinter struct {
  64. logger Logger
  65. }
  66. // NewCurlPrinter returns a new CurlPrinter given a logger.
  67. func NewCurlPrinter(logger Logger) CurlPrinter {
  68. return CurlPrinter{logger}
  69. }
  70. // Request implements Printer.Request.
  71. func (p CurlPrinter) Request(req *http.Request) {
  72. if req != nil {
  73. cmd, err := http2curl.GetCurlCommand(req)
  74. if err != nil {
  75. panic(err)
  76. }
  77. p.logger.Logf("%s", cmd.String())
  78. }
  79. }
  80. // Response implements Printer.Response.
  81. func (CurlPrinter) Response(*http.Response, time.Duration) {
  82. }