aboutsummaryrefslogtreecommitdiff
path: root/main.go
blob: 94e1ac25ef18f87e73b858e0164cd69ac5c6160b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main

import (
	"flag"
	"github.com/julienschmidt/httprouter"
	"github.com/alexedwards/stack"
	"github.com/rs/cors"
	"github.com/stretchr/graceful"
	"log"
	"net/http"
	"os"
	"time"
)

// Globals
var dictServer string

func main() {
	var err error

	port := flag.String("port", "8080", "Listen port")
	dictHost := flag.String("dicthost", "localhost", "Dict server name")
	dictPort := flag.String("dictport", "2628", "Dict server port")
	gzip := flag.Bool("gzip", false, "Support gzip compression")
	deflate := flag.Bool("deflate", false, "Support DEFLATE compression")

	flag.Parse()

	dictServer = *dictHost + ":" + *dictPort

	client, err := getDictClient()
	if err != nil {
		os.Exit(1)
	}

	// Get the global list of databases
	dicts, err := getDictionaries(client)
	if err != nil {
		log.Println("Unable to get database list")
		os.Exit(1)
	}

	for _, d := range dicts {
		log.Printf("Available dictionary %s: %s", d.Name, d.Desc)
	}
	// No need for it until a request comes in
	client.Close()

	// Define our routes
	router := httprouter.New()
	router.GET("/define/:word", dictDefine)
	router.GET("/databases", dictDatabases)
	router.GET("/db", dictDatabases)

	// Define our middlewares

	// Going to need some CORS headers
	cors := cors.New(cors.Options{
		AllowedHeaders: []string{
			"Accept", "Content-Type", "Origin",
		},
		AllowedMethods: []string{
			"GET", "OPTIONS",
		},
	})

	stdChain := stack.New(stack.Adapt(cors.Handler), stack.Adapt(Logger))
	if *gzip {
		stdChain = stdChain.Append(Gzip)
		log.Println("Adding support for Gzip compression")
	}

	if *deflate {
		stdChain = stdChain.Append(Deflate)
		log.Println("Adding support for DEFLATE compression")
	}

	chain := stdChain.ThenHandler(router)

	listen := ":" + *port

	srv := &graceful.Server{
		Timeout: 5 * time.Second,
		Server:  &http.Server{Addr: listen, Handler: chain},
	}

	log.Printf("Listening at %s", listen)
	srv.ListenAndServe()
}