Skip to content

Commit e67df47

Browse files
committed
init
Signed-off-by: Takeshi Yoneda <t.y.mathetake@gmail.com>
1 parent 5a76040 commit e67df47

3 files changed

Lines changed: 57 additions & 21 deletions

File tree

go/javascript.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"log"
77
"math/rand"
88
"os"
9-
"strings"
109
"sync"
1110

1211
"github.com/dop251/goja"
@@ -44,9 +43,8 @@ type (
4443
func newJavaScriptFilterConfig(userCode string) gosdk.HttpFilterConfig {
4544
c := &javaScriptFilterConfig{}
4645

47-
script := completeJavaScriptCode(userCode)
4846
for i := range numberOfVMPool {
49-
vm, err := newJavaScriptVM(script, os.Stdout)
47+
vm, err := newJavaScriptVM(userCode, os.Stdout)
5048
if err != nil {
5149
log.Printf("failed to create JavaScript VM: %v", err)
5250
return nil
@@ -56,15 +54,6 @@ func newJavaScriptFilterConfig(userCode string) gosdk.HttpFilterConfig {
5654
return c
5755
}
5856

59-
func completeJavaScriptCode(userCode string) string {
60-
return strings.Join([]string{
61-
userCode,
62-
fmt.Sprintf(functionDeclTemplate, javaScriptExportedSymbolOnConfig),
63-
fmt.Sprintf(functionDeclTemplate, javaScriptExportedSymbolOnRequestHeaders),
64-
fmt.Sprintf(functionDeclTemplate, javaScriptExportedSymbolOnResponseHeaders),
65-
}, "\n")
66-
}
67-
6857
func newJavaScriptVM(script string, w io.Writer) (*javaScriptVM, error) {
6958
vm := goja.New()
7059
console := vm.NewObject()

integration/envoy.yaml

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,23 +36,28 @@ static_resources:
3636
filter_config:
3737
"@type": "type.googleapis.com/google.protobuf.StringValue"
3838
value: |
39-
/// Called with String argument passed from the host.
40-
function OnConfigure () {
41-
console.log("OnConfigure called");
42-
}
39+
/// Called when the filter is configured. This is called once per VM instance.
40+
function OnConfigure () {}
4341
/// Called when a request header is received. `ctx` object has the following properties:
4442
///
45-
/// - `getHeader(name: String): String`: Function to get a header value.
46-
/// - `setHeader(name: String, value: String): void`: Function to set a header value.
43+
/// - `getRequestHeader(name: String): String`: Function to get a request header value.
44+
/// - `setRequestHeader(name: String, value: String): void`: Function to set a request header value.
4745
function OnRequestHeaders(ctx) {
4846
console.log("OnRequestHeader called");
47+
let foo = ctx.getRequestHeader("foo");
48+
ctx.setRequestHeader("x-foo", foo);
4949
}
5050
/// Called when a response header is received. `ctx` object has the following properties:
5151
///
52-
/// - `getHeader(name: String): String`: Function to get a header value.
53-
/// - `setHeader(name: String, value: String): void`: Function to set a header value.
52+
/// - `getRequestHeader(name: String): String`: Function to get a request header value.
53+
/// - `getResponseHeader(name: String): String`: Function to get a response header value.
54+
/// - `setResponseHeader(name: String, value: String): void`: Function to set a response header value.
5455
function OnResponseHeaders(ctx) {
55-
console.log("OnResponseHeader called");
56+
let dog = ctx.getRequestHeader("dog");
57+
ctx.setResponseHeader("x-dog", dog);
58+
let status = ctx.getResponseHeader(":status");
59+
ctx.setResponseHeader("x-status", status);
60+
console.log("Response status: ", status);
5661
}
5762
- name: dynamic_modules/passthrough
5863
typed_config:

integration/main_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,48 @@ func TestIntegration(t *testing.T) {
332332
}
333333
})
334334

335+
t.Run("javascript", func(t *testing.T) {
336+
require.Eventually(t, func() bool {
337+
req, err := http.NewRequest("GET", "http://localhost:1062/headers", nil)
338+
require.NoError(t, err)
339+
req.Header.Set("dog", "cat")
340+
req.Header.Set("foo", "bar")
341+
342+
resp, err := http.DefaultClient.Do(req)
343+
if err != nil {
344+
t.Logf("Envoy not ready yet: %v", err)
345+
return false
346+
}
347+
defer func() {
348+
require.NoError(t, resp.Body.Close())
349+
}()
350+
body, err := io.ReadAll(resp.Body)
351+
if err != nil {
352+
t.Logf("Envoy not ready yet: %v", err)
353+
return false
354+
}
355+
356+
t.Logf("response: headers=%v, body=%s", resp.Header, string(body))
357+
require.Equal(t, 200, resp.StatusCode)
358+
359+
// HttpBin returns a JSON object containing the request headers in this format.
360+
type httpBinHeadersBody struct {
361+
Headers map[string][]string `json:"headers"`
362+
}
363+
var headersBody httpBinHeadersBody
364+
require.NoError(t, json.Unmarshal(body, &headersBody))
365+
366+
require.Contains(t, headersBody.Headers["X-Foo"], "bar")
367+
require.Contains(t, headersBody.Headers["Foo"], "bar")
368+
require.Contains(t, headersBody.Headers["Dog"], "cat")
369+
370+
// We also need to check that the response headers were mutated.
371+
require.Equal(t, "cat", resp.Header.Get("x-dog"))
372+
require.Equal(t, "200", resp.Header.Get("x-status"))
373+
return true
374+
}, 30*time.Second, 200*time.Millisecond)
375+
})
376+
335377
t.Run("http_metrics", func(t *testing.T) {
336378
// Send test request
337379
require.Eventually(t, func() bool {

0 commit comments

Comments
 (0)