pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/req/req_test.go (about)

     1  package req
     2  
     3  // ////////////////////////////////////////////////////////////////////////////////// //
     4  //                                                                                    //
     5  //                         Copyright (c) 2022 ESSENTIAL KAOS                          //
     6  //      Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>     //
     7  //                                                                                    //
     8  // ////////////////////////////////////////////////////////////////////////////////// //
     9  
    10  import (
    11  	"bytes"
    12  	"errors"
    13  	"io"
    14  	"io/ioutil"
    15  	"net"
    16  	"net/http"
    17  	"sort"
    18  	"strings"
    19  	"testing"
    20  	"time"
    21  
    22  	. "pkg.re/essentialkaos/check.v1"
    23  )
    24  
    25  // ////////////////////////////////////////////////////////////////////////////////// //
    26  
    27  const (
    28  	_URL_GET          = "/get"
    29  	_URL_POST         = "/post"
    30  	_URL_POST_MULTI   = "/post-multi"
    31  	_URL_PUT          = "/put"
    32  	_URL_HEAD         = "/head"
    33  	_URL_PATCH        = "/patch"
    34  	_URL_DELETE       = "/delete"
    35  	_URL_QUERY        = "/query"
    36  	_URL_HEADERS      = "/headers"
    37  	_URL_CONTENT_TYPE = "/content-type"
    38  	_URL_ACCEPT       = "/accept"
    39  	_URL_USER_AGENT   = "/user-agent"
    40  	_URL_BASIC_AUTH   = "/basic-auth"
    41  	_URL_STRING_RESP  = "/string-response"
    42  	_URL_JSON_RESP    = "/json-response"
    43  	_URL_DISCARD      = "/discard"
    44  )
    45  
    46  const (
    47  	_TEST_CONTENT_TYPE    = "application/json"
    48  	_TEST_ACCEPT          = "application/vnd.example.api+json;version=2"
    49  	_TEST_BASIC_AUTH_USER = "admin"
    50  	_TEST_BASIC_AUTH_PASS = "password"
    51  	_TEST_STRING_RESP     = "Test String Response"
    52  )
    53  
    54  // ////////////////////////////////////////////////////////////////////////////////// //
    55  
    56  func Test(t *testing.T) { TestingT(t) }
    57  
    58  type ReqSuite struct {
    59  	url      string
    60  	port     string
    61  	listener net.Listener
    62  }
    63  
    64  type TestStruct struct {
    65  	String  string `json:"string"`
    66  	Integer int    `json:"integer"`
    67  	Boolean bool   `json:"boolean"`
    68  }
    69  
    70  // ////////////////////////////////////////////////////////////////////////////////// //
    71  
    72  var _ = Suite(&ReqSuite{})
    73  
    74  // ////////////////////////////////////////////////////////////////////////////////// //
    75  
    76  func (s *ReqSuite) SetUpSuite(c *C) {
    77  	s.port = "30001"
    78  	s.url = "http://127.0.0.1:" + s.port
    79  
    80  	SetDialTimeout(60.0)
    81  	SetRequestTimeout(60.0)
    82  	SetUserAgent("req-test", "5", "Test/5.1.1", "Magic/4.2.1")
    83  
    84  	go runHTTPServer(s, c)
    85  
    86  	time.Sleep(time.Second)
    87  }
    88  
    89  func (s *ReqSuite) TearDownSuite(c *C) {
    90  	if s.listener != nil {
    91  		s.listener.Close()
    92  	}
    93  }
    94  
    95  func (s *ReqSuite) TestMethodGet(c *C) {
    96  	getResp, err := Request{URL: s.url + _URL_GET, Method: GET}.Do()
    97  
    98  	c.Assert(err, IsNil)
    99  	c.Assert(getResp.StatusCode, Equals, 200)
   100  
   101  	getResp, err = Global.Do(Request{URL: s.url + _URL_GET, Method: GET})
   102  
   103  	c.Assert(err, IsNil)
   104  	c.Assert(getResp.StatusCode, Equals, 200)
   105  
   106  	getResp, err = Request{URL: s.url + _URL_GET}.Do()
   107  
   108  	c.Assert(err, IsNil)
   109  	c.Assert(getResp.StatusCode, Equals, 200)
   110  
   111  	getResp, err = Request{URL: s.url + _URL_GET}.Get()
   112  
   113  	c.Assert(err, IsNil)
   114  	c.Assert(getResp.StatusCode, Equals, 200)
   115  
   116  	getResp, err = Global.Get(Request{URL: s.url + _URL_GET})
   117  
   118  	c.Assert(err, IsNil)
   119  	c.Assert(getResp.StatusCode, Equals, 200)
   120  }
   121  
   122  func (s *ReqSuite) TestMethodPost(c *C) {
   123  	postResp, err := Request{URL: s.url + _URL_POST, Method: POST}.Do()
   124  
   125  	c.Assert(err, IsNil)
   126  	c.Assert(postResp.StatusCode, Equals, 200)
   127  
   128  	postResp, err = Global.Do(Request{URL: s.url + _URL_POST, Method: POST})
   129  
   130  	c.Assert(err, IsNil)
   131  	c.Assert(postResp.StatusCode, Equals, 200)
   132  
   133  	postResp, err = Request{URL: s.url + _URL_POST}.Post()
   134  
   135  	c.Assert(err, IsNil)
   136  	c.Assert(postResp.StatusCode, Equals, 200)
   137  
   138  	postResp, err = Global.Post(Request{URL: s.url + _URL_POST})
   139  
   140  	c.Assert(err, IsNil)
   141  	c.Assert(postResp.StatusCode, Equals, 200)
   142  }
   143  
   144  func (s *ReqSuite) TestMethodPostFile(c *C) {
   145  	tmpDir := c.MkDir()
   146  	tmpFile := tmpDir + "/testMultipart.bin"
   147  
   148  	err := ioutil.WriteFile(tmpFile, []byte(`DATA8913FIN`), 0644)
   149  
   150  	r := Request{URL: s.url + _URL_POST_MULTI, Method: POST}
   151  	postResp, err := r.PostFile(tmpFile, "file", map[string]string{"abc": "123"})
   152  
   153  	c.Assert(err, IsNil)
   154  	c.Assert(postResp.StatusCode, Equals, 200)
   155  
   156  	postResp, err = r.PostFile(tmpDir+"/unknown", "file", map[string]string{"abc": "123"})
   157  
   158  	c.Assert(err, NotNil)
   159  
   160  	useFakeFormGenerator = true
   161  	postResp, err = r.PostFile(tmpFile, "file", map[string]string{"abc": "123"})
   162  
   163  	c.Assert(err, NotNil)
   164  
   165  	useFakeFormGenerator = false
   166  
   167  	ioCopyFunc = func(dst io.Writer, src io.Reader) (int64, error) { return 0, errors.New("") }
   168  	postResp, err = r.PostFile(tmpFile, "file", map[string]string{"abc": "123"})
   169  
   170  	c.Assert(err, NotNil)
   171  }
   172  
   173  func (s *ReqSuite) TestMethodPut(c *C) {
   174  	putResp, err := Request{URL: s.url + _URL_PUT, Method: PUT}.Do()
   175  
   176  	c.Assert(err, IsNil)
   177  	c.Assert(putResp.StatusCode, Equals, 200)
   178  
   179  	putResp, err = Global.Do(Request{URL: s.url + _URL_PUT, Method: PUT})
   180  
   181  	c.Assert(err, IsNil)
   182  	c.Assert(putResp.StatusCode, Equals, 200)
   183  
   184  	putResp, err = Request{URL: s.url + _URL_PUT}.Put()
   185  
   186  	c.Assert(err, IsNil)
   187  	c.Assert(putResp.StatusCode, Equals, 200)
   188  
   189  	putResp, err = Global.Put(Request{URL: s.url + _URL_PUT})
   190  
   191  	c.Assert(err, IsNil)
   192  	c.Assert(putResp.StatusCode, Equals, 200)
   193  }
   194  
   195  func (s *ReqSuite) TestMethodHead(c *C) {
   196  	headResp, err := Request{URL: s.url + _URL_HEAD, Method: HEAD}.Do()
   197  
   198  	c.Assert(err, IsNil)
   199  	c.Assert(headResp.StatusCode, Equals, 200)
   200  
   201  	headResp, err = Global.Do(Request{URL: s.url + _URL_HEAD, Method: HEAD})
   202  
   203  	c.Assert(err, IsNil)
   204  	c.Assert(headResp.StatusCode, Equals, 200)
   205  
   206  	headResp, err = Request{URL: s.url + _URL_HEAD}.Head()
   207  
   208  	c.Assert(err, IsNil)
   209  	c.Assert(headResp.StatusCode, Equals, 200)
   210  
   211  	headResp, err = Global.Head(Request{URL: s.url + _URL_HEAD})
   212  
   213  	c.Assert(err, IsNil)
   214  	c.Assert(headResp.StatusCode, Equals, 200)
   215  }
   216  
   217  func (s *ReqSuite) TestMethodPatch(c *C) {
   218  	patchResp, err := Request{URL: s.url + _URL_PATCH, Method: PATCH}.Do()
   219  
   220  	c.Assert(err, IsNil)
   221  	c.Assert(patchResp.StatusCode, Equals, 200)
   222  
   223  	patchResp, err = Global.Do(Request{URL: s.url + _URL_PATCH, Method: PATCH})
   224  
   225  	c.Assert(err, IsNil)
   226  	c.Assert(patchResp.StatusCode, Equals, 200)
   227  
   228  	patchResp, err = Request{URL: s.url + _URL_PATCH}.Patch()
   229  
   230  	c.Assert(err, IsNil)
   231  	c.Assert(patchResp.StatusCode, Equals, 200)
   232  
   233  	patchResp, err = Global.Patch(Request{URL: s.url + _URL_PATCH})
   234  
   235  	c.Assert(err, IsNil)
   236  	c.Assert(patchResp.StatusCode, Equals, 200)
   237  }
   238  
   239  func (s *ReqSuite) TestMethodDelete(c *C) {
   240  	deleteResp, err := Request{URL: s.url + _URL_DELETE, Method: DELETE}.Do()
   241  
   242  	c.Assert(err, IsNil)
   243  	c.Assert(deleteResp.StatusCode, Equals, 200)
   244  
   245  	deleteResp, err = Global.Do(Request{URL: s.url + _URL_DELETE, Method: DELETE})
   246  
   247  	c.Assert(err, IsNil)
   248  	c.Assert(deleteResp.StatusCode, Equals, 200)
   249  
   250  	deleteResp, err = Request{URL: s.url + _URL_DELETE}.Delete()
   251  
   252  	c.Assert(err, IsNil)
   253  	c.Assert(deleteResp.StatusCode, Equals, 200)
   254  
   255  	deleteResp, err = Global.Delete(Request{URL: s.url + _URL_DELETE})
   256  
   257  	c.Assert(err, IsNil)
   258  	c.Assert(deleteResp.StatusCode, Equals, 200)
   259  }
   260  
   261  func (s *ReqSuite) TestQuery(c *C) {
   262  	resp, err := Request{
   263  		URL: s.url + _URL_QUERY,
   264  		Query: Query{
   265  			"test01": "john",
   266  			"test02": 1398,
   267  			"test03": true,
   268  			"test04": false,
   269  			"test05": int(1),
   270  			"test06": int8(2),
   271  			"test07": int16(3),
   272  			"test08": int32(4),
   273  			"test09": int64(5),
   274  			"test10": uint(6),
   275  			"test11": uint8(7),
   276  			"test12": uint16(8),
   277  			"test13": uint32(9),
   278  			"test14": uint64(10),
   279  			"test15": float32(12.35),
   280  			"test16": float64(56.7895),
   281  			"test17": "",
   282  			"test18": nil,
   283  		},
   284  	}.Do()
   285  
   286  	c.Assert(err, IsNil)
   287  	c.Assert(resp.StatusCode, Equals, 200)
   288  }
   289  
   290  func (s *ReqSuite) TestHeaders(c *C) {
   291  	resp, err := Request{
   292  		URL: s.url + _URL_HEADERS,
   293  		Headers: Headers{
   294  			"Header1": "Value1",
   295  			"Header2": "Value2",
   296  		},
   297  	}.Do()
   298  
   299  	c.Assert(err, IsNil)
   300  	c.Assert(resp.StatusCode, Equals, 200)
   301  }
   302  
   303  func (s *ReqSuite) TestContentType(c *C) {
   304  	resp, err := Request{
   305  		URL:         s.url + _URL_CONTENT_TYPE,
   306  		ContentType: _TEST_CONTENT_TYPE,
   307  	}.Do()
   308  
   309  	c.Assert(err, IsNil)
   310  	c.Assert(resp.StatusCode, Equals, 200)
   311  }
   312  
   313  func (s *ReqSuite) TestAccept(c *C) {
   314  	resp, err := Request{
   315  		URL:    s.url + _URL_ACCEPT,
   316  		Accept: _TEST_ACCEPT,
   317  	}.Do()
   318  
   319  	c.Assert(err, IsNil)
   320  	c.Assert(resp.StatusCode, Equals, 200)
   321  }
   322  
   323  func (s *ReqSuite) TestClose(c *C) {
   324  	getResp, err := Request{
   325  		URL:   s.url + _URL_GET,
   326  		Close: true,
   327  	}.Get()
   328  
   329  	c.Assert(err, IsNil)
   330  	c.Assert(getResp.StatusCode, Equals, 200)
   331  }
   332  
   333  func (s *ReqSuite) TestUserAgent(c *C) {
   334  	resp, err := Request{
   335  		URL: s.url + _URL_USER_AGENT,
   336  	}.Do()
   337  
   338  	c.Assert(err, IsNil)
   339  	c.Assert(resp.StatusCode, Equals, 200)
   340  }
   341  
   342  func (s *ReqSuite) TestBasicAuth(c *C) {
   343  	resp, err := Request{
   344  		URL:               s.url + _URL_BASIC_AUTH,
   345  		BasicAuthUsername: _TEST_BASIC_AUTH_USER,
   346  		BasicAuthPassword: _TEST_BASIC_AUTH_PASS,
   347  	}.Do()
   348  
   349  	c.Assert(err, IsNil)
   350  	c.Assert(resp.StatusCode, Equals, 200)
   351  }
   352  
   353  func (s *ReqSuite) TestStringResp(c *C) {
   354  	resp, err := Request{
   355  		URL: s.url + _URL_STRING_RESP,
   356  	}.Do()
   357  
   358  	c.Assert(err, IsNil)
   359  	c.Assert(resp.StatusCode, Equals, 200)
   360  	c.Assert(resp.String(), Equals, _TEST_STRING_RESP)
   361  }
   362  
   363  func (s *ReqSuite) TestBytesResp(c *C) {
   364  	resp, err := Request{
   365  		URL: s.url + _URL_STRING_RESP,
   366  	}.Do()
   367  
   368  	c.Assert(err, IsNil)
   369  	c.Assert(resp.StatusCode, Equals, 200)
   370  	c.Assert(resp.Bytes(), DeepEquals, []byte(_TEST_STRING_RESP))
   371  }
   372  
   373  func (s *ReqSuite) TestJSONResp(c *C) {
   374  	resp, err := Request{
   375  		URL: s.url + _URL_JSON_RESP,
   376  	}.Do()
   377  
   378  	c.Assert(err, IsNil)
   379  	c.Assert(resp.StatusCode, Equals, 200)
   380  
   381  	testStruct := &TestStruct{}
   382  
   383  	err = resp.JSON(testStruct)
   384  
   385  	c.Assert(err, IsNil)
   386  	c.Assert(testStruct.String, Equals, "test")
   387  	c.Assert(testStruct.Integer, Equals, 912)
   388  	c.Assert(testStruct.Boolean, Equals, true)
   389  }
   390  
   391  func (s *ReqSuite) TestDiscard(c *C) {
   392  	resp, err := Request{
   393  		URL: s.url + _URL_JSON_RESP,
   394  	}.Do()
   395  
   396  	c.Assert(err, IsNil)
   397  	c.Assert(resp.StatusCode, Equals, 200)
   398  
   399  	resp.Discard()
   400  
   401  	resp, err = Request{
   402  		URL:         s.url + _URL_DISCARD,
   403  		AutoDiscard: true,
   404  	}.Do()
   405  
   406  	c.Assert(err, IsNil)
   407  	c.Assert(resp.StatusCode, Equals, 500)
   408  }
   409  
   410  func (s *ReqSuite) TestEncoding(c *C) {
   411  	resp, err := Request{
   412  		URL:  s.url + "/404",
   413  		Body: "DEADBEAF",
   414  	}.Do()
   415  
   416  	c.Assert(err, IsNil)
   417  	c.Assert(resp, NotNil)
   418  
   419  	resp, err = Request{
   420  		URL:  s.url + "/404",
   421  		Body: []byte("DEADBEAF"),
   422  	}.Do()
   423  
   424  	c.Assert(err, IsNil)
   425  	c.Assert(resp, NotNil)
   426  
   427  	r := bytes.NewReader([]byte("DEADBEAF"))
   428  
   429  	resp, err = Request{
   430  		URL:  s.url + "/404",
   431  		Body: r,
   432  	}.Do()
   433  
   434  	c.Assert(err, IsNil)
   435  	c.Assert(resp, NotNil)
   436  
   437  	k := struct{ t string }{"DEADBEAF"}
   438  
   439  	resp, err = Request{
   440  		URL:  s.url + "/404",
   441  		Body: k,
   442  	}.Do()
   443  
   444  	c.Assert(err, IsNil)
   445  	c.Assert(resp, NotNil)
   446  
   447  	resp, err = Request{
   448  		URL:  s.url + "/404",
   449  		Body: func() { return },
   450  	}.Do()
   451  
   452  	c.Assert(err, NotNil)
   453  	c.Assert(resp, IsNil)
   454  }
   455  
   456  func (s *ReqSuite) TestRequestErrors(c *C) {
   457  	resp, err := Request{}.Do()
   458  
   459  	c.Assert(resp, IsNil)
   460  	c.Assert(err, NotNil)
   461  
   462  	resp, err = Request{URL: "ABCD"}.Do()
   463  
   464  	c.Assert(resp, IsNil)
   465  	c.Assert(err, NotNil)
   466  
   467  	resp, err = Request{URL: "http://127.0.0.1:60000"}.Do()
   468  
   469  	c.Assert(resp, IsNil)
   470  	c.Assert(err, NotNil)
   471  
   472  	resp, err = Request{URL: "%gh&%ij"}.Do()
   473  
   474  	c.Assert(resp, IsNil)
   475  	c.Assert(err, NotNil)
   476  
   477  	resp, err = Request{Method: "ЩУП", URL: "http://127.0.0.1"}.Do()
   478  
   479  	c.Assert(resp, IsNil)
   480  	c.Assert(err, NotNil)
   481  
   482  	e1 := RequestError{ERROR_BODY_ENCODE, "Test 1"}
   483  	e2 := RequestError{ERROR_CREATE_REQUEST, "Test 2"}
   484  	e3 := RequestError{ERROR_SEND_REQUEST, "Test 3"}
   485  
   486  	c.Assert(e1.Error(), Equals, "Can't encode request body (Test 1)")
   487  	c.Assert(e2.Error(), Equals, "Can't create request struct (Test 2)")
   488  	c.Assert(e3.Error(), Equals, "Can't send request (Test 3)")
   489  }
   490  
   491  func (s *ReqSuite) TestEngineInit(c *C) {
   492  	var eng *Engine
   493  
   494  	eng = &Engine{}
   495  	eng.Init()
   496  
   497  	eng = &Engine{Transport: &http.Transport{}}
   498  	eng.Init()
   499  }
   500  
   501  func (s *ReqSuite) TestEngineErrors(c *C) {
   502  	var eng *Engine
   503  
   504  	resp, err := eng.Do(Request{URL: "https://essentialkaos.com"})
   505  
   506  	c.Assert(err, NotNil)
   507  	c.Assert(resp, IsNil)
   508  
   509  	eng = &Engine{}
   510  	eng.Init()
   511  
   512  	eng.Dialer = nil
   513  
   514  	resp, err = eng.Do(Request{URL: "https://essentialkaos.com"})
   515  
   516  	c.Assert(err, NotNil)
   517  	c.Assert(resp, IsNil)
   518  
   519  	eng = &Engine{}
   520  	eng.Init()
   521  	eng.Transport = nil
   522  
   523  	resp, err = eng.Do(Request{URL: "https://essentialkaos.com"})
   524  
   525  	c.Assert(err, NotNil)
   526  	c.Assert(resp, IsNil)
   527  
   528  	eng = &Engine{}
   529  	eng.Init()
   530  	eng.Init()
   531  	eng.Client = nil
   532  
   533  	resp, err = eng.Do(Request{URL: "https://essentialkaos.com"})
   534  
   535  	c.Assert(err, NotNil)
   536  	c.Assert(resp, IsNil)
   537  }
   538  
   539  func (s *ReqSuite) TestIsURL(c *C) {
   540  	c.Assert(isURL(""), Equals, false)
   541  	c.Assert(isURL("http://domain.com"), Equals, true)
   542  	c.Assert(isURL("https://domain.com"), Equals, true)
   543  	c.Assert(isURL("ftp://domain.com"), Equals, true)
   544  	c.Assert(isURL("test://domain.com"), Equals, false)
   545  }
   546  
   547  func (s *ReqSuite) TestQueryEncoding(c *C) {
   548  	q := Query{}
   549  	c.Assert(q.Encode(), Equals, "")
   550  
   551  	q = Query{
   552  		"a": 1,
   553  		"b": "abcd",
   554  		"c": "",
   555  		"d": nil,
   556  	}
   557  
   558  	qr := strings.Split(q.Encode(), "&")
   559  	sort.Strings(qr)
   560  	qrs := strings.Join(qr, "&")
   561  
   562  	c.Assert(qrs, Equals, "a=1&b=abcd&c&d")
   563  }
   564  
   565  func (s *ReqSuite) BenchmarkGetOk(c *C) {
   566  	for i := 0; i < c.N; i++ {
   567  		getResp, err := Request{URL: s.url + _URL_GET, Method: GET}.Do()
   568  
   569  		c.Assert(err, IsNil)
   570  		c.Assert(getResp.StatusCode, Equals, 200)
   571  	}
   572  }
   573  
   574  func (s *ReqSuite) BenchmarkGetErr(c *C) {
   575  	for i := 0; i < c.N; i++ {
   576  		Request{URL: "--", Method: GET}.Do()
   577  	}
   578  }
   579  
   580  // ////////////////////////////////////////////////////////////////////////////////// //
   581  
   582  func runHTTPServer(s *ReqSuite, c *C) {
   583  	server := &http.Server{
   584  		Handler:        http.NewServeMux(),
   585  		ReadTimeout:    10 * time.Second,
   586  		WriteTimeout:   10 * time.Second,
   587  		MaxHeaderBytes: 1 << 20,
   588  	}
   589  
   590  	listener, err := net.Listen("tcp", ":"+s.port)
   591  
   592  	if err != nil {
   593  		c.Fatal(err.Error())
   594  	}
   595  
   596  	s.listener = listener
   597  
   598  	server.Handler.(*http.ServeMux).HandleFunc(_URL_GET, getRequestHandler)
   599  	server.Handler.(*http.ServeMux).HandleFunc(_URL_POST, postRequestHandler)
   600  	server.Handler.(*http.ServeMux).HandleFunc(_URL_POST_MULTI, postMultiRequestHandler)
   601  	server.Handler.(*http.ServeMux).HandleFunc(_URL_PUT, putRequestHandler)
   602  	server.Handler.(*http.ServeMux).HandleFunc(_URL_HEAD, headRequestHandler)
   603  	server.Handler.(*http.ServeMux).HandleFunc(_URL_PATCH, patchRequestHandler)
   604  	server.Handler.(*http.ServeMux).HandleFunc(_URL_DELETE, deleteRequestHandler)
   605  	server.Handler.(*http.ServeMux).HandleFunc(_URL_QUERY, queryRequestHandler)
   606  	server.Handler.(*http.ServeMux).HandleFunc(_URL_HEADERS, headersRequestHandler)
   607  	server.Handler.(*http.ServeMux).HandleFunc(_URL_CONTENT_TYPE, contentTypeRequestHandler)
   608  	server.Handler.(*http.ServeMux).HandleFunc(_URL_ACCEPT, acceptRequestHandler)
   609  	server.Handler.(*http.ServeMux).HandleFunc(_URL_USER_AGENT, uaRequestHandler)
   610  	server.Handler.(*http.ServeMux).HandleFunc(_URL_BASIC_AUTH, basicAuthRequestHandler)
   611  	server.Handler.(*http.ServeMux).HandleFunc(_URL_STRING_RESP, stringRespRequestHandler)
   612  	server.Handler.(*http.ServeMux).HandleFunc(_URL_JSON_RESP, jsonRespRequestHandler)
   613  	server.Handler.(*http.ServeMux).HandleFunc(_URL_DISCARD, discardRequestHandler)
   614  
   615  	err = server.Serve(listener)
   616  
   617  	if err != nil {
   618  		c.Fatal(err.Error())
   619  	}
   620  }
   621  
   622  func getRequestHandler(w http.ResponseWriter, r *http.Request) {
   623  	if r.Method != GET {
   624  		w.WriteHeader(801)
   625  		return
   626  	}
   627  
   628  	w.WriteHeader(200)
   629  }
   630  
   631  func postRequestHandler(w http.ResponseWriter, r *http.Request) {
   632  	if r.Method != POST {
   633  		w.WriteHeader(802)
   634  		return
   635  	}
   636  
   637  	w.WriteHeader(200)
   638  }
   639  
   640  func postMultiRequestHandler(w http.ResponseWriter, r *http.Request) {
   641  	if r.Method != POST {
   642  		w.WriteHeader(802)
   643  		return
   644  	}
   645  
   646  	f, h, err := r.FormFile("file")
   647  
   648  	if f == nil {
   649  		w.WriteHeader(851)
   650  		return
   651  	}
   652  
   653  	if h == nil {
   654  		w.WriteHeader(852)
   655  		return
   656  	}
   657  
   658  	if err != nil {
   659  		w.WriteHeader(853)
   660  		return
   661  	}
   662  
   663  	w.WriteHeader(200)
   664  }
   665  
   666  func putRequestHandler(w http.ResponseWriter, r *http.Request) {
   667  	if r.Method != PUT {
   668  		w.WriteHeader(803)
   669  		return
   670  	}
   671  
   672  	w.WriteHeader(200)
   673  }
   674  func headRequestHandler(w http.ResponseWriter, r *http.Request) {
   675  	if r.Method != HEAD {
   676  		w.WriteHeader(804)
   677  		return
   678  	}
   679  
   680  	w.WriteHeader(200)
   681  }
   682  
   683  func patchRequestHandler(w http.ResponseWriter, r *http.Request) {
   684  	if r.Method != PATCH {
   685  		w.WriteHeader(805)
   686  		return
   687  	}
   688  
   689  	w.WriteHeader(200)
   690  }
   691  
   692  func deleteRequestHandler(w http.ResponseWriter, r *http.Request) {
   693  	if r.Method != DELETE {
   694  		w.WriteHeader(806)
   695  		return
   696  	}
   697  
   698  	w.WriteHeader(200)
   699  }
   700  
   701  func queryRequestHandler(w http.ResponseWriter, r *http.Request) {
   702  	query := r.URL.Query()
   703  
   704  	switch {
   705  	case query.Get("test01") != "john":
   706  		w.WriteHeader(901)
   707  		return
   708  	case query.Get("test02") != "1398":
   709  		w.WriteHeader(902)
   710  		return
   711  	case query.Get("test03") != "true":
   712  		w.WriteHeader(903)
   713  		return
   714  	case query.Get("test04") != "false":
   715  		w.WriteHeader(904)
   716  		return
   717  	case query.Get("test05") != "1":
   718  		w.WriteHeader(905)
   719  		return
   720  	case query.Get("test06") != "2":
   721  		w.WriteHeader(906)
   722  		return
   723  	case query.Get("test07") != "3":
   724  		w.WriteHeader(907)
   725  		return
   726  	case query.Get("test08") != "4":
   727  		w.WriteHeader(908)
   728  		return
   729  	case query.Get("test09") != "5":
   730  		w.WriteHeader(909)
   731  		return
   732  	case query.Get("test10") != "6":
   733  		w.WriteHeader(910)
   734  		return
   735  	case query.Get("test11") != "7":
   736  		w.WriteHeader(911)
   737  		return
   738  	case query.Get("test12") != "8":
   739  		w.WriteHeader(912)
   740  		return
   741  	case query.Get("test13") != "9":
   742  		w.WriteHeader(913)
   743  		return
   744  	case query.Get("test14") != "10":
   745  		w.WriteHeader(914)
   746  		return
   747  	case query.Get("test15") != "12.35":
   748  		w.WriteHeader(915)
   749  		return
   750  	case query.Get("test16") != "56.7895":
   751  		w.WriteHeader(916)
   752  		return
   753  	}
   754  
   755  	_, test17 := query["test17"]
   756  
   757  	if !test17 {
   758  		w.WriteHeader(917)
   759  		return
   760  	}
   761  
   762  	_, test18 := query["test18"]
   763  
   764  	if !test18 {
   765  		w.WriteHeader(918)
   766  		return
   767  	}
   768  
   769  	w.WriteHeader(200)
   770  }
   771  
   772  func headersRequestHandler(w http.ResponseWriter, r *http.Request) {
   773  	header1 := r.Header["Header1"]
   774  
   775  	if len(header1) != 1 {
   776  		w.WriteHeader(910)
   777  		return
   778  	}
   779  
   780  	if header1[0] != "Value1" {
   781  		w.WriteHeader(911)
   782  		return
   783  	}
   784  
   785  	header2 := r.Header["Header2"]
   786  
   787  	if len(header2) != 1 {
   788  		w.WriteHeader(912)
   789  		return
   790  	}
   791  
   792  	if header2[0] != "Value2" {
   793  		w.WriteHeader(913)
   794  		return
   795  	}
   796  
   797  	w.WriteHeader(200)
   798  }
   799  
   800  func contentTypeRequestHandler(w http.ResponseWriter, r *http.Request) {
   801  	header := r.Header["Content-Type"]
   802  
   803  	if len(header) != 1 {
   804  		w.WriteHeader(920)
   805  		return
   806  	}
   807  
   808  	if header[0] != _TEST_CONTENT_TYPE {
   809  		w.WriteHeader(921)
   810  		return
   811  	}
   812  
   813  	w.WriteHeader(200)
   814  }
   815  
   816  func acceptRequestHandler(w http.ResponseWriter, r *http.Request) {
   817  	header := r.Header["Accept"]
   818  
   819  	if len(header) != 1 {
   820  		w.WriteHeader(930)
   821  		return
   822  	}
   823  
   824  	if header[0] != _TEST_ACCEPT {
   825  		w.WriteHeader(931)
   826  		return
   827  	}
   828  
   829  	w.WriteHeader(200)
   830  }
   831  
   832  func uaRequestHandler(w http.ResponseWriter, r *http.Request) {
   833  	if r.UserAgent() != Global.UserAgent {
   834  		w.WriteHeader(940)
   835  		return
   836  	}
   837  
   838  	w.WriteHeader(200)
   839  }
   840  
   841  func basicAuthRequestHandler(w http.ResponseWriter, r *http.Request) {
   842  	user, pass, ok := r.BasicAuth()
   843  
   844  	if !ok {
   845  		w.WriteHeader(950)
   846  		return
   847  	}
   848  
   849  	if user != _TEST_BASIC_AUTH_USER {
   850  		w.WriteHeader(951)
   851  		return
   852  	}
   853  
   854  	if pass != _TEST_BASIC_AUTH_PASS {
   855  		w.WriteHeader(952)
   856  		return
   857  	}
   858  
   859  	w.WriteHeader(200)
   860  }
   861  
   862  func stringRespRequestHandler(w http.ResponseWriter, r *http.Request) {
   863  	w.Write([]byte(_TEST_STRING_RESP))
   864  }
   865  
   866  func jsonRespRequestHandler(w http.ResponseWriter, r *http.Request) {
   867  	w.Write([]byte(`{
   868    "string": "test",
   869    "integer": 912,
   870    "boolean": true }`,
   871  	))
   872  }
   873  
   874  func discardRequestHandler(w http.ResponseWriter, r *http.Request) {
   875  	w.WriteHeader(500)
   876  
   877  	w.Write([]byte(`{
   878    "string": "test",
   879    "integer": 912,
   880    "boolean": true }`,
   881  	))
   882  }