@@ -21,20 +21,21 @@ func (responseWriter *wrappedWriter) WriteHeader(statusCode int) {
2121	* (responseWriter .statusCode ) =  statusCode 
2222}
2323
24- func encode ( bufferPool * sync. Pool ,  encoders map [ string ] Encoder ,  next  http. Handler ) http. Handler  { 
25- if len ( encoders )  == 0  { 
26- return next 
27- }
24+ // wrappedWriter doesnt support Flush method 
25+ // because its hard to implement Encoder with partial responses. 
26+ // func (*wrappedWriter) Flush() { 
27+ //  }
2828
29+ func  encode (bufferPool  * sync.Pool , encoders  map [string ]Encoder , next  http.Handler ) http.Handler  {
2930	return  http .HandlerFunc (func (responseWriter  http.ResponseWriter , request  * http.Request ) {
3031		header  :=  compactAndLow ([]byte (request .Header .Get ("Accept-Encoding" )))
31- 		if  len (header ) ==  0  {
32+ 		if  len (header ) ==  0  || request . Header . Get ( "Upgrade" )  != "" {
3233			next .ServeHTTP (responseWriter , request )
3334
3435			return 
3536		}
3637
37- 		encoder , okay  :=  getEncode (header , encoders )
38+ 		encoder , encodingType ,  okay  :=  getPreferedEncoder (header , encoders )
3839		if  ! okay  {
3940			next .ServeHTTP (responseWriter , request )
4041
@@ -54,11 +55,21 @@ func encode(bufferPool *sync.Pool, encoders map[string]Encoder, next http.Handle
5455
5556		upstreamResponseBody  :=  upstreamResponse .Bytes ()
5657
58+ 		if  responseWriter .Header ().Get ("Content-Encoding" ) !=  ""  { // already encoded 
59+ 			responseWriter .WriteHeader (statusCode )
60+ 61+ 			if  _ , err  :=  responseWriter .Write (upstreamResponseBody ); err  !=  nil  {
62+ 				http .Error (responseWriter , err .Error (), http .StatusInternalServerError )
63+ 			}
64+ 65+ 			return 
66+ 		}
67+ 5768		if  responseWriter .Header ().Get ("Content-Type" ) ==  ""  {
5869			responseWriter .Header ().Set ("Content-Type" , http .DetectContentType (upstreamResponseBody ))
5970		}
6071
61- 		responseWriter .Header ().Set ("Content-Encoding" , encoder . String () )
72+ 		responseWriter .Header ().Set ("Content-Encoding" , encodingType )
6273		responseWriter .Header ().Del ("Content-Length" )
6374		responseWriter .WriteHeader (statusCode )
6475
@@ -70,40 +81,38 @@ func encode(bufferPool *sync.Pool, encoders map[string]Encoder, next http.Handle
7081	})
7182}
7283
73- func  getEncode (acceptEncodingHeader  []byte , encoders  map [string ]Encoder ) (Encoder , bool ) {
84+ //nolint:ireturn // helper function 
85+ func  getPreferedEncoder (acceptEncodingHeader  []byte , encoders  map [string ]Encoder ) (Encoder , string , bool ) {
7486	var  (
75- 		preferedEncodeFunc  Encoder 
76- 		preferedQuality  int 
77- 		found  =  false 
78- 		encodingType  string 
79- 		qualityValue  int 
87+ 		preferedEncodingFunc  Encoder 
88+ 		preferedEncodingType  string 
89+ 		preferedQuality  int 
90+ 		found  =  false 
91+ 		encodingType  string 
92+ 		qualityValue  int 
8093	)
8194
8295	for  pos  :=  0 ; pos  <  len (acceptEncodingHeader ); pos ++  {
83- 		encodingType , pos  =  getNextEncodingType (acceptEncodingHeader , pos )
96+ 		encodingType , pos  =  getNextAcceptEncodingType (acceptEncodingHeader , pos )
8497		qualityValue , pos  =  getNextQualityValue (acceptEncodingHeader , pos )
8598
8699		encoder , exist  :=  encoders [encodingType ]
87100		if  exist  &&  preferedQuality  <  qualityValue  {
88101			preferedQuality  =  qualityValue 
89- 			preferedEncodeFunc  =  encoder 
90- 102+ 			preferedEncodingFunc  =  encoder 
103+ preferedEncodingType = encodingType 
91104			found  =  true 
92105		}
93106	}
94107
95- 	return  preferedEncodeFunc , found 
108+ 	return  preferedEncodingFunc ,  preferedEncodingType , found 
96109}
97110
98- func  getNextEncodingType (header  []byte , start  int ) (encodingType  string , newPosition  int ) {
111+ func  getNextAcceptEncodingType (header  []byte , start  int ) (encodingType  string , newPosition  int ) {
99112	for  start  <  len (header ) &&  ! isAlpha (header [start ]) {
100113		start ++ 
101114	}
102115
103- 	if  start  >=  len (header ) {
104- 		return  "" , start 
105- 	}
106- 107116	end  :=  start 
108117
109118	for  end  <  len (header ) &&  isAlpha (header [end ]) {
0 commit comments