| 
									
										
										
										
											2018-08-27 22:55:49 +08:00
										 |  |  | // Copyright 2016 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package httputil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"compress/gzip" | 
					
						
							|  |  |  | 	"compress/zlib" | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"net/http/httptest" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	mux    *http.ServeMux | 
					
						
							|  |  |  | 	server *httptest.Server | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func setup() func() { | 
					
						
							|  |  |  | 	mux = http.NewServeMux() | 
					
						
							|  |  |  | 	server = httptest.NewServer(mux) | 
					
						
							|  |  |  | 	return func() { | 
					
						
							|  |  |  | 		server.Close() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func getCompressionHandlerFunc() CompressionHandler { | 
					
						
							|  |  |  | 	hf := func(w http.ResponseWriter, r *http.Request) { | 
					
						
							|  |  |  | 		w.WriteHeader(http.StatusOK) | 
					
						
							|  |  |  | 		w.Write([]byte("Hello World!")) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return CompressionHandler{ | 
					
						
							|  |  |  | 		Handler: http.HandlerFunc(hf), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestCompressionHandler_PlainText(t *testing.T) { | 
					
						
							|  |  |  | 	tearDown := setup() | 
					
						
							|  |  |  | 	defer tearDown() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ch := getCompressionHandlerFunc() | 
					
						
							|  |  |  | 	mux.Handle("/foo_endpoint", ch) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	client := &http.Client{ | 
					
						
							|  |  |  | 		Transport: &http.Transport{ | 
					
						
							|  |  |  | 			DisableCompression: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	resp, err := client.Get(server.URL + "/foo_endpoint") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error("client get failed with unexpected error") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer resp.Body.Close() | 
					
						
							|  |  |  | 	contents, err := ioutil.ReadAll(resp.Body) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Errorf("unexpected error while reading the response body: %s", err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	expected := "Hello World!" | 
					
						
							|  |  |  | 	actual := string(contents) | 
					
						
							|  |  |  | 	if expected != actual { | 
					
						
							|  |  |  | 		t.Errorf("expected response with content %s, but got %s", expected, actual) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestCompressionHandler_Gzip(t *testing.T) { | 
					
						
							|  |  |  | 	tearDown := setup() | 
					
						
							|  |  |  | 	defer tearDown() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ch := getCompressionHandlerFunc() | 
					
						
							|  |  |  | 	mux.Handle("/foo_endpoint", ch) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	client := &http.Client{ | 
					
						
							|  |  |  | 		Transport: &http.Transport{ | 
					
						
							|  |  |  | 			DisableCompression: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	req, _ := http.NewRequest("GET", server.URL+"/foo_endpoint", nil) | 
					
						
							|  |  |  | 	req.Header.Set(acceptEncodingHeader, gzipEncoding) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	resp, err := client.Do(req) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error("client get failed with unexpected error") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer resp.Body.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Errorf("unexpected error while reading the response body: %s", err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	actualHeader := resp.Header.Get(contentEncodingHeader) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if actualHeader != gzipEncoding { | 
					
						
							|  |  |  | 		t.Errorf("expected response with encoding header %s, but got %s", gzipEncoding, actualHeader) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var buf bytes.Buffer | 
					
						
							|  |  |  | 	zr, _ := gzip.NewReader(resp.Body) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_, err = buf.ReadFrom(zr) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error("unexpected error while reading from response body") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-04 21:47:38 +08:00
										 |  |  | 	actual := buf.String() | 
					
						
							| 
									
										
										
										
											2018-08-27 22:55:49 +08:00
										 |  |  | 	expected := "Hello World!" | 
					
						
							|  |  |  | 	if expected != actual { | 
					
						
							|  |  |  | 		t.Errorf("expected response with content %s, but got %s", expected, actual) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestCompressionHandler_Deflate(t *testing.T) { | 
					
						
							|  |  |  | 	tearDown := setup() | 
					
						
							|  |  |  | 	defer tearDown() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ch := getCompressionHandlerFunc() | 
					
						
							|  |  |  | 	mux.Handle("/foo_endpoint", ch) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	client := &http.Client{ | 
					
						
							|  |  |  | 		Transport: &http.Transport{ | 
					
						
							|  |  |  | 			DisableCompression: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	req, _ := http.NewRequest("GET", server.URL+"/foo_endpoint", nil) | 
					
						
							|  |  |  | 	req.Header.Set(acceptEncodingHeader, deflateEncoding) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	resp, err := client.Do(req) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error("client get failed with unexpected error") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer resp.Body.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Errorf("unexpected error while reading the response body: %s", err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	actualHeader := resp.Header.Get(contentEncodingHeader) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if actualHeader != deflateEncoding { | 
					
						
							|  |  |  | 		t.Errorf("expected response with encoding header %s, but got %s", deflateEncoding, actualHeader) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var buf bytes.Buffer | 
					
						
							|  |  |  | 	dr, err := zlib.NewReader(resp.Body) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error("unexpected error while reading from response body") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_, err = buf.ReadFrom(dr) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error("unexpected error while reading from response body") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-04 21:47:38 +08:00
										 |  |  | 	actual := buf.String() | 
					
						
							| 
									
										
										
										
											2018-08-27 22:55:49 +08:00
										 |  |  | 	expected := "Hello World!" | 
					
						
							|  |  |  | 	if expected != actual { | 
					
						
							|  |  |  | 		t.Errorf("expected response with content %s, but got %s", expected, actual) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |