summaryrefslogtreecommitdiffstats
path: root/src/server.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2022-12-25 16:27:02 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2022-12-25 16:27:02 +0900
commit750b2a63130fc6b67aaa64c59d42cff428c26b4a (patch)
tree90ccd737354b601b0b884951149fdbaf314f1e4c /src/server.go
parentde0da86bd7089a92f0910877b6a511ba825a1f5d (diff)
Add GET endpoints for getting the state of the finder
* GET / (or GET /current) * GET /query
Diffstat (limited to 'src/server.go')
-rw-r--r--src/server.go31
1 files changed, 22 insertions, 9 deletions
diff --git a/src/server.go b/src/server.go
index 421bc20b..cc0a55d9 100644
--- a/src/server.go
+++ b/src/server.go
@@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"net"
+ "regexp"
"strconv"
"strings"
"time"
@@ -13,13 +14,18 @@ import (
const (
crlf = "\r\n"
+ httpPattern = "^(GET|POST) (/[^ ]*) HTTP"
httpOk = "HTTP/1.1 200 OK" + crlf
httpBadRequest = "HTTP/1.1 400 Bad Request" + crlf
httpReadTimeout = 10 * time.Second
maxContentLength = 1024 * 1024
)
-func startHttpServer(port int, channel chan []*action) error {
+var (
+ httpRegexp *regexp.Regexp
+)
+
+func startHttpServer(port int, requestChan chan []*action, responseChan chan string) error {
if port == 0 {
return nil
}
@@ -29,6 +35,7 @@ func startHttpServer(port int, channel chan []*action) error {
return fmt.Errorf("port not available: %d", port)
}
+ httpRegexp = regexp.MustCompile(httpPattern)
go func() {
for {
conn, err := listener.Accept()
@@ -39,7 +46,7 @@ func startHttpServer(port int, channel chan []*action) error {
continue
}
}
- conn.Write([]byte(handleHttpRequest(conn, channel)))
+ conn.Write([]byte(handleHttpRequest(conn, requestChan, responseChan)))
conn.Close()
}
listener.Close()
@@ -54,12 +61,14 @@ func startHttpServer(port int, channel chan []*action) error {
// * No --listen: 2.8MB
// * --listen with net/http: 5.7MB
// * --listen w/o net/http: 3.3MB
-func handleHttpRequest(conn net.Conn, channel chan []*action) string {
+func handleHttpRequest(conn net.Conn, requestChan chan []*action, responseChan chan string) string {
contentLength := 0
body := ""
+ response := func(header string, message string) string {
+ return header + fmt.Sprintf("Content-Length: %d%s", len(message), crlf+crlf+message)
+ }
bad := func(message string) string {
- message += "\n"
- return httpBadRequest + fmt.Sprintf("Content-Length: %d%s", len(message), crlf+crlf+message)
+ return response(httpBadRequest, strings.TrimSpace(message)+"\n")
}
conn.SetReadDeadline(time.Now().Add(httpReadTimeout))
scanner := bufio.NewScanner(conn)
@@ -80,8 +89,13 @@ func handleHttpRequest(conn net.Conn, channel chan []*action) string {
text := scanner.Text()
switch section {
case 0:
- if !strings.HasPrefix(text, "POST / HTTP") {
- return bad("invalid request method")
+ httpMatch := httpRegexp.FindStringSubmatch(text)
+ if len(httpMatch) != 3 {
+ return bad("invalid HTTP request: " + text)
+ }
+ if httpMatch[1] == "GET" {
+ requestChan <- []*action{{t: actEvaluate, a: httpMatch[2][1:]}}
+ return response(httpOk, <-responseChan)
}
section++
case 1:
@@ -120,7 +134,6 @@ func handleHttpRequest(conn net.Conn, channel chan []*action) string {
if len(actions) == 0 {
return bad("no action specified")
}
-
- channel <- actions
+ requestChan <- actions
return httpOk
}