github.com/useflyent/fhttp@v0.0.0-20211004035111-333f430cfbbf/http2/header_order_test.go (about)

     1  package http2
     2  
     3  import (
     4  	"bytes"
     5  	http "github.com/useflyent/fhttp"
     6  	"github.com/useflyent/fhttp/httptrace"
     7  	"log"
     8  	"strings"
     9  	"testing"
    10  )
    11  
    12  func TestHeaderOrder(t *testing.T) {
    13  	req, err := http.NewRequest("POST", "https://www.httpbin.org/headers", nil)
    14  	if err != nil {
    15  		t.Fatalf(err.Error())
    16  	}
    17  	req.Header = http.Header{
    18  		"sec-ch-ua":        {"\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"91\", \"Chromium\";v=\"91\""},
    19  		"accept":           {"*/*"},
    20  		"x-requested-with": {"XMLHttpRequest"},
    21  		"sec-ch-ua-mobile": {"?0"},
    22  		"user-agent":       {"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36\", \"I shouldn't be here"},
    23  		"content-type":     {"application/json"},
    24  		"origin":           {"https://www.size.co.uk/"},
    25  		"sec-fetch-site":   {"same-origin"},
    26  		"sec-fetch-mode":   {"cors"},
    27  		"sec-fetch-dest":   {"empty"},
    28  		"accept-language":  {"en-US,en;q=0.9"},
    29  		"accept-encoding":  {"gzip, deflate, br"},
    30  		"referer":          {"https://www.size.co.uk/product/white-jordan-air-1-retro-high/16077886/"},
    31  		http.HeaderOrderKey: {
    32  			"sec-ch-ua",
    33  			"accept",
    34  			"x-requested-with",
    35  			"sec-ch-ua-mobile",
    36  			"user-agent",
    37  			"content-type",
    38  			"sec-fetch-site",
    39  			"sec-fetch-mode",
    40  			"sec-fetch-dest",
    41  			"referer",
    42  			"accept-encoding",
    43  			"accept-language",
    44  		},
    45  		http.PHeaderOrderKey: {
    46  			":method",
    47  			":authority",
    48  			":scheme",
    49  			":path",
    50  		},
    51  	}
    52  	var b []byte
    53  	buf := bytes.NewBuffer(b)
    54  	err = req.Header.Write(buf)
    55  	if err != nil {
    56  		t.Fatalf(err.Error())
    57  	}
    58  	arr := strings.Split(buf.String(), "\n")
    59  	var hdrs []string
    60  	for _, v := range arr {
    61  		a := strings.Split(v, ":")
    62  		if a[0] == "" {
    63  			continue
    64  		}
    65  		hdrs = append(hdrs, a[0])
    66  	}
    67  
    68  	for i := range req.Header[http.HeaderOrderKey] {
    69  		if hdrs[i] != req.Header[http.HeaderOrderKey][i] {
    70  			t.Errorf("want: %s\ngot: %s\n", req.Header[http.HeaderOrderKey][i], hdrs[i])
    71  		}
    72  	}
    73  }
    74  
    75  func TestHeaderOrder2(t *testing.T) {
    76  	hk := ""
    77  	trace := &httptrace.ClientTrace{
    78  		WroteHeaderField: func(key string, values []string) {
    79  			hk += key + " "
    80  		},
    81  	}
    82  	req, err := http.NewRequest("GET", "https://httpbin.org/#/Request_inspection/get_headers", nil)
    83  	if err != nil {
    84  		t.Fatalf(err.Error())
    85  	}
    86  	req.Header.Add("experience", "pain")
    87  	req.Header.Add("grind", "harder")
    88  	req.Header.Add("live", "mas")
    89  	req.Header[http.HeaderOrderKey] = []string{"grind", "experience", "live"}
    90  	req.Header[http.PHeaderOrderKey] = []string{":method", ":authority", ":scheme", ":path"}
    91  	req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
    92  	tr := &Transport{}
    93  	resp, err := tr.RoundTrip(req)
    94  	if err != nil {
    95  		t.Fatal(err.Error())
    96  	}
    97  	defer resp.Body.Close()
    98  
    99  	eq := strings.EqualFold(hk, ":method :authority :scheme :path grind experience live accept-encoding user-agent ")
   100  	if !eq {
   101  		t.Fatalf("Header order not set properly, \n Got %v \n Want: %v", hk, ":method :authority :scheme :path grind experience live accept-encoding user-agent")
   102  	}
   103  }
   104  
   105  func TestHeaderOrder3(t *testing.T) {
   106  	req, err := http.NewRequest("GET", "https://google.com", nil)
   107  	if err != nil {
   108  		t.Fatalf(err.Error())
   109  	}
   110  	req.Header = http.Header{
   111  		http.HeaderOrderKey: {
   112  			"sec-ch-ua",
   113  			"accept",
   114  			"x-requested-with",
   115  			"sec-ch-ua-mobile",
   116  			"user-agent",
   117  			"sec-fetch-site",
   118  			"sec-fetch-mode",
   119  			"sec-fetch-dest",
   120  			"referer",
   121  			"accept-encoding",
   122  			"accept-language",
   123  			"cookie",
   124  		},
   125  	}
   126  	req.Header.Add("accept", "text / html, application/xhtml + xml, application / xml;q = 0.9, image/avif, image/webp, image/apng, * /*;q=0.8,application/signed-exchange;v=b3;q=0.9")
   127  	req.Header.Add("accept-encoding", "gzip, deflate, br")
   128  	req.Header.Add("accept-language", "en-GB,en-US;q=0.9,en;q=0.8")
   129  	req.Header.Add("cache-control", "no-cache")
   130  	req.Header.Add("pragma", "no-cache")
   131  	req.Header.Add("referer", "https://www.offspring.co.uk/")
   132  	req.Header.Add("sec-ch-ua", `" Not A;Brand"; v = "99", "Chromium"; v = "90", "Google Chrome"; v = "90"`)
   133  	req.Header.Add("sec-ch-ua-mobile", "?0")
   134  	req.Header.Add("sec-fetch-dest", "document")
   135  	req.Header.Add("sec-fetch-mode", "navigate")
   136  	req.Header.Add("sec-fetch-site", "same-origin")
   137  	req.Header.Add("sec-fetch-user", "?1")
   138  	req.Header.Add("upgrade-insecure-requests", "1")
   139  	req.Header.Add("user-agent", "Mozilla")
   140  	var hdrs string
   141  	trace := &httptrace.ClientTrace{WroteHeaderField: func(key string, value []string) {
   142  		hdrs += key + "\n"
   143  	}}
   144  	req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
   145  	tr := Transport{}
   146  	resp, err := tr.RoundTrip(req)
   147  	if err != nil {
   148  		t.Fatalf(err.Error())
   149  	}
   150  	defer resp.Body.Close()
   151  	log.Println(hdrs)
   152  }