15
15
package main
16
16
17
17
import (
18
- "encoding/json"
19
18
"fmt"
20
19
"io/ioutil"
21
20
"log"
@@ -35,12 +34,9 @@ const (
35
34
)
36
35
37
36
type message struct {
38
- ID string
39
- Deadline int64
40
- StatusCode int
41
- Headers map [string ]interface {}
42
- IsBase64Encoded bool
43
- Body string
37
+ id string
38
+ deadline int64
39
+ data []byte
44
40
}
45
41
46
42
var (
@@ -86,37 +82,32 @@ func newTask(w http.ResponseWriter, r *http.Request) {
86
82
87
83
now := time .Now ().UnixNano ()
88
84
task := message {
89
- ID : fmt .Sprintf ("%d" , now ),
90
- Deadline : now + functionTTL ,
91
- Body : string ( body ) ,
85
+ id : fmt .Sprintf ("%d" , now ),
86
+ deadline : now + functionTTL ,
87
+ data : body ,
92
88
}
93
- fmt .Printf ("<- %s %s\n " , task .ID , task .Body )
89
+ fmt .Printf ("<- %s %s\n " , task .id , task .data )
94
90
95
91
resultsChannel := make (chan message )
96
92
mutex .Lock ()
97
- results [task .ID ] = resultsChannel
93
+ results [task .id ] = resultsChannel
98
94
mutex .Unlock ()
99
95
defer close (resultsChannel )
100
96
101
97
tasks <- task
102
98
103
99
select {
104
100
case <- time .After (time .Duration (functionTTL )):
105
- fmt .Printf ("-> ! %s Deadline is reached\n " , task .ID )
101
+ fmt .Printf ("-> ! %s Deadline is reached\n " , task .id )
106
102
w .WriteHeader (http .StatusGone )
107
- w .Write ([]byte (fmt .Sprintf ("Deadline is reached, data %s" , task .Body )))
103
+ w .Write ([]byte (fmt .Sprintf ("Deadline is reached, data %s" , task .data )))
108
104
case result := <- resultsChannel :
109
- fmt .Printf ("-> %s %d %s\n " , result .ID , result .StatusCode , result .Body )
110
- for k , v := range result .Headers {
111
- if value , ok := v .(string ); ok {
112
- w .Header ().Add (k , value )
113
- }
114
- }
115
- w .WriteHeader (result .StatusCode )
116
- w .Write ([]byte (result .Body ))
105
+ fmt .Printf ("-> %s %s\n " , result .id , result .data )
106
+ w .WriteHeader (http .StatusOK )
107
+ w .Write (result .data )
117
108
}
118
109
mutex .Lock ()
119
- delete (results , task .ID )
110
+ delete (results , task .id )
120
111
mutex .Unlock ()
121
112
return
122
113
}
@@ -125,13 +116,13 @@ func getTask(w http.ResponseWriter, r *http.Request) {
125
116
task := <- tasks
126
117
127
118
// Dummy headers required by Rust client. Replace with something meaningful
128
- w .Header ().Set ("Lambda-Runtime-Aws-Request-Id" , task .ID )
129
- w .Header ().Set ("Lambda-Runtime-Deadline-Ms" , strconv .Itoa (int (task .Deadline )))
119
+ w .Header ().Set ("Lambda-Runtime-Aws-Request-Id" , task .id )
120
+ w .Header ().Set ("Lambda-Runtime-Deadline-Ms" , strconv .Itoa (int (task .deadline )))
130
121
w .Header ().Set ("Lambda-Runtime-Invoked-Function-Arn" , "arn:aws:lambda:us-east-1:123456789012:function:custom-runtime" )
131
122
w .Header ().Set ("Lambda-Runtime-Trace-Id" , "0" )
132
123
133
124
w .WriteHeader (http .StatusOK )
134
- w .Write ([] byte ( task .Body ) )
125
+ w .Write (task .data )
135
126
return
136
127
}
137
128
@@ -163,7 +154,7 @@ func responseHandler(w http.ResponseWriter, r *http.Request) {
163
154
return
164
155
}
165
156
166
- body , err := ioutil .ReadAll (r .Body )
157
+ data , err := ioutil .ReadAll (r .Body )
167
158
if err != nil {
168
159
fmt .Printf ("! %s\n " , err )
169
160
return
@@ -179,41 +170,23 @@ func responseHandler(w http.ResponseWriter, r *http.Request) {
179
170
return
180
171
}
181
172
182
- result := message {
183
- Body : string (body ),
184
- StatusCode : 200 ,
185
- }
186
173
switch kind {
187
174
case "response" :
188
- if js , ok := parseJSON (body ); ok {
189
- result = js
190
- }
191
175
case "error" :
192
- result .StatusCode = 500
193
- fmt .Printf ("! Error: %s\n " , body )
176
+ fmt .Printf ("! Error: %s\n " , data )
194
177
default :
195
178
w .WriteHeader (http .StatusNotFound )
196
179
w .Write ([]byte (fmt .Sprintf ("Unknown endpoint: %s" , kind )))
197
180
return
198
181
}
199
- result .ID = id
200
- resultsChannel <- result
182
+ resultsChannel <- message {
183
+ id : id ,
184
+ data : data ,
185
+ }
201
186
w .WriteHeader (http .StatusAccepted )
202
187
return
203
188
}
204
189
205
- func parseJSON (s []byte ) (message , bool ) {
206
- var js message
207
- if err := json .Unmarshal (s , & js ); err != nil {
208
- fmt .Println (s , err )
209
- return js , false
210
- }
211
- if js .StatusCode == 0 {
212
- return js , false
213
- }
214
- return js , true
215
- }
216
-
217
190
func api () error {
218
191
apiRouter := http .NewServeMux ()
219
192
apiRouter .HandleFunc (awsEndpoint + "/init/error" , initError )
0 commit comments