Skip to content

Commit 3b01f20

Browse files
committed
gosdk: Adds scheduler callback example with delay filter
Signed-off-by: Takeshi Yoneda <t.y.mathetake@gmail.com>
1 parent 322993b commit 3b01f20

1 file changed

Lines changed: 85 additions & 0 deletions

File tree

go/delay.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"time"
7+
8+
"github.com/envoyproxy/dynamic-modules-examples/go/gosdk"
9+
)
10+
11+
type (
12+
// delayFilterConfig implements [gosdk.HttpFilterConfig].
13+
delayFilterConfig struct{}
14+
// delayFilter implements [gosdk.HttpFilter].
15+
//
16+
// This filter demostrates how to use the scheduler to delay the request processing,
17+
// and how to use goroutines to perform the asynchronous operations.
18+
delayFilter struct {
19+
onRequestHeaders time.Time
20+
delayLapsed time.Duration
21+
}
22+
)
23+
24+
// Destroy implements [gosdk.HttpFilterConfig].
25+
func (p delayFilterConfig) Destroy() {}
26+
27+
// NewFilter implements [gosdk.HttpFilterConfig].
28+
func (p delayFilterConfig) NewFilter() gosdk.HttpFilter { return &delayFilter{} }
29+
30+
// Destroy implements [gosdk.HttpFilter].
31+
func (p *delayFilter) Destroy() {}
32+
33+
// RequestHeaders implements [gosdk.HttpFilter].
34+
func (p *delayFilter) RequestHeaders(e gosdk.EnvoyHttpFilter, endOfStream bool) gosdk.RequestHeadersStatus {
35+
// Check if the headers contain the "do-delay" header to trigger the delay.
36+
if _, ok := e.GetRequestHeader("do-delay"); !ok {
37+
// If the header is not present, continue the request processing.
38+
fmt.Println("gosdk: RequestHeaders, do-delay header not found, continuing request processing")
39+
return gosdk.RequestHeadersStatusContinue
40+
}
41+
42+
schduler := e.NewScheduler()
43+
now := time.Now()
44+
p.onRequestHeaders = now
45+
go func() {
46+
// Simulate some delay.
47+
time.Sleep(2 * time.Second)
48+
// Commit the event to continue the request processing.
49+
schduler.Commit(0)
50+
}()
51+
fmt.Printf("gosdk: RequestHeaders, delaying request processing for 2 seconds at %s\n", now)
52+
return gosdk.RequestHeadersStatusStopIteration
53+
}
54+
55+
// Sheduled implements gosdk.HttpFilter.
56+
func (p *delayFilter) Sheduled(e gosdk.EnvoyHttpFilter, eventID uint64) {
57+
if eventID != 0 {
58+
panic("unexpected eventID in Sheduled: " + strconv.Itoa(int(eventID)))
59+
}
60+
fmt.Println("gosdk: Sheduled, continuing request processing after delay")
61+
p.delayLapsed = time.Since(p.onRequestHeaders)
62+
// We can insert some headers at this phase.
63+
e.SetRequestHeader("delay-filter-on-scheduled", []byte("yes"))
64+
// Then continue the request processing.
65+
e.ContinueRequest()
66+
}
67+
68+
// RequestBody implements [gosdk.HttpFilter].
69+
func (p *delayFilter) RequestBody(e gosdk.EnvoyHttpFilter, endOfStream bool) gosdk.RequestBodyStatus {
70+
return gosdk.RequestBodyStatusContinue
71+
}
72+
73+
// ResponseHeaders implements [gosdk.HttpFilter].
74+
func (p *delayFilter) ResponseHeaders(e gosdk.EnvoyHttpFilter, endOfStream bool) gosdk.ResponseHeadersStatus {
75+
// Add a response header to indicate the delay.
76+
if p.delayLapsed > 0 {
77+
e.SetResponseHeader("x-delay-filter-lapsed", []byte(p.delayLapsed.String()))
78+
}
79+
return gosdk.ResponseHeadersStatusContinue
80+
}
81+
82+
// ResponseBody implements [gosdk.HttpFilter].
83+
func (p *delayFilter) ResponseBody(e gosdk.EnvoyHttpFilter, endOfStream bool) gosdk.ResponseBodyStatus {
84+
return gosdk.ResponseBodyStatusContinue
85+
}

0 commit comments

Comments
 (0)