1
- package routes
1
+ package server
2
2
3
3
import (
4
4
"encoding/hex"
7
7
"regexp"
8
8
9
9
"github.com/google/go-jsonnet"
10
- "github.com/jdockerty/jsonnet-playground/internal/server/state"
11
10
)
12
11
13
12
var (
@@ -23,33 +22,33 @@ var (
23
22
)
24
23
25
24
// Health indicates whether the server is running.
26
- func Health ( state * state. State ) http.HandlerFunc {
25
+ func ( srv * PlaygroundServer ) Health ( ) http.HandlerFunc {
27
26
return func (w http.ResponseWriter , r * http.Request ) {
28
- state .Logger .Debug ("health" )
27
+ srv . State .Logger .Debug ("health" )
29
28
_ , _ = w .Write ([]byte ("OK" ))
30
29
}
31
30
}
32
31
33
32
// HandleRun receives Jsonnet input via text and evaluates it.
34
- func HandleRun ( state * state. State ) http.HandlerFunc {
33
+ func ( srv * PlaygroundServer ) HandleRun ( ) http.HandlerFunc {
35
34
return func (w http.ResponseWriter , r * http.Request ) {
36
35
if r .Method != http .MethodPost {
37
- state .Logger .Error ("incorrect method to run handler" , "method" , r .Method )
36
+ srv . State .Logger .Error ("incorrect method to run handler" , "method" , r .Method )
38
37
http .Error (w , "must be POST" , http .StatusBadRequest )
39
38
return
40
39
}
41
40
42
41
incomingJsonnet := r .FormValue ("jsonnet-input" )
43
- state .Logger .Info ("run triggered" , "jsonnet" , incomingJsonnet )
44
- evaluated , err := state .EvaluateSnippet (incomingJsonnet )
42
+ srv . State .Logger .Info ("run triggered" , "jsonnet" , incomingJsonnet )
43
+ evaluated , err := srv . State .EvaluateSnippet (incomingJsonnet )
45
44
if err != nil {
46
- state .Logger .Error ("invalid snippet" , "jsonnet" , incomingJsonnet )
45
+ srv . State .Logger .Error ("invalid snippet" , "jsonnet" , incomingJsonnet )
47
46
// TODO: display an error for the bad req rather than using a 200
48
47
_ , _ = w .Write ([]byte (err .Error ()))
49
48
return
50
49
}
51
50
52
- state .Logger .Info ("evaluated" , "jsonnet" , evaluated )
51
+ srv . State .Logger .Info ("evaluated" , "jsonnet" , evaluated )
53
52
_ , _ = w .Write ([]byte (evaluated ))
54
53
}
55
54
}
@@ -59,89 +58,89 @@ func HandleRun(state *state.State) http.HandlerFunc {
59
58
// store - this storage mechanism is ephemeral.
60
59
//
61
60
// At a later date, this will include a persistence layer.
62
- func HandleCreateShare ( state * state. State ) http.HandlerFunc {
61
+ func ( srv * PlaygroundServer ) HandleCreateShare ( ) http.HandlerFunc {
63
62
return func (w http.ResponseWriter , r * http.Request ) {
64
63
if r .Method != http .MethodPost {
65
- state .Logger .Error ("incorrect method to create share handler" , "method" , r .Method )
64
+ srv . State .Logger .Error ("incorrect method to create share handler" , "method" , r .Method )
66
65
http .Error (w , "must be POST" , http .StatusBadRequest )
67
66
return
68
67
}
69
68
70
69
incomingJsonnet := r .FormValue ("jsonnet-input" )
71
- _ , err := state .EvaluateSnippet (incomingJsonnet )
70
+ _ , err := srv . State .EvaluateSnippet (incomingJsonnet )
72
71
if err != nil {
73
- state .Logger .Error ("invalid share" , "jsonnet" , incomingJsonnet )
72
+ srv . State .Logger .Error ("invalid share" , "jsonnet" , incomingJsonnet )
74
73
// TODO: display an error for the bad req rather than using a 200
75
74
_ , _ = w .Write ([]byte ("Share is not available for invalid Jsonnet. Run your snippet to see the result." ))
76
75
return
77
76
}
78
77
79
- snippetHash := hex .EncodeToString (state .Hasher .Sum ([]byte (incomingJsonnet )))[:15 ]
80
- if _ , ok := state .Store [snippetHash ]; ! ok {
81
- state .Logger .Info ("store creation" , "hash" , snippetHash )
82
- state .Store [snippetHash ] = incomingJsonnet
78
+ snippetHash := hex .EncodeToString (srv . State .Hasher .Sum ([]byte (incomingJsonnet )))[:15 ]
79
+ if _ , ok := srv . State .Store [snippetHash ]; ! ok {
80
+ srv . State .Logger .Info ("store creation" , "hash" , snippetHash )
81
+ srv . State .Store [snippetHash ] = incomingJsonnet
83
82
} else {
84
- state .Logger .Info ("store update" , "hash" , snippetHash )
85
- state .Store [snippetHash ] = incomingJsonnet
83
+ srv . State .Logger .Info ("store update" , "hash" , snippetHash )
84
+ srv . State .Store [snippetHash ] = incomingJsonnet
86
85
}
87
- shareMsg := fmt .Sprintf ("%s/share/%s" , state .Config .ShareDomain , snippetHash )
88
- state .Logger .Debug ("created share link" , "link" , shareMsg )
86
+ shareMsg := fmt .Sprintf ("%s/share/%s" , srv . State .Config .ShareDomain , snippetHash )
87
+ srv . State .Logger .Debug ("created share link" , "link" , shareMsg )
89
88
_ , _ = w .Write ([]byte ("Link: " + shareMsg ))
90
89
}
91
90
}
92
91
93
92
// HandleGetShare attempts to retrieve a shared snippet hash from the internal
94
93
// store. If this does not exist, an error is displayed.
95
- func HandleGetShare ( state * state. State ) http.HandlerFunc {
94
+ func ( srv * PlaygroundServer ) HandleGetShare ( ) http.HandlerFunc {
96
95
return func (w http.ResponseWriter , r * http.Request ) {
97
96
if r .Method != http .MethodGet {
98
- state .Logger .Error ("incorrect method to get share handler" , "method" , r .Method )
97
+ srv . State .Logger .Error ("incorrect method to get share handler" , "method" , r .Method )
99
98
http .Error (w , "must be GET" , http .StatusBadRequest )
100
99
return
101
100
}
102
101
shareHash := r .PathValue ("shareHash" )
103
- state .Logger .Info ("attempting to load shared snippet" , "hash" , shareHash )
102
+ srv . State .Logger .Info ("attempting to load shared snippet" , "hash" , shareHash )
104
103
105
- snippet , ok := state .Store [shareHash ]
104
+ snippet , ok := srv . State .Store [shareHash ]
106
105
if ! ok {
107
- state .Logger .Warn ("no share snippet exists" , "hash" , shareHash )
106
+ srv . State .Logger .Warn ("no share snippet exists" , "hash" , shareHash )
108
107
errMsg := fmt .Errorf ("No share snippet exists for %s, it might have expired.\n " , shareHash )
109
108
_ , _ = w .Write ([]byte (errMsg .Error ()))
110
109
return
111
110
}
112
- state .Logger .Info ("loaded shared snippet" , "hash" , shareHash )
111
+ srv . State .Logger .Info ("loaded shared snippet" , "hash" , shareHash )
113
112
_ , _ = w .Write ([]byte (snippet ))
114
113
}
115
114
}
116
115
117
116
// Format the input Jsonnet according to the standard jsonnetfmt rules.
118
- func HandleFormat ( state * state. State ) http.HandlerFunc {
117
+ func ( srv * PlaygroundServer ) HandleFormat ( ) http.HandlerFunc {
119
118
return func (w http.ResponseWriter , r * http.Request ) {
120
119
if r .Method != http .MethodPost {
121
- state .Logger .Error ("incorrect method to format handler" , "method" , r .Method )
120
+ srv . State .Logger .Error ("incorrect method to format handler" , "method" , r .Method )
122
121
http .Error (w , "must be POST" , http .StatusBadRequest )
123
122
return
124
123
}
125
124
126
125
incomingJsonnet := r .FormValue ("jsonnet-input" )
127
- state .Logger .Info ("attempting to format" , "jsonnet" , incomingJsonnet )
128
- formattedJsonnet , err := state .FormatSnippet (incomingJsonnet )
126
+ srv . State .Logger .Info ("attempting to format" , "jsonnet" , incomingJsonnet )
127
+ formattedJsonnet , err := srv . State .FormatSnippet (incomingJsonnet )
129
128
if err != nil {
130
- state .Logger .Warn ("cannot format invalid jsonnet" )
129
+ srv . State .Logger .Warn ("cannot format invalid jsonnet" )
131
130
http .Error (w , "Format is not available for invalid Jsonnet. Run your snippet to see the result." , http .StatusBadRequest )
132
131
return
133
132
}
134
- state .Logger .Info ("formatted" , "jsonnet" , formattedJsonnet )
133
+ srv . State .Logger .Info ("formatted" , "jsonnet" , formattedJsonnet )
135
134
_ , _ = w .Write ([]byte (formattedJsonnet ))
136
135
}
137
136
}
138
137
139
138
// Retrieve the current version of Jsonnet/Kubecfg in use for the running application.
140
139
// This is purely informational for the frontend.
141
- func HandleVersions ( state * state. State ) http.HandlerFunc {
140
+ func ( srv * PlaygroundServer ) HandleVersions ( ) http.HandlerFunc {
142
141
return func (w http.ResponseWriter , r * http.Request ) {
143
142
if r .Method != http .MethodGet {
144
- state .Logger .Error ("incorrect method to versions handler" , "method" , r .Method )
143
+ srv . State .Logger .Error ("incorrect method to versions handler" , "method" , r .Method )
145
144
http .Error (w , "must be POST" , http .StatusBadRequest )
146
145
return
147
146
}
@@ -152,17 +151,17 @@ func HandleVersions(state *state.State) http.HandlerFunc {
152
151
// Middleware to stop Jsonnet snippets which contain file:///, typically paired
153
152
// with an import, being used and becoming shareable. These are rejected before
154
153
// running through the Jsonnet VM and a generic error is displayed.
155
- func DisableFileImports (state * state. State , next http.Handler ) http.HandlerFunc {
154
+ func DisableFileImports (srv * PlaygroundServer , next http.Handler ) http.HandlerFunc {
156
155
return func (w http.ResponseWriter , r * http.Request ) {
157
156
err := r .ParseForm ()
158
157
if err != nil {
159
- state .Logger .Error ("unable to parse form" )
158
+ srv . State .Logger .Error ("unable to parse form" )
160
159
http .Error (w , "unable to parse form" , http .StatusBadRequest )
161
160
return
162
161
}
163
162
incomingJsonnet := r .FormValue ("jsonnet-input" )
164
163
if ok := disallowFileImports .Match ([]byte (incomingJsonnet )); ok {
165
- state .Logger .Warn ("attempt to import file" , "jsonnet" , incomingJsonnet )
164
+ srv . State .Logger .Warn ("attempt to import file" , "jsonnet" , incomingJsonnet )
166
165
_ , _ = w .Write ([]byte ("File imports are disabled." ))
167
166
return
168
167
}
0 commit comments