add evaluator
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Simon Bruder 2019-05-26 20:36:46 +00:00
parent cd1d3e0b0a
commit 03f9ef8574
No known key found for this signature in database
GPG key ID: 6F03E0000CC5B62F
3 changed files with 106 additions and 0 deletions

View file

@ -19,3 +19,13 @@ steps:
target: /bangs/ target: /bangs/
path_style: true path_style: true
endpoint: https://s3.sbruder.de endpoint: https://s3.sbruder.de
- name: docker
image: plugins/docker
settings:
registry: r.sbruder.de
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: r.sbruder.de/bang-evaluator

22
Dockerfile Normal file
View file

@ -0,0 +1,22 @@
FROM golang:alpine as builder
WORKDIR /go/src/git.sbruder.de/simon/bangs/evaluator/
COPY evaluator/evaluator.go .
RUN apk add --no-cache git upx
RUN go get -v \
&& CGO_ENABLED=0 go build -v -ldflags="-s -w" \
&& upx --ultra-brute evaluator
FROM scratch
COPY --from=builder /go/src/git.sbruder.de/simon/bangs/evaluator/evaluator /evaluator
copy bangs.json /bangs.json
USER 1000
ENTRYPOINT ["/evaluator"]
EXPOSE 8081

74
evaluator/evaluator.go Normal file
View file

@ -0,0 +1,74 @@
package main
import (
"net/http"
"log"
"strings"
"encoding/json"
"io/ioutil"
"regexp"
)
var bangs = loadBangs()
func main() {
http.HandleFunc("/eval", func(w http.ResponseWriter, r *http.Request) {
searchQuery := r.URL.Query().Get("query")
searchEngine := r.URL.Query().Get("engine")
if (searchQuery == "" || searchEngine == "") {
http.Error(w, "400 Bad Request", http.StatusBadRequest)
return
}
searchQuery, searchEngine = evaluateBang(searchQuery, searchEngine)
searchURL := buildSearchURL(searchEngine, searchQuery)
http.Redirect(w, r, searchURL, http.StatusSeeOther)
})
log.Fatalf("Failed to start http server: %v", http.ListenAndServe(":8081", nil))
}
func loadBangs() (bangs map[string]string) {
data, err := ioutil.ReadFile("bangs.json")
if err != nil {
log.Fatalf("Failed to read bangs: %v", err)
}
err = json.Unmarshal(data, &bangs)
if err != nil {
log.Fatalf("Failed to decode bangs: %v", err)
}
return
}
func buildSearchURL(template string, query string) (searchUrl string) {
return strings.Replace(template, "%s", query, 1)
}
func parseBang(searchQuery string) (bang string, query string) {
regexStartBang, _ := regexp.Compile("\\!(.*) (.*)")
regexEndBang, _ := regexp.Compile("(.*) \\!(.*)")
startBang := regexStartBang.FindSubmatch([]byte(searchQuery))
endBang := regexEndBang.FindSubmatch([]byte(searchQuery))
if len(endBang) == 3 {
return string(endBang[2]), string(endBang[1])
} else if len(startBang) == 3 {
return string(startBang[1]), string(startBang[2])
} else {
return "", searchQuery
}
}
func evaluateBang(searchQuery string, searchEngine string) (query string, engine string) {
bang, query := parseBang(searchQuery)
if bang == "" {
return query, searchEngine
} else {
return query, bangs[bang]
}
}