|
1 | 1 | package main |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "strconv" |
5 | 4 | "time" |
6 | 5 |
|
7 | | - "github.com/envoyproxy/dynamic-modules-examples/go/gosdk" |
| 6 | + "github.com/envoyproxy/envoy/source/extensions/dynamic_modules/sdk/go/shared" |
8 | 7 | ) |
9 | 8 |
|
10 | 9 | type ( |
11 | | - // delayFilterConfig implements [gosdk.HttpFilterConfig]. |
12 | | - delayFilterConfig struct{} |
13 | | - // delayFilter implements [gosdk.HttpFilter]. |
| 10 | + // delayFilterConfigFactory implements [shared.HttpFilterConfigFactory]. |
| 11 | + delayFilterConfigFactory struct { |
| 12 | + shared.EmptyHttpFilterConfigFactory |
| 13 | + } |
| 14 | + // delayFilterFactory implements [shared.HttpFilterFactory]. |
| 15 | + delayFilterFactory struct{} |
| 16 | + // delayFilter implements [shared.HttpFilter]. |
14 | 17 | // |
15 | | - // This filter demostrates how to use the scheduler to delay the request processing, |
| 18 | + // This filter demonstrates how to use the scheduler to delay the request processing, |
16 | 19 | // and how to use goroutines to perform the asynchronous operations. |
17 | 20 | delayFilter struct { |
| 21 | + handle shared.HttpFilterHandle |
18 | 22 | onRequestHeaders time.Time |
19 | 23 | delayLapsed time.Duration |
| 24 | + shared.EmptyHttpFilter |
20 | 25 | } |
21 | 26 | ) |
22 | 27 |
|
23 | | -// Destroy implements [gosdk.HttpFilterConfig]. |
24 | | -func (p delayFilterConfig) Destroy() {} |
25 | | - |
26 | | -// NewFilter implements [gosdk.HttpFilterConfig]. |
27 | | -func (p delayFilterConfig) NewFilter() gosdk.HttpFilter { return &delayFilter{} } |
| 28 | +// Create implements [shared.HttpFilterConfigFactory]. |
| 29 | +func (p *delayFilterConfigFactory) Create(handle shared.HttpFilterConfigHandle, unparsedConfig []byte) (shared.HttpFilterFactory, error) { |
| 30 | + return &delayFilterFactory{}, nil |
| 31 | +} |
28 | 32 |
|
29 | | -// Destroy implements [gosdk.HttpFilter]. |
30 | | -func (p *delayFilter) Destroy() {} |
| 33 | +// Create implements [shared.HttpFilterFactory]. |
| 34 | +func (p *delayFilterFactory) Create(handle shared.HttpFilterHandle) shared.HttpFilter { |
| 35 | + return &delayFilter{handle: handle} |
| 36 | +} |
31 | 37 |
|
32 | | -// RequestHeaders implements [gosdk.HttpFilter]. |
33 | | -func (p *delayFilter) RequestHeaders(e gosdk.EnvoyHttpFilter, endOfStream bool) gosdk.RequestHeadersStatus { |
| 38 | +// OnRequestHeaders implements [shared.HttpFilter]. |
| 39 | +func (p *delayFilter) OnRequestHeaders(headers shared.HeaderMap, endOfStream bool) shared.HeadersStatus { |
34 | 40 | // Check if the headers contain the "do-delay" header to trigger the delay. |
35 | | - if _, ok := e.GetRequestHeader("do-delay"); !ok { |
| 41 | + if len(headers.Get("do-delay")) == 0 { |
36 | 42 | // If the header is not present, continue the request processing. |
37 | | - return gosdk.RequestHeadersStatusContinue |
| 43 | + return shared.HeadersStatusContinue |
38 | 44 | } |
39 | 45 |
|
40 | | - schduler := e.NewScheduler() |
| 46 | + scheduler := p.handle.GetScheduler() |
41 | 47 | now := time.Now() |
42 | 48 | p.onRequestHeaders = now |
43 | 49 | go func() { |
44 | | - // Scheduler must be closed to avoid memory leaks. |
45 | | - defer schduler.Close() |
46 | 50 | // Simulate some delay. |
47 | 51 | time.Sleep(2 * time.Second) |
48 | 52 | // Commit the event to continue the request processing. |
49 | | - schduler.Commit(0) |
| 53 | + scheduler.Schedule(func() { |
| 54 | + p.delayLapsed = time.Since(p.onRequestHeaders) |
| 55 | + // We can insert some headers at this phase. |
| 56 | + headers := p.handle.RequestHeaders() |
| 57 | + headers.Set("delay-filter-on-scheduled", "yes") |
| 58 | + // Then continue the request processing. |
| 59 | + p.handle.ContinueRequest() |
| 60 | + }) |
50 | 61 | }() |
51 | | - return gosdk.RequestHeadersStatusStopIteration |
| 62 | + return shared.HeadersStatusStop |
52 | 63 | } |
53 | 64 |
|
54 | | -// Scheduled implements gosdk.HttpFilter. |
55 | | -func (p *delayFilter) Scheduled(e gosdk.EnvoyHttpFilter, eventID uint64) { |
56 | | - if eventID != 0 { |
57 | | - panic("unexpected eventID in Scheduled: " + strconv.Itoa(int(eventID))) |
58 | | - } |
59 | | - p.delayLapsed = time.Since(p.onRequestHeaders) |
60 | | - // We can insert some headers at this phase. |
61 | | - e.SetRequestHeader("delay-filter-on-scheduled", []byte("yes")) |
62 | | - // Then continue the request processing. |
63 | | - e.ContinueRequest() |
64 | | -} |
65 | | - |
66 | | -// RequestBody implements [gosdk.HttpFilter]. |
67 | | -func (p *delayFilter) RequestBody(e gosdk.EnvoyHttpFilter, endOfStream bool) gosdk.RequestBodyStatus { |
68 | | - return gosdk.RequestBodyStatusContinue |
69 | | -} |
70 | | - |
71 | | -// ResponseHeaders implements [gosdk.HttpFilter]. |
72 | | -func (p *delayFilter) ResponseHeaders(e gosdk.EnvoyHttpFilter, endOfStream bool) gosdk.ResponseHeadersStatus { |
| 65 | +// OnResponseHeaders implements [shared.HttpFilter]. |
| 66 | +func (p *delayFilter) OnResponseHeaders(headers shared.HeaderMap, endOfStream bool) shared.HeadersStatus { |
73 | 67 | // Add a response header to indicate the delay. |
74 | 68 | if p.delayLapsed > 0 { |
75 | | - e.SetResponseHeader("x-delay-filter-lapsed", []byte(p.delayLapsed.String())) |
| 69 | + headers.Set("x-delay-filter-lapsed", p.delayLapsed.String()) |
76 | 70 | } |
77 | | - return gosdk.ResponseHeadersStatusContinue |
78 | | -} |
79 | | - |
80 | | -// ResponseBody implements [gosdk.HttpFilter]. |
81 | | -func (p *delayFilter) ResponseBody(e gosdk.EnvoyHttpFilter, endOfStream bool) gosdk.ResponseBodyStatus { |
82 | | - return gosdk.ResponseBodyStatusContinue |
| 71 | + return shared.HeadersStatusContinue |
83 | 72 | } |
0 commit comments