diff options
| author | Felix Hanley <felix@userspace.com.au> | 2016-01-28 15:27:00 +0000 |
|---|---|---|
| committer | Felix Hanley <felix@userspace.com.au> | 2016-01-28 15:27:00 +0000 |
| commit | ca192e88bc58d7fe4a24d4efddd2aec9c3e3cf24 (patch) | |
| tree | e8a8f3246843b930b301afec33d0d14e02401e1b /src/dict2rest/handlers.go | |
| parent | f276cdac82e4104fe6deb6d812a0fccdf8ce2d48 (diff) | |
| download | go-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.go | 103 |
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) +} |
