...

Source file src/github.com/henvic/httpretty/httpretty_test.go

Documentation: github.com/henvic/httpretty

     1  package httpretty
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"io/ioutil"
     7  	"net"
     8  	"net/http"
     9  	"net/url"
    10  	"os"
    11  	"reflect"
    12  	"testing"
    13  	"time"
    14  )
    15  
    16  func TestPrintRequest(t *testing.T) {
    17  	t.Parallel()
    18  
    19  	var req, err = http.NewRequest(http.MethodPost, "http://wxww.example.com/", nil)
    20  
    21  	if err != nil {
    22  		panic(err)
    23  	}
    24  
    25  	logger := &Logger{
    26  		TLS:            true,
    27  		RequestHeader:  true,
    28  		RequestBody:    true,
    29  		ResponseHeader: true,
    30  		ResponseBody:   true,
    31  	}
    32  
    33  	var buf bytes.Buffer
    34  	logger.SetOutput(&buf)
    35  
    36  	logger.PrintRequest(req)
    37  
    38  	want := `> POST / HTTP/1.1
    39  > Host: wxww.example.com
    40  
    41  `
    42  
    43  	if got := buf.String(); got != want {
    44  		t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
    45  	}
    46  }
    47  
    48  func TestPrintRequestWithColors(t *testing.T) {
    49  	t.Parallel()
    50  
    51  	var req, err = http.NewRequest(http.MethodPost, "http://wxww.example.com/", nil)
    52  
    53  	if err != nil {
    54  		panic(err)
    55  	}
    56  
    57  	logger := &Logger{
    58  		TLS:            true,
    59  		RequestHeader:  true,
    60  		RequestBody:    true,
    61  		ResponseHeader: true,
    62  		ResponseBody:   true,
    63  		Colors:         true,
    64  	}
    65  
    66  	var buf bytes.Buffer
    67  	logger.SetOutput(&buf)
    68  
    69  	logger.PrintRequest(req)
    70  
    71  	want := "> \x1b[34;1mPOST\x1b[0m \x1b[33m/\x1b[0m \x1b[34mHTTP/1.1\x1b[0m" +
    72  		"\n> \x1b[34;1mHost\x1b[0m\x1b[31m:\x1b[0m \x1b[33mwxww.example.com\x1b[0m\n\n"
    73  
    74  	if got := buf.String(); got != want {
    75  		t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
    76  	}
    77  }
    78  
    79  func TestEncodingQueryStringParams(t *testing.T) {
    80  	// Regression test for verifying query string parameters are being encoded correctly when printing with colors.
    81  	// Issue reported by @mislav in https://github.com/henvic/httpretty/issues/9.
    82  	t.Parallel()
    83  
    84  	qs := url.Values{}
    85  	qs.Set("a", "b")
    86  	qs.Set("i", "j")
    87  	qs.Set("x", "y")
    88  	qs.Set("z", "+=")
    89  	qs.Set("var", "foo&bar")
    90  	u := url.URL{
    91  		Scheme:   "http",
    92  		Host:     "www.example.com",
    93  		Path:     "/mypath",
    94  		RawQuery: qs.Encode(),
    95  	}
    96  	var req, err = http.NewRequest(http.MethodPost, u.String(), nil)
    97  
    98  	if err != nil {
    99  		panic(err)
   100  	}
   101  
   102  	logger := &Logger{
   103  		TLS:            true,
   104  		RequestHeader:  true,
   105  		RequestBody:    true,
   106  		ResponseHeader: true,
   107  		ResponseBody:   true,
   108  		Colors:         true,
   109  	}
   110  
   111  	var buf bytes.Buffer
   112  	logger.SetOutput(&buf)
   113  
   114  	logger.PrintRequest(req)
   115  
   116  	want := "> \x1b[34;1mPOST\x1b[0m \x1b[33m/mypath?a=b&i=j&var=foo%26bar&x=y&z=%2B%3D\x1b[0m \x1b[34mHTTP/1.1\x1b[0m" +
   117  		"\n> \x1b[34;1mHost\x1b[0m\x1b[31m:\x1b[0m \x1b[33mwww.example.com\x1b[0m\n\n"
   118  
   119  	if got := buf.String(); got != want {
   120  		t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
   121  	}
   122  }
   123  
   124  func TestEncodingQueryStringParamsNoColors(t *testing.T) {
   125  	t.Parallel()
   126  
   127  	qs := url.Values{}
   128  	qs.Set("a", "b")
   129  	qs.Set("i", "j")
   130  	qs.Set("x", "y")
   131  	qs.Set("z", "+=")
   132  	qs.Set("var", "foo&bar")
   133  	u := url.URL{
   134  		Scheme:   "http",
   135  		Host:     "www.example.com",
   136  		Path:     "/mypath",
   137  		RawQuery: qs.Encode(),
   138  	}
   139  	var req, err = http.NewRequest(http.MethodPost, u.String(), nil)
   140  
   141  	if err != nil {
   142  		panic(err)
   143  	}
   144  
   145  	logger := &Logger{
   146  		TLS:            true,
   147  		RequestHeader:  true,
   148  		RequestBody:    true,
   149  		ResponseHeader: true,
   150  		ResponseBody:   true,
   151  	}
   152  
   153  	var buf bytes.Buffer
   154  	logger.SetOutput(&buf)
   155  
   156  	logger.PrintRequest(req)
   157  
   158  	want := `> POST /mypath?a=b&i=j&var=foo%26bar&x=y&z=%2B%3D HTTP/1.1
   159  > Host: www.example.com
   160  
   161  `
   162  
   163  	if got := buf.String(); got != want {
   164  		t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
   165  	}
   166  }
   167  
   168  func TestPrintRequestFiltered(t *testing.T) {
   169  	t.Parallel()
   170  
   171  	var req, err = http.NewRequest(http.MethodPost, "http://wxww.example.com/", nil)
   172  
   173  	if err != nil {
   174  		panic(err)
   175  	}
   176  
   177  	logger := &Logger{
   178  		TLS:            true,
   179  		RequestHeader:  true,
   180  		RequestBody:    true,
   181  		ResponseHeader: true,
   182  		ResponseBody:   true,
   183  	}
   184  
   185  	var buf bytes.Buffer
   186  	logger.SetOutput(&buf)
   187  	logger.SetFilter(func(req *http.Request) (skip bool, err error) {
   188  		return true, nil
   189  	})
   190  
   191  	logger.PrintRequest(req)
   192  
   193  	if got := buf.Len(); got != 0 {
   194  		t.Errorf("got %v from logger, wanted nothing (everything should be filtered)", got)
   195  	}
   196  }
   197  
   198  func TestPrintRequestNil(t *testing.T) {
   199  	t.Parallel()
   200  
   201  	logger := &Logger{
   202  		TLS:            true,
   203  		RequestHeader:  true,
   204  		RequestBody:    true,
   205  		ResponseHeader: true,
   206  		ResponseBody:   true,
   207  	}
   208  
   209  	var buf bytes.Buffer
   210  	logger.SetOutput(&buf)
   211  
   212  	logger.PrintRequest(nil)
   213  
   214  	want := "> error: null request\n"
   215  
   216  	if got := buf.String(); got != want {
   217  		t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
   218  	}
   219  }
   220  
   221  func TestPrintResponseNil(t *testing.T) {
   222  	t.Parallel()
   223  
   224  	logger := &Logger{
   225  		TLS:            true,
   226  		RequestHeader:  true,
   227  		RequestBody:    true,
   228  		ResponseHeader: true,
   229  		ResponseBody:   true,
   230  	}
   231  
   232  	var buf bytes.Buffer
   233  	logger.SetOutput(&buf)
   234  
   235  	logger.PrintResponse(nil)
   236  
   237  	want := "< error: null response\n"
   238  
   239  	if got := buf.String(); got != want {
   240  		t.Errorf("PrintResponse(req) = %v, wanted %v", got, want)
   241  	}
   242  }
   243  
   244  func testBody(t *testing.T, r io.Reader, want []byte) {
   245  	t.Helper()
   246  
   247  	got, err := ioutil.ReadAll(r)
   248  
   249  	if err != nil {
   250  		t.Errorf("expected no error reading response body, got %v instead", err)
   251  	}
   252  
   253  	if !reflect.DeepEqual(got, want) {
   254  		t.Errorf(`got body = %v, wanted %v`, string(got), string(want))
   255  	}
   256  }
   257  
   258  func TestJSONFormatterWriterError(t *testing.T) {
   259  	// verifies if function doesn't panic if passed writer isn't *bytes.Buffer
   260  	f := &JSONFormatter{}
   261  	want := "underlying writer for JSONFormatter must be *bytes.Buffer"
   262  	if err := f.Format(os.Stdout, []byte(`{}`)); err == nil || err.Error() != want {
   263  		t.Errorf("got format error = %v, wanted %v", err, want)
   264  	}
   265  }
   266  
   267  // newTransport creates a new HTTP Transport.
   268  //
   269  // BUG(henvic): this function is mostly used at this moment because of a data race condition on the standard library.
   270  // See https://github.com/golang/go/issues/30597 for details.
   271  func newTransport() *http.Transport {
   272  	// values copied from Go 1.13.7 http.DefaultTransport variable.
   273  	return &http.Transport{
   274  		Proxy: http.ProxyFromEnvironment,
   275  		DialContext: (&net.Dialer{
   276  			Timeout:   30 * time.Second,
   277  			KeepAlive: 30 * time.Second,
   278  			DualStack: true,
   279  		}).DialContext,
   280  		ForceAttemptHTTP2:     true,
   281  		MaxIdleConns:          100,
   282  		IdleConnTimeout:       90 * time.Second,
   283  		TLSHandshakeTimeout:   10 * time.Second,
   284  		ExpectContinueTimeout: 1 * time.Second,
   285  	}
   286  }
   287  

View as plain text