summaryrefslogtreecommitdiff
path: root/contrib/cgi
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/cgi')
-rw-r--r--contrib/cgi/cgi_test.go81
-rwxr-xr-xcontrib/cgi/testdata/fails3
-rwxr-xr-xcontrib/cgi/testdata/hello_world3
-rw-r--r--contrib/cgi/testdata/server.crt18
-rw-r--r--contrib/cgi/testdata/server.key27
5 files changed, 132 insertions, 0 deletions
diff --git a/contrib/cgi/cgi_test.go b/contrib/cgi/cgi_test.go
new file mode 100644
index 0000000..c265050
--- /dev/null
+++ b/contrib/cgi/cgi_test.go
@@ -0,0 +1,81 @@
+package cgi_test
+
+import (
+ "context"
+ "crypto/tls"
+ "fmt"
+ "io"
+ "strconv"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "tildegit.org/tjp/gus"
+ "tildegit.org/tjp/gus/contrib/cgi"
+ "tildegit.org/tjp/gus/gemini"
+)
+
+func TestCGIDirectory(t *testing.T) {
+ tlsconf, err := gemini.FileTLS("testdata/server.crt", "testdata/server.key")
+ require.Nil(t, err)
+
+ handler := cgi.CGIDirectory("/cgi-bin", "./testdata")
+ server, err := gemini.NewServer(context.Background(), nil, tlsconf, "tcp", "127.0.0.1:0", handler)
+ require.Nil(t, err)
+
+ go func() { assert.Nil(t, server.Serve()) }()
+ defer server.Close()
+
+ tests := []struct {
+ requestPath string
+ responseCode gus.Status
+ responseBody string
+ }{
+ {
+ requestPath: "/cgi-bin/hello_world",
+ responseCode: gemini.StatusSuccess,
+ responseBody: "hello, world!\n",
+ },
+ {
+ requestPath: "/cgi-bin/server.key",
+ responseCode: gemini.StatusNotFound,
+ },
+ {
+ requestPath: "/cgi-bin/non-existent",
+ responseCode: gemini.StatusNotFound,
+ },
+ {
+ requestPath: "/cgi-bin/fails",
+ responseCode: gemini.StatusCGIError,
+ },
+ }
+
+ for _, test := range tests {
+ t.Run(test.requestPath, func(t *testing.T) {
+ conn, err := tls.Dial(
+ server.Network(),
+ server.Address(),
+ &tls.Config{InsecureSkipVerify: true},
+ )
+ require.Nil(t, err)
+
+ _, err = fmt.Fprintf(conn, "gemini://%s%s\r\n", server.Address(), test.requestPath)
+ require.Nil(t, err)
+
+ response, err := io.ReadAll(conn)
+ require.Nil(t, err)
+
+ code, err := strconv.Atoi(string(response[:2]))
+ if assert.Nil(t, err) {
+ assert.Equal(t, test.responseCode, gus.Status(code))
+ }
+
+ _, body, found := strings.Cut(string(response), "\r\n")
+ if assert.True(t, found) && test.responseBody != "" {
+ assert.Equal(t, test.responseBody, body)
+ }
+ })
+ }
+}
diff --git a/contrib/cgi/testdata/fails b/contrib/cgi/testdata/fails
new file mode 100755
index 0000000..0f132d4
--- /dev/null
+++ b/contrib/cgi/testdata/fails
@@ -0,0 +1,3 @@
+#!/usr/bin/env sh
+
+exit 4
diff --git a/contrib/cgi/testdata/hello_world b/contrib/cgi/testdata/hello_world
new file mode 100755
index 0000000..4d15f7d
--- /dev/null
+++ b/contrib/cgi/testdata/hello_world
@@ -0,0 +1,3 @@
+#!/usr/bin/env sh
+
+printf "20 text/gemini\r\nhello, world!\n"
diff --git a/contrib/cgi/testdata/server.crt b/contrib/cgi/testdata/server.crt
new file mode 100644
index 0000000..4e3dc74
--- /dev/null
+++ b/contrib/cgi/testdata/server.crt
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE-----
+MIIC7jCCAdYCAQcwDQYJKoZIhvcNAQELBQAwPTESMBAGA1UEAwwJbG9jYWxob3N0
+MQswCQYDVQQGEwJVUzEaMBgGA1UEBwwRU2FuIEZyYW5jaXNjbywgQ0EwHhcNMjMw
+MTExMjAwMDU5WhcNMjUwNDE1MjAwMDU5WjA9MRIwEAYDVQQDDAlsb2NhbGhvc3Qx
+CzAJBgNVBAYTAlVTMRowGAYDVQQHDBFTYW4gRnJhbmNpc2NvLCBDQTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALlaPa1AxDQnMo0qQxY5/Bf7MNf1x6tN
+xjkpMnQnPM+cHmmlkEhI1zwLk/LrLxwq7+OOxMTPrJglrAiDAp1uCZHjKcTMFnwO
+9M5vf8LjtYBjZd8+OSHyYV37gxw7h9/Wsxl+1Yw40QaJKM9auj2xOyaDj5Ou9+yp
+CfbGSpVUTnqReOVFg2QSNwEviOZu1SvAouPyO98WKoXjn7K5mxE545e4mgF1EMht
+jB5kH6kXqZSUszlGA1MkX3AlDsYJIcYnDwelNvw6XTPpkT2wNehxPyD0iP4rs+W4
+5hgV8wYokpgrM3xxe0c4mop5bzrp2Hyz3WxnF7KwtJgHW/6YxhG73skCAwEAATAN
+BgkqhkiG9w0BAQsFAAOCAQEAfI+UE/3d0Fb8BZ2gtv1kUh8yx75LUbpg1aOEsZdP
+Rji+GkL5xiFDsm7BwqTKziAjDtjL2qtGcJJ835shsGiUSK6qJuf9C944utUvCoFm
+b4aUZ8fTmN7PkwRS61nIcHaS1zkiFzUdvbquV3QWSnl9kC+yDLHT0Z535tcvCMVM
+bO7JMj1sxml4Y9B/hfY7zAZJt1giSNH1iDeX2pTpmPPI40UsRn98cC8HZ0d8wFrv
+yc3hKkz8E+WTgZUf7jFk/KX/T5uwu+Y85emwfbb82KIR3oqhkJIfOfpqop2duZXB
+hMuO1QWEBkZ/hpfrAsN/foz8v46P9qgW8gfOfzhyBcqLvA==
+-----END CERTIFICATE-----
diff --git a/contrib/cgi/testdata/server.key b/contrib/cgi/testdata/server.key
new file mode 100644
index 0000000..44ce348
--- /dev/null
+++ b/contrib/cgi/testdata/server.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEAuVo9rUDENCcyjSpDFjn8F/sw1/XHq03GOSkydCc8z5weaaWQ
+SEjXPAuT8usvHCrv447ExM+smCWsCIMCnW4JkeMpxMwWfA70zm9/wuO1gGNl3z45
+IfJhXfuDHDuH39azGX7VjDjRBokoz1q6PbE7JoOPk6737KkJ9sZKlVROepF45UWD
+ZBI3AS+I5m7VK8Ci4/I73xYqheOfsrmbETnjl7iaAXUQyG2MHmQfqReplJSzOUYD
+UyRfcCUOxgkhxicPB6U2/DpdM+mRPbA16HE/IPSI/iuz5bjmGBXzBiiSmCszfHF7
+RziainlvOunYfLPdbGcXsrC0mAdb/pjGEbveyQIDAQABAoIBAQC36ylkLu4Bahup
+I5RqC6NwEFpJEKLOAmB8+7oKs5yNzTYIUra2Y0DfXgWyd1fJtXlP7aymNgPm/QqV
+b5o6qKNqVWRu2Kw+8YBNDypRMi45dWfyewWp/55J6XYRn6iVna8dz1MKzp3qxFLw
+XfCLor802jqvqmBsPteaPOxo/LzatKhXp/mcO/hsxeMr1iSUVHTrQEIU/aIkmAqT
+/eXp/zVZk7O9Tx8wwCijB3v7j3zTEkcKSwFlAp0w01XeqllmqA5P9rW3vVGXJVIM
+t6t9C8XcJWPIOURz3JWZJpUBSZsyNe2N/wbCgkQV81A0s+4praKzgDbjE+njb0C/
+1CClbHV5AoGBAO/mnOzHe7ZJyYfuiu6ZR2REBY61n2J6DkL1stkN5xd+Op25afHT
+jLBjU98hM/AMtP1aHWFQpdEe0uyqRjV6PbpNE8j/m9AVfjZxzwR4ITW2xqUhXOSz
+89o832RO54TTr19YGnIhdU8dDQmYOcKmCSuw6KwCfHwBzkFuDFZGk/4/AoGBAMXK
+gzNyX3tN9Ug5AUo/Az4jQRSoyLjfnce0a0TF4jxEacUBx2COq3zaV/VADEFBla1t
+5roOAUyJ3V6fXtZnoqwZPYh6iGP8p7Tj6vyXI4SDktV0uAV57qSdajqxTrA7yoXr
+zrbxv3U/3vXr3JTsP42U5zp1m5n1VfVqCXBkynD3AoGBAOvs7JjDWXuctzASPNmH
+LjmB18FQBk3vYQUi4l8pmAF3pyejx3gGJw70r+/4lD5YEMozjD8+88Njv+T1U5SW
+Agysbm+2SMJr0LK0W/W2Olq7xEFzPQrBmmgeg0b/fhoXoBlw6JkjJF3IYSD1bqBp
+bw1jrn4y979weynHkyRpxnM7AoGBALGSzRPlPR/gr7P1qdjUlb61u/omRn7kFC11
+J1EJL8HX0fXTUQK5U/C1vn4q0FXN4elgX+LuK/BhXeNTxbtMM9m6l2nuSIEsFgzr
+Cs9XicWwsqT9MzGHdN9JjFPBV9oU9BAj0uSgSbmkbDHxXYo+SBh+dNIhQF+KyW+Z
+kXvcoXulAoGAA2hnEA17nJ7Vj1DZ4CoRblgjZFAMB64slcSesaorp3WWehvaXO8u
+jbvWuvj58DgvTLiv8xPIn4Zsjd0a77ysifvUcmxSRa/k9UIle/lwjmXGjQ1GSMEI
+FB5ZTqjLZwS9Y5BDxlPcYF7vqE9fNpcxmcfHGmSF5YAHvFOfGH6B63M=
+-----END RSA PRIVATE KEY-----