0
Fork 0
mirror of https://github.com/caddyserver/caddy.git synced 2025-01-13 22:51:08 -05:00
This commit is contained in:
Viacheslav Biriukov 2015-06-07 20:36:28 +00:00
parent aa37c1e05c
commit f5e5628327
3 changed files with 191 additions and 3 deletions

BIN
middleware/sed/data.gz Normal file

Binary file not shown.

View file

@ -14,6 +14,11 @@ import (
"github.com/mholt/caddy/middleware"
)
var (
cts = []string{"text/html"} // TODO (brk0v): only html pages
size = 1 << 18 // default 256 KB
)
// bufferedWriter buffers responce for replacing content.
type bufferedWriter struct {
http.ResponseWriter
@ -130,7 +135,7 @@ func (bw *bufferedWriter) Apply(r *http.Request) ([]byte, error) {
var body []byte
if bw.ContentEncoding != "" {
if r.Header.Get("Accept-Encoding") == "" {
// gzip middleware has been already ungziped data
// gzip middleware has been already uncompressed data
body = bw.Body.Bytes()
return body, nil
}
@ -178,8 +183,6 @@ func (s Sed) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
if middleware.Path(r.URL.Path).Matches(rule.Url) {
// Buffering write.
cts := []string{"text/html"} // TODO (brk0v): only html pages
size := 1 << 18 // default 256 KB
if rule.Size != 0 {
size = rule.Size
}

185
middleware/sed/sed_test.go Normal file
View file

@ -0,0 +1,185 @@
package sed
import (
"bytes"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
"github.com/mholt/caddy/middleware"
)
func TestSedpHandler(t *testing.T) {
// Config Sed middleware
patterns := []Pattern{
Pattern{
Find: "may",
Replace: "must",
},
Pattern{
Find: "This",
Replace: "exmaple.com",
},
Pattern{
Find: "http://",
Replace: "https://",
},
}
sed := Sed{
Rules: []Rule{
Rule{
Patterns: patterns,
Url: "/",
},
},
}
// Load gziped data.
gzData, err := ioutil.ReadFile("data.gz")
if err != nil {
t.Fatal(err)
}
// Test with disabled gzip module. While it's turned off we can get
// Content-Encoding header from proxy backend. We trust it.
var tests = []struct {
body []byte // body test
expected []byte // expected body
ctt string // Content-Type for response
cte string // Contetn-Encoding for response
ae string // Accept-Encoding for request
}{
{
body: []byte("This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission."),
expected: []byte("exmaple.com domain is established to be used for illustrative examples in documents. You must use this domain in examples without prior coordination or asking for permission."),
ctt: "text/html; utf-8",
cte: "",
ae: "gzip",
},
{
body: []byte("This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission."),
expected: []byte("This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission."),
ctt: "",
cte: "",
ae: "gzip",
},
{
body: []byte(""),
expected: []byte(""),
ctt: "",
cte: "",
ae: "gzip",
},
{
body: []byte(""),
expected: []byte(""),
ctt: "text/html; utf-8",
cte: "",
ae: "gzip",
},
{
body: []byte("http://example.com http://example.net Test string"),
expected: []byte("https://example.com https://example.net Test string"),
ctt: "text/html; utf-8",
cte: "",
ae: "gzip",
},
{
body: []byte("http://example.com http://example.net Test string"),
expected: []byte("http://example.com http://example.net Test string"),
ctt: "",
cte: "",
ae: "gzip",
},
{
body: gzData,
expected: []byte("gzip https://example.com https://example.net Test string"),
ctt: "text/html; utf-8",
cte: "gzip",
ae: "gzip",
},
{
body: gzData,
expected: gzData,
ctt: "",
cte: "gzip",
ae: "gzip",
},
{
body: gzData,
expected: gzData,
ctt: "text/html; utf-8",
cte: "",
ae: "gzip",
},
{
body: gzData,
expected: gzData,
ctt: "",
cte: "",
ae: "gzip",
},
{
body: []byte("gzip http://example.com http://example.net Test string"),
expected: []byte("gzip https://example.com https://example.net Test string"),
ctt: "text/html; utf-8",
cte: "gzip",
ae: "",
},
{
body: []byte("gzip http://example.com http://example.net Test string"),
expected: []byte("gzip http://example.com http://example.net Test string"),
ctt: "",
cte: "gzip",
ae: "",
},
{
body: []byte("gzip http://example.com http://example.net Test string"),
expected: []byte("gzip https://example.com https://example.net Test string"),
ctt: "text/html; utf-8",
cte: "",
ae: "",
},
{
body: []byte("gzip http://example.com http://example.net Test string"),
expected: []byte("gzip http://example.com http://example.net Test string"),
ctt: "",
cte: "",
ae: "",
},
}
for _, tt := range tests {
w := httptest.NewRecorder()
sed.Next = nextFunc(tt.body, tt.ctt, tt.cte)
r, err := http.NewRequest("GET", "/", nil)
if tt.ae != "" {
r.Header.Set("Accept-Encoding", tt.ae)
}
if err != nil {
t.Error(err)
}
_, err = sed.ServeHTTP(w, r)
if err != nil {
t.Error(err)
}
if !bytes.Equal(w.Body.Bytes(), tt.expected) {
t.Errorf("Expected '%s' but got '%s' instead", tt.expected, w.Body.Bytes())
}
}
}
func nextFunc(body []byte, ctt, cte string) middleware.Handler {
return middleware.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) {
if ctt != "" {
w.Header().Set("Content-Type", ctt)
}
if cte != "" {
w.Header().Set("Content-Encoding", cte)
}
w.Write(body)
return 0, nil
})
}