2021-02-06 00:36:43 +05:30
|
|
|
package offlinehttp
|
|
|
|
|
|
|
|
|
|
import (
|
2021-11-10 18:04:53 +01:00
|
|
|
"fmt"
|
2022-02-23 13:54:46 +01:00
|
|
|
"io"
|
2021-10-02 22:10:05 +07:00
|
|
|
"net/http"
|
2021-11-10 18:04:53 +01:00
|
|
|
"net/http/httptest"
|
2021-10-02 22:10:05 +07:00
|
|
|
"net/http/httputil"
|
2021-02-06 00:36:43 +05:30
|
|
|
"testing"
|
2021-10-02 22:10:05 +07:00
|
|
|
"time"
|
2021-02-06 00:36:43 +05:30
|
|
|
|
2021-11-10 18:04:53 +01:00
|
|
|
"github.com/julienschmidt/httprouter"
|
2021-02-06 00:36:43 +05:30
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestReadResponseFromString(t *testing.T) {
|
|
|
|
|
expectedBody := `<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Firing Range</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Version 0.48</h1>
|
|
|
|
|
<h1>What is the Firing Range?</h1>
|
|
|
|
|
<p>
|
|
|
|
|
</body>
|
|
|
|
|
</html>`
|
|
|
|
|
|
2021-10-02 15:05:03 +07:00
|
|
|
tests := []struct {
|
|
|
|
|
name string
|
|
|
|
|
data string
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "response",
|
|
|
|
|
data: `HTTP/1.1 200 OK
|
2021-02-06 00:36:43 +05:30
|
|
|
Age: 0
|
|
|
|
|
Cache-Control: public, max-age=600
|
|
|
|
|
Content-Type: text/html
|
|
|
|
|
Server: Google Frontend
|
|
|
|
|
|
2021-10-02 14:31:18 +07:00
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Firing Range</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Version 0.48</h1>
|
|
|
|
|
<h1>What is the Firing Range?</h1>
|
|
|
|
|
<p>
|
|
|
|
|
</body>
|
2021-10-02 15:05:03 +07:00
|
|
|
</html>`,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "response-http2-without-minor-version",
|
|
|
|
|
data: `HTTP/2 200 OK
|
2021-10-02 14:31:18 +07:00
|
|
|
Age: 0
|
|
|
|
|
Cache-Control: public, max-age=600
|
|
|
|
|
Content-Type: text/html
|
|
|
|
|
Server: Google Frontend
|
|
|
|
|
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Firing Range</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Version 0.48</h1>
|
|
|
|
|
<h1>What is the Firing Range?</h1>
|
|
|
|
|
<p>
|
|
|
|
|
</body>
|
2021-10-02 15:05:03 +07:00
|
|
|
</html>`,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "response-http2-with-minor-version",
|
|
|
|
|
data: `HTTP/2.0 200 OK
|
2021-10-02 14:31:18 +07:00
|
|
|
Age: 0
|
|
|
|
|
Cache-Control: public, max-age=600
|
|
|
|
|
Content-Type: text/html
|
|
|
|
|
Server: Google Frontend
|
|
|
|
|
|
2021-02-06 00:36:43 +05:30
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Firing Range</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Version 0.48</h1>
|
|
|
|
|
<h1>What is the Firing Range?</h1>
|
|
|
|
|
<p>
|
|
|
|
|
</body>
|
2021-10-02 15:05:03 +07:00
|
|
|
</html>`,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "request-response",
|
|
|
|
|
data: `GET http://public-firing-range.appspot.com/ HTTP/1.1
|
2021-02-06 00:36:43 +05:30
|
|
|
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
|
|
|
|
Accept-Encoding: gzip, deflate
|
|
|
|
|
Upgrade-Insecure-Requests: 1
|
|
|
|
|
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36
|
|
|
|
|
|
|
|
|
|
HTTP/1.1 200 OK
|
|
|
|
|
Age: 0
|
|
|
|
|
Cache-Control: public, max-age=600
|
|
|
|
|
Content-Type: text/html
|
|
|
|
|
Server: Google Frontend
|
|
|
|
|
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Firing Range</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Version 0.48</h1>
|
|
|
|
|
<h1>What is the Firing Range?</h1>
|
|
|
|
|
<p>
|
|
|
|
|
</body>
|
2021-10-02 15:05:03 +07:00
|
|
|
</html>`,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "request-response-without-minor-version",
|
|
|
|
|
data: `GET http://public-firing-range.appspot.com/ HTTP/1.1
|
2021-10-02 14:31:18 +07:00
|
|
|
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
|
|
|
|
Accept-Encoding: gzip, deflate
|
|
|
|
|
Upgrade-Insecure-Requests: 1
|
|
|
|
|
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36
|
|
|
|
|
|
|
|
|
|
HTTP/2 200 OK
|
|
|
|
|
Age: 0
|
|
|
|
|
Cache-Control: public, max-age=600
|
|
|
|
|
Content-Type: text/html
|
|
|
|
|
Server: Google Frontend
|
|
|
|
|
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Firing Range</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Version 0.48</h1>
|
|
|
|
|
<h1>What is the Firing Range?</h1>
|
|
|
|
|
<p>
|
|
|
|
|
</body>
|
2021-10-02 15:05:03 +07:00
|
|
|
</html>`,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
|
resp, err := readResponseFromString(tt.data)
|
|
|
|
|
require.Nil(t, err, "could not read response from string")
|
|
|
|
|
|
2022-02-23 13:54:46 +01:00
|
|
|
respData, err := io.ReadAll(resp.Body)
|
2021-10-02 15:05:03 +07:00
|
|
|
require.Nil(t, err, "could not read response body")
|
|
|
|
|
require.Equal(t, expectedBody, string(respData), "could not get correct parsed body")
|
|
|
|
|
require.Equal(t, "Google Frontend", resp.Header.Get("Server"), "could not get correct headers")
|
|
|
|
|
})
|
|
|
|
|
}
|
2021-10-02 22:10:05 +07:00
|
|
|
|
|
|
|
|
t.Run("test-live-response-with-content-length", func(t *testing.T) {
|
2021-11-10 18:04:53 +01:00
|
|
|
var ts *httptest.Server
|
|
|
|
|
router := httprouter.New()
|
2021-11-25 17:18:54 +02:00
|
|
|
router.GET("/", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
2021-11-10 18:04:53 +01:00
|
|
|
w.Header().Add("Server", "Google Frontend")
|
2025-07-01 00:40:44 +07:00
|
|
|
_, _ = fmt.Fprintf(w, "%s", `<!DOCTYPE html>
|
2021-11-10 18:04:53 +01:00
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Firing Range</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Version 0.48</h1>
|
|
|
|
|
<h1>What is the Firing Range?</h1>
|
|
|
|
|
<p>
|
|
|
|
|
</body>
|
|
|
|
|
</html>`)
|
2021-11-25 17:18:54 +02:00
|
|
|
})
|
2021-11-10 18:04:53 +01:00
|
|
|
ts = httptest.NewServer(router)
|
|
|
|
|
defer ts.Close()
|
|
|
|
|
|
2021-10-02 22:10:05 +07:00
|
|
|
client := &http.Client{
|
|
|
|
|
Timeout: 3 * time.Second,
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-10 18:04:53 +01:00
|
|
|
data, err := client.Get(ts.URL)
|
2021-10-02 22:10:05 +07:00
|
|
|
require.Nil(t, err, "could not dial url")
|
2025-07-01 00:40:44 +07:00
|
|
|
defer func() {
|
|
|
|
|
_ = data.Body.Close()
|
|
|
|
|
}()
|
2021-10-02 22:10:05 +07:00
|
|
|
|
|
|
|
|
b, err := httputil.DumpResponse(data, true)
|
|
|
|
|
require.Nil(t, err, "could not dump response")
|
|
|
|
|
|
|
|
|
|
respData, err := readResponseFromString(string(b))
|
|
|
|
|
require.Nil(t, err, "could not read response from string")
|
|
|
|
|
|
2022-02-23 13:54:46 +01:00
|
|
|
_, err = io.ReadAll(respData.Body)
|
2021-10-02 22:10:05 +07:00
|
|
|
require.Nil(t, err, "could not read response body")
|
|
|
|
|
|
|
|
|
|
require.Equal(t, "Google Frontend", respData.Header.Get("Server"), "could not get correct headers")
|
|
|
|
|
|
|
|
|
|
})
|
2021-02-06 00:36:43 +05:30
|
|
|
}
|