package gopher_test import ( "bytes" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "tildegit.org/tjp/sliderule/gopher" ) func TestParseRequest(t *testing.T) { tests := []struct { requestLine string path string query string }{ { requestLine: "\r\n", path: "/", }, { requestLine: "foo/bar\r\n", path: "/foo/bar", }, { requestLine: "search\tthis AND that\r\n", path: "/search", query: "this+AND+that", }, } for _, test := range tests { t.Run(test.requestLine, func(t *testing.T) { request, err := gopher.ParseRequest(bytes.NewBufferString(test.requestLine)) require.Nil(t, err) assert.Equal(t, test.path, request.Path) assert.Equal(t, test.query, request.RawQuery) }) } } func TestParseRequestLimits(t *testing.T) { t.Run("max selector", func(t *testing.T) { request, err := gopher.ParseRequest(bytes.NewBufferString(strings.Repeat("a", 255) + "\r\n")) require.Nil(t, err) assert.Equal(t, "/"+strings.Repeat("a", 255), request.Path) }) t.Run("selector too long", func(t *testing.T) { _, err := gopher.ParseRequest(bytes.NewBufferString(strings.Repeat("a", 256) + "\r\n")) require.NotNil(t, err) }) t.Run("search may extend request line", func(t *testing.T) { request, err := gopher.ParseRequest(bytes.NewBufferString(strings.Repeat("a", 255) + "\t" + strings.Repeat("b", 255) + "\r\n")) require.Nil(t, err) assert.Equal(t, "/"+strings.Repeat("a", 255), request.Path) assert.Equal(t, strings.Repeat("b", 255), request.RawQuery) }) t.Run("long malformed selector does not panic", func(t *testing.T) { _, err := gopher.ParseRequest(bytes.NewBufferString(strings.Repeat("a", 1487) + "\r\n")) require.NotNil(t, err) }) }