aboutsummaryrefslogtreecommitdiff
path: root/src/dict2rest/handlers.go
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2016-01-28 15:27:00 +0000
committerFelix Hanley <felix@userspace.com.au>2016-01-28 15:27:00 +0000
commitca192e88bc58d7fe4a24d4efddd2aec9c3e3cf24 (patch)
treee8a8f3246843b930b301afec33d0d14e02401e1b /src/dict2rest/handlers.go
parentf276cdac82e4104fe6deb6d812a0fccdf8ce2d48 (diff)
downloadgo-dict2rest-ca192e88bc58d7fe4a24d4efddd2aec9c3e3cf24.tar.gz
go-dict2rest-ca192e88bc58d7fe4a24d4efddd2aec9c3e3cf24.tar.bz2
Refactor handlers to open a new connection for each request
Diffstat (limited to 'src/dict2rest/handlers.go')
-rw-r--r--src/dict2rest/handlers.go103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/dict2rest/handlers.go b/src/dict2rest/handlers.go
new file mode 100644
index 0000000..024a8d6
--- /dev/null
+++ b/src/dict2rest/handlers.go
@@ -0,0 +1,103 @@
+package main
+
+import (
+ "encoding/json"
+ "github.com/julienschmidt/httprouter"
+ "golang.org/x/net/dict"
+ "log"
+ "net/http"
+ "strconv"
+ "strings"
+)
+
+type jsonError struct {
+ Code int `json:"code"`
+ Message string `json:"message"`
+}
+
+func render(w http.ResponseWriter, status int, body interface{}) {
+ w.WriteHeader(status)
+ w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+ json.NewEncoder(w).Encode(body)
+}
+
+func formatError(e error) jsonError {
+ parts := strings.SplitN(e.Error(), "[", 2)
+ log.Printf("Error %s", parts[0])
+ parts = strings.SplitN(parts[0], " ", 2)
+ code, err := strconv.Atoi(parts[0])
+ if err != nil {
+ return jsonError{
+ Code: 500,
+ Message: "Error parsing error o_0",
+ }
+ }
+ return jsonError{
+ Code: code,
+ Message: strings.TrimSpace(parts[1]),
+ }
+}
+
+func formatDefinitions(defs []*dict.Defn) ([]definition, error) {
+ definitions := make([]definition, len(defs))
+ for i, def := range defs {
+ definitions[i] = definition{
+ Dictionary: def.Dict.Desc,
+ Word: def.Word,
+ Definition: string(def.Text[:]),
+ }
+ }
+ return definitions, nil
+}
+
+func dictDatabases(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
+ client, err := getDictClient()
+ if err != nil {
+ log.Printf("Unable to connect to dict server at %s", dictServer)
+ render(w, 500, jsonError{420, "Server temporarily unavailable"})
+ return
+ }
+
+ defer client.Close()
+
+ dicts, err := getDictionaries(client)
+ if err != nil {
+ render(w, 400, formatError(err))
+ return
+ }
+ render(w, 200, dicts)
+}
+
+func dictDefine(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
+ client, err := getDictClient()
+ if err != nil {
+ render(w, 500, jsonError{420, "Server temporarily unavailable"})
+ return
+ }
+ defer client.Close()
+
+ word := ps.ByName("word")
+ queryValues := r.URL.Query()
+ d := queryValues.Get("dict")
+
+ var dict string
+
+ if d != "" {
+ dict = d
+ } else {
+ dict = "*"
+ }
+
+ defs, err := client.Define(dict, word)
+ if err != nil {
+ render(w, 400, formatError(err))
+ return
+ }
+
+ definitions, err := formatDefinitions(defs)
+ if err != nil {
+ render(w, 500, err)
+ return
+ }
+ render(w, 200, definitions)
+}