Skip to content
This repository was archived by the owner on Nov 5, 2024. It is now read-only.

Commit c982175

Browse files
committed
[proxy]修复缓存策略Header发送不正确的问题
1 parent 90b46bc commit c982175

File tree

5 files changed

+46
-9
lines changed

5 files changed

+46
-9
lines changed

teacache/item.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@ package teacache
22

33
import "encoding/binary"
44

5+
// 缓存条目
56
type Item struct {
67
Header []byte
78
Body []byte
89
}
910

11+
// 获取新对象
12+
func NewItem() *Item {
13+
return &Item{}
14+
}
15+
1016
func (this *Item) Encode() (data []byte) {
1117
l := make([]byte, 8)
1218
binary.BigEndian.PutUint32(l, uint32(len(this.Header)))
@@ -21,3 +27,4 @@ func (this *Item) Decode(data []byte) {
2127
this.Header = data[8 : 8+headerLength]
2228
this.Body = data[8+headerLength:]
2329
}
30+

teacache/item_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package teacache
22

33
import (
4+
"bufio"
5+
"bytes"
46
"github.com/iwind/TeaGo/assert"
7+
"net/http"
58
"testing"
69
)
710

@@ -19,3 +22,18 @@ func TestItem_Encode(t *testing.T) {
1922
a.Equals(string(newItem.Header), "Hello")
2023
a.Equals(string(newItem.Body), "World")
2124
}
25+
26+
func TestItem_Response(t *testing.T) {
27+
item := NewItem()
28+
item.Header = []byte(`HTTP/1.1 200 OK
29+
Content-Type: image/png
30+
Etag: "et282346d6373bcae13d89ac46447a228c"
31+
Last-Modified: Fri, 19 Apr 2019 08:01:32 GMT
32+
33+
`)
34+
resp, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(item.Header)), nil)
35+
if err != nil {
36+
t.Fatal(err)
37+
}
38+
t.Log(resp.Header)
39+
}

teacache/process.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,19 +78,27 @@ func ProcessBeforeRequest(req *teaproxy.Request, writer *teaproxy.ResponseWriter
7878
return true
7979
}
8080

81+
if len(data) <= 8 {
82+
return true
83+
}
84+
8185
resp, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(data[8:])), nil)
8286
if err != nil {
8387
logs.Error(err)
8488
return true
8589
}
8690
defer resp.Body.Close()
8791

88-
writer.WriteHeader(resp.StatusCode)
8992
for k, vs := range resp.Header {
93+
if k == "Connection" {
94+
continue
95+
}
9096
for _, v := range vs {
9197
writer.Header().Add(k, v)
9298
}
9399
}
100+
writer.WriteHeader(resp.StatusCode)
101+
94102
_, err = io.Copy(writer, resp.Body)
95103
if err != nil {
96104
logs.Error(err)

teaproxy/listener.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,13 @@ func (this *Listener) Reload() error {
209209
}
210210
server, _ := this.findNamedServer(info.ServerName)
211211
if server == nil || server.SSL == nil || !server.SSL.On {
212-
return nil, errors.New("[listener]no server found for '" + this.Address + "'")
212+
return nil, errors.New("[listener]no server found for '" + info.ServerName + "'")
213213
}
214214
cert := server.SSL.CertificateObject()
215215
if cert != nil {
216216
return cert, nil
217217
}
218-
return nil, errors.New("no certificate found")
218+
return nil, errors.New("[listener]no certificate found for '" + info.ServerName + "'")
219219
},
220220
}
221221
err = this.httpServer.ListenAndServeTLS("", "")

teaproxy/request_root.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,17 @@ func (this *Request) callRoot(writer *ResponseWriter) error {
113113
if len(ext) > 0 {
114114
mimeType := mime.TypeByExtension(ext)
115115
if len(mimeType) > 0 {
116-
if len(this.charset) > 0 {
117-
// 去掉里面的charset设置
118-
index := strings.Index(mimeType, "charset=")
119-
if index > 0 {
120-
respHeader.Set("Content-Type", mimeType[:index+len("charset=")]+this.charset)
116+
if _, found := textMimeMap[mimeType]; found {
117+
if len(this.charset) > 0 {
118+
// 去掉里面的charset设置
119+
index := strings.Index(mimeType, "charset=")
120+
if index > 0 {
121+
respHeader.Set("Content-Type", mimeType[:index+len("charset=")]+this.charset)
122+
} else {
123+
respHeader.Set("Content-Type", mimeType+"; charset="+this.charset)
124+
}
121125
} else {
122-
respHeader.Set("Content-Type", mimeType+"; charset="+this.charset)
126+
respHeader.Set("Content-Type", mimeType)
123127
}
124128
} else {
125129
respHeader.Set("Content-Type", mimeType)

0 commit comments

Comments
 (0)