2020-11-05 05:18:59 +01:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"log"
|
|
|
|
"net"
|
|
|
|
"net/url"
|
|
|
|
"os/exec"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2020-11-10 05:10:53 +01:00
|
|
|
func serveCommand(c net.Conn, serve *pathConfig, request *url.URL, command []string) {
|
2020-11-05 05:18:59 +01:00
|
|
|
var args []string
|
|
|
|
if len(command) > 0 {
|
|
|
|
args = command[1:]
|
|
|
|
}
|
|
|
|
cmd := exec.Command(command[0], args...)
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
if request.RawQuery != "" {
|
|
|
|
requestQuery, err := url.QueryUnescape(request.RawQuery)
|
|
|
|
if err != nil {
|
|
|
|
writeStatus(c, statusBadRequest)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
cmd.Stdin = strings.NewReader(requestQuery + "\n")
|
|
|
|
}
|
|
|
|
cmd.Stdout = &buf
|
|
|
|
cmd.Stderr = &buf
|
|
|
|
|
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
writeStatus(c, statusProxyError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2020-11-10 05:10:53 +01:00
|
|
|
writeSuccess(c, serve, geminiType, int64(buf.Len()))
|
2020-11-05 05:18:59 +01:00
|
|
|
c.Write(buf.Bytes())
|
|
|
|
|
|
|
|
if verbose {
|
|
|
|
log.Printf("< %s\n", command)
|
|
|
|
}
|
|
|
|
}
|