mirror of
https://github.com/jimeh/casecmp.git
synced 2026-02-19 02:16:40 +00:00
144 lines
2.6 KiB
Go
144 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"gopkg.in/alecthomas/kingpin.v2"
|
|
)
|
|
|
|
var (
|
|
name = "casecmp"
|
|
version = "dev"
|
|
commit = "unknown"
|
|
date = "unknown"
|
|
defaultPort = "8080"
|
|
)
|
|
|
|
// Argument parsing setup.
|
|
var (
|
|
portFlag = kingpin.Flag("port", "Port to listen to.").Short('p').
|
|
Default("").String()
|
|
bindFlag = kingpin.Flag("bind", "Bind address.").Short('b').
|
|
Default("0.0.0.0").String()
|
|
forceHTTPSFlag = kingpin.Flag(
|
|
"force-https", "Use https:// in example curl commands",
|
|
).Bool()
|
|
versionFlag = kingpin.Flag("version", "Print version info.").
|
|
Short('v').Bool()
|
|
)
|
|
|
|
func indexHandler(w http.ResponseWriter, r *http.Request) {
|
|
scheme := "http"
|
|
if r.TLS != nil || *forceHTTPSFlag {
|
|
scheme = "https"
|
|
}
|
|
|
|
_, err := fmt.Fprintf(w, `%s %s
|
|
|
|
Case-insensitive string comparison, as an API. Because ¯\_(ツ)_/¯
|
|
|
|
Example usage:
|
|
curl -X POST -F "a=Foo Bar" -F "b=FOO BAR" %s://%s/
|
|
curl -X GET "%s://%s/?a=Foo+Bar&b=FOO+BAR"
|
|
`,
|
|
name, version, scheme, r.Host, scheme, r.Host)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func aboutHandler(w http.ResponseWriter, _ *http.Request) {
|
|
_, err := fmt.Fprintf(w,
|
|
`%s %s
|
|
|
|
https://github.com/jimeh/casecmp
|
|
`,
|
|
name, version)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func casecmpHandler(w http.ResponseWriter, r *http.Request) {
|
|
a := r.FormValue("a")
|
|
b := r.FormValue("b")
|
|
resp := "0"
|
|
|
|
if strings.EqualFold(string(a), string(b)) {
|
|
resp = "1"
|
|
}
|
|
_, err := fmt.Fprint(w, resp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func handler(w http.ResponseWriter, r *http.Request) {
|
|
switch r.URL.Path {
|
|
case "/":
|
|
if r.Method != "GET" || r.URL.RawQuery != "" {
|
|
casecmpHandler(w, r)
|
|
return
|
|
}
|
|
indexHandler(w, r)
|
|
case "/about":
|
|
aboutHandler(w, r)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
}
|
|
|
|
func printVersion() {
|
|
var buffer bytes.Buffer
|
|
buffer.WriteString(fmt.Sprintf("%s %s", name, version))
|
|
|
|
if commit != "unknown" {
|
|
buffer.WriteString(fmt.Sprintf(" (%s)", commit))
|
|
}
|
|
|
|
fmt.Println(buffer.String())
|
|
}
|
|
|
|
func startServer() {
|
|
if *portFlag == "" {
|
|
envPort := os.Getenv("PORT")
|
|
if envPort != "" {
|
|
*portFlag = envPort
|
|
} else {
|
|
*portFlag = defaultPort
|
|
}
|
|
}
|
|
|
|
if !*forceHTTPSFlag && os.Getenv("FORCE_HTTPS") != "" {
|
|
*forceHTTPSFlag = true
|
|
}
|
|
|
|
address := *bindFlag + ":" + *portFlag
|
|
fmt.Printf("Listening on %s\n", address)
|
|
srv := &http.Server{
|
|
ReadTimeout: 5 * time.Second,
|
|
WriteTimeout: 5 * time.Second,
|
|
IdleTimeout: 30 * time.Second,
|
|
Handler: http.HandlerFunc(handler),
|
|
Addr: address,
|
|
}
|
|
|
|
log.Fatal(srv.ListenAndServe())
|
|
}
|
|
|
|
func main() {
|
|
kingpin.Parse()
|
|
|
|
if *versionFlag {
|
|
printVersion()
|
|
} else {
|
|
startServer()
|
|
}
|
|
}
|