-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjqhandler.go
More file actions
105 lines (92 loc) · 2.32 KB
/
jqhandler.go
File metadata and controls
105 lines (92 loc) · 2.32 KB
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"strings"
"time"
"github.com/brimstone/jq-httpd/jq"
)
func JqHandler(w http.ResponseWriter, clientRequest *http.Request, jqPattern string, jqOrRaw string, serverURL string) {
// Report our return time
w.Header().Add("Content-Type", "application/json; charset=utf-8")
// figure out if we have the right number of parameters
// read in all of our body
userjson, err := ioutil.ReadAll(clientRequest.Body)
if err != nil {
errorjson(w, 500, "Can't read body")
return
}
// actually perform the transformation
results, err := jq.Process(userjson, jqPattern)
if err != nil {
errorjson(w, 500, err.Error())
return
}
if len(results) == 0 {
errorjson(w, 400, "No Results")
return
}
// Fake encode the result into an array, if it needs it
result := []byte("[\n")
if len(results) == 1 {
result = results[0]
} else {
result = bytes.Join(results, []byte(",\n"))
result = append(result, []byte("]\n")...)
}
// If the /to/ bit is empty, return the transformation to the user
if serverURL == "" {
// return the results to the user, for now
w.Write(result)
return
}
if jqOrRaw == "tq" {
results, err = jq.Process(userjson, serverURL)
if err != nil {
errorjson(w, 500, err.Error())
return
}
if len(results) == 0 {
errorjson(w, 400, "No Results")
return
}
serverURL = string(results[0])
serverURL = strings.TrimPrefix(serverURL, "\"")
serverURL = strings.TrimSuffix(serverURL, "\"")
fmt.Println(serverURL)
}
// Since /to/ is set, relay the request
client := &http.Client{
Timeout: time.Duration(time.Second),
}
serverRequest, err := http.NewRequest(
clientRequest.Method,
serverURL,
bytes.NewBuffer(result),
)
if err != nil {
errorjson(w, 400, err.Error())
return
}
// Set all headers same as the client
for k, vs := range clientRequest.Header {
if k == "Content-Length" {
continue
}
for _, v := range vs {
serverRequest.Header.Set(k, v)
}
}
serverRequest.Header.Set("X-Forwarded-For", clientRequest.RemoteAddr)
// TODO use a context or something
// Actually perform the request
// TODO next version will do something with the server response, check for !200 maybe
_, err = client.Do(serverRequest)
if err != nil {
errorjson(w, 400, err.Error())
return
}
w.Write([]byte("Successful send"))
}