Skip to content

Commit 0ea35cb

Browse files
authored
Add env endpoint (#21)
1 parent 9d46f31 commit 0ea35cb

File tree

4 files changed

+99
-7
lines changed

4 files changed

+99
-7
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
# go-infrabin
22

3-
[![Build Status](https://travis-ci.org/maruina/go-infrabin.svg?branch=master)](https://travis-ci.org/maruina/go-infrabin)
43
[![Go Report Card](https://goreportcard.com/badge/github.com/maruina/go-infrabin)](https://goreportcard.com/report/github.com/maruina/go-infrabin)
54
[![Coverage Status](https://coveralls.io/repos/github/maruina/go-infrabin/badge.svg?branch=master)](https://coveralls.io/github/maruina/go-infrabin?branch=master)
65

76
[infrabin](https://github.com/maruina/infrabin) written in go.
87

8+
**Warning: `go-infrabin` exposes sensitive endpoints and should NEVER be used on the public Internet.**
9+
910
## Usage
1011

1112
`go-infrabin` exposes two ports:
@@ -52,6 +53,17 @@ To override the default values:
5253
}
5354
```
5455

56+
* `GET /env/<env_var>`
57+
* _returns_: a JSON response with the requested `<env_var>` or `404` if the environment variable does not exist
58+
59+
```json
60+
{
61+
"env": {
62+
"<env_var>": "<env_var_value>"
63+
}
64+
}
65+
```
66+
5567
## Admin Endpoints
5668

5769
* `GET /liveness`

cmd/go-infrabin/main.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,36 @@ func HeadersHandler(w http.ResponseWriter, r *http.Request) {
9797
}
9898
}
9999

100+
// EnvHandler handles the env endpoint
101+
func EnvHandler(w http.ResponseWriter, r *http.Request) {
102+
var resp helpers.Response
103+
vars := mux.Vars(r)
104+
w.Header().Set("Content-Type", "application/json")
105+
value := helpers.GetEnv(vars["env_var"], "")
106+
107+
if value == "" {
108+
data := helpers.MarshalResponseToString(resp)
109+
w.WriteHeader(http.StatusNotFound)
110+
_, err := io.WriteString(w, data)
111+
if err != nil {
112+
log.Fatal("error writing to ResponseWriter", err)
113+
}
114+
} else {
115+
116+
resp.Env = map[string]string{
117+
vars["env_var"]: value,
118+
}
119+
data := helpers.MarshalResponseToString(resp)
120+
121+
w.WriteHeader(http.StatusOK)
122+
_, err := io.WriteString(w, data)
123+
if err != nil {
124+
log.Fatal("error writing to ResponseWriter", err)
125+
}
126+
127+
}
128+
}
129+
100130
func main() {
101131
r := mux.NewRouter()
102132
a := mux.NewRouter()
@@ -105,6 +135,7 @@ func main() {
105135
r.HandleFunc("/", RootHandler)
106136
r.HandleFunc("/delay/{seconds}", DelayHandler)
107137
r.HandleFunc("/headers", HeadersHandler)
138+
r.HandleFunc("/env/{env_var}", EnvHandler)
108139

109140
a.HandleFunc("/liveness", LivenessHandler)
110141

cmd/go-infrabin/main_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,51 @@ func TestHeadersHandler(t *testing.T) {
191191
rr.Body.String(), data)
192192
}
193193
}
194+
195+
func TestEnvHandler(t *testing.T) {
196+
if err := os.Setenv("TEST_ENV", "foo"); err != nil {
197+
t.Errorf("cannot set environment variable")
198+
}
199+
req, err := http.NewRequest("GET", "/env", nil)
200+
req = mux.SetURLVars(req, map[string]string{"env_var": "TEST_ENV"})
201+
if err != nil {
202+
t.Fatal(err)
203+
}
204+
205+
rr := httptest.NewRecorder()
206+
handler := http.HandlerFunc(EnvHandler)
207+
handler.ServeHTTP(rr, req)
208+
209+
if status := rr.Code; status != http.StatusOK {
210+
t.Errorf("handler returned wrong status code: got %v want %v",
211+
status, http.StatusOK)
212+
}
213+
214+
var expected helpers.Response
215+
expected.Env = map[string]string{
216+
"TEST_ENV": "foo",
217+
}
218+
data := helpers.MarshalResponseToString(expected)
219+
220+
if rr.Body.String() != data {
221+
t.Errorf("handler returned unexpected body: got %v want %v",
222+
rr.Body.String(), data)
223+
}
224+
}
225+
226+
func TestEnvHandlerNotFound(t *testing.T) {
227+
req, err := http.NewRequest("GET", "/env", nil)
228+
req = mux.SetURLVars(req, map[string]string{"env_var": "NOT_FOUND"})
229+
if err != nil {
230+
t.Fatal(err)
231+
}
232+
233+
rr := httptest.NewRecorder()
234+
handler := http.HandlerFunc(EnvHandler)
235+
handler.ServeHTTP(rr, req)
236+
237+
if status := rr.Code; status != http.StatusNotFound {
238+
t.Errorf("handler returned wrong status code: got %v want %v",
239+
status, http.StatusNotFound)
240+
}
241+
}

internal/helpers/struct.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ import (
88

99
// Response creates the go-infrabin main response
1010
type Response struct {
11-
Hostname string `json:"hostname,omitempty"`
12-
KubeResponse *KubeResponse `json:"kubernetes,omitempty"`
13-
Liveness string `json:"liveness,omitempty"`
14-
Delay string `json:"delay,omitempty"`
15-
Error string `json:"error,omitempty"`
16-
Headers *http.Header `json:"headers,omitempty"`
11+
Hostname string `json:"hostname,omitempty"`
12+
KubeResponse *KubeResponse `json:"kubernetes,omitempty"`
13+
Liveness string `json:"liveness,omitempty"`
14+
Delay string `json:"delay,omitempty"`
15+
Error string `json:"error,omitempty"`
16+
Headers *http.Header `json:"headers,omitempty"`
17+
Env map[string]string `json:"env,omitempty"`
1718
}
1819

1920
// KubeResponse creates the response if running on Kubernetes

0 commit comments

Comments
 (0)