summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMohammed Al Sahaf <[email protected]>2024-04-18 23:31:00 +0300
committerGitHub <[email protected]>2024-04-18 20:31:00 +0000
commitc6673ad4d8c3253179d697f06aac458e48e56546 (patch)
tree45ee4638989a6e591c0d21d55d3d174f31013ea3
parent9ab09433deba62f9f2b37d824570926f7ee69312 (diff)
downloadcaddy-c6673ad4d8c3253179d697f06aac458e48e56546.tar.gz
caddy-c6673ad4d8c3253179d697f06aac458e48e56546.zip
staticresp: Use the evaluated response body for sniffing JSON content-type (#6249)
-rw-r--r--caddytest/integration/handler_test.go28
-rw-r--r--modules/caddyhttp/staticresp.go2
2 files changed, 29 insertions, 1 deletions
diff --git a/caddytest/integration/handler_test.go b/caddytest/integration/handler_test.go
index 6db119eae..afc700b02 100644
--- a/caddytest/integration/handler_test.go
+++ b/caddytest/integration/handler_test.go
@@ -1,6 +1,7 @@
package integration
import (
+ "bytes"
"net/http"
"testing"
@@ -29,3 +30,30 @@ func TestBrowse(t *testing.T) {
}
tester.AssertResponseCode(req, 200)
}
+
+func TestRespondWithJSON(t *testing.T) {
+ tester := caddytest.NewTester(t)
+ tester.InitServer(`
+ {
+ skip_install_trust
+ admin localhost:2999
+ http_port 9080
+ https_port 9443
+ grace_period 1ns
+ }
+ localhost {
+ respond {http.request.body}
+ }
+ `, "caddyfile")
+
+ res, _ := tester.AssertPostResponseBody("https://localhost:9443/",
+ nil,
+ bytes.NewBufferString(`{
+ "greeting": "Hello, world!"
+ }`), 200, `{
+ "greeting": "Hello, world!"
+ }`)
+ if res.Header.Get("Content-Type") != "application/json" {
+ t.Errorf("expected Content-Type to be application/json, but was %s", res.Header.Get("Content-Type"))
+ }
+}
diff --git a/modules/caddyhttp/staticresp.go b/modules/caddyhttp/staticresp.go
index 3ec76f29f..1fea6978f 100644
--- a/modules/caddyhttp/staticresp.go
+++ b/modules/caddyhttp/staticresp.go
@@ -206,7 +206,7 @@ func (s StaticResponse) ServeHTTP(w http.ResponseWriter, r *http.Request, next H
// or for clients to render JSON properly which is very common)
body := repl.ReplaceKnown(s.Body, "")
if body != "" && w.Header().Get("Content-Type") == "" {
- content := strings.TrimSpace(s.Body)
+ content := strings.TrimSpace(body)
if len(content) > 2 &&
(content[0] == '{' && content[len(content)-1] == '}' ||
(content[0] == '[' && content[len(content)-1] == ']')) &&