mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-13 22:05:59 +00:00
Merge pull request #76551 from JieJhih/proxy/transport
support deflate encoding reader
This commit is contained in:
commit
7929c15ec7
@ -18,6 +18,7 @@ package proxy
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"compress/flate"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@ -231,7 +232,18 @@ func (t *Transport) rewriteResponse(req *http.Request, resp *http.Response) (*ht
|
|||||||
gzw := gzip.NewWriter(writer)
|
gzw := gzip.NewWriter(writer)
|
||||||
defer gzw.Close()
|
defer gzw.Close()
|
||||||
writer = gzw
|
writer = gzw
|
||||||
// TODO: support flate, other encodings.
|
case "deflate":
|
||||||
|
var err error
|
||||||
|
reader = flate.NewReader(reader)
|
||||||
|
flw, err := flate.NewWriter(writer, flate.BestCompression)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("errorf making flate writer: %v", err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
flw.Close()
|
||||||
|
flw.Flush()
|
||||||
|
}()
|
||||||
|
writer = flw
|
||||||
case "":
|
case "":
|
||||||
// This is fine
|
// This is fine
|
||||||
default:
|
default:
|
||||||
|
@ -17,6 +17,9 @@ limitations under the License.
|
|||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"compress/flate"
|
||||||
|
"compress/gzip"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -274,3 +277,83 @@ func TestProxyTransport(t *testing.T) {
|
|||||||
testItem(name, &item)
|
testItem(name, &item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRewriteResponse(t *testing.T) {
|
||||||
|
gzipbuf := bytes.NewBuffer(nil)
|
||||||
|
flatebuf := bytes.NewBuffer(nil)
|
||||||
|
|
||||||
|
testTransport := &Transport{
|
||||||
|
Scheme: "http",
|
||||||
|
Host: "foo.com",
|
||||||
|
PathPrepend: "/proxy/node/node1:10250",
|
||||||
|
}
|
||||||
|
expected := []string{
|
||||||
|
"short body test",
|
||||||
|
strings.Repeat("long body test", 4097),
|
||||||
|
}
|
||||||
|
test := []struct {
|
||||||
|
encodeType string
|
||||||
|
writer func(string) *http.Response
|
||||||
|
reader func(*http.Response) string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
encodeType: "gzip",
|
||||||
|
writer: func(ept string) *http.Response {
|
||||||
|
gzw := gzip.NewWriter(gzipbuf)
|
||||||
|
defer gzw.Close()
|
||||||
|
|
||||||
|
gzw.Write([]byte(ept))
|
||||||
|
gzw.Flush()
|
||||||
|
return &http.Response{
|
||||||
|
Body: ioutil.NopCloser(gzipbuf),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
reader: func(rep *http.Response) string {
|
||||||
|
reader, _ := gzip.NewReader(rep.Body)
|
||||||
|
s, _ := ioutil.ReadAll(reader)
|
||||||
|
return string(s)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
encodeType: "deflate",
|
||||||
|
writer: func(ept string) *http.Response {
|
||||||
|
flw, _ := flate.NewWriter(flatebuf, flate.BestCompression)
|
||||||
|
defer flw.Close()
|
||||||
|
|
||||||
|
flw.Write([]byte(ept))
|
||||||
|
flw.Flush()
|
||||||
|
return &http.Response{
|
||||||
|
Body: ioutil.NopCloser(flatebuf),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
reader: func(rep *http.Response) string {
|
||||||
|
reader := flate.NewReader(rep.Body)
|
||||||
|
s, _ := ioutil.ReadAll(reader)
|
||||||
|
return string(s)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
errFn := func(encode string, err error) {
|
||||||
|
t.Errorf("%s failed to read and write: %v", encode, err)
|
||||||
|
}
|
||||||
|
for _, v := range test {
|
||||||
|
request, _ := http.NewRequest("GET", "http://mynode.com/", nil)
|
||||||
|
request.Header.Set("Content-Encoding", v.encodeType)
|
||||||
|
request.Header.Add("Accept-Encoding", v.encodeType)
|
||||||
|
|
||||||
|
for _, exp := range expected {
|
||||||
|
resp := v.writer(exp)
|
||||||
|
gotResponse, err := testTransport.rewriteResponse(request, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
errFn(v.encodeType, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := v.reader(gotResponse)
|
||||||
|
if result != exp {
|
||||||
|
errFn(v.encodeType, fmt.Errorf("expected %s, get %s", exp, result))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user