-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathdelay.go
More file actions
72 lines (64 loc) · 2.35 KB
/
delay.go
File metadata and controls
72 lines (64 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main
import (
"time"
"github.com/envoyproxy/envoy/source/extensions/dynamic_modules/sdk/go/shared"
)
type (
// delayFilterConfigFactory implements [shared.HttpFilterConfigFactory].
delayFilterConfigFactory struct {
shared.EmptyHttpFilterConfigFactory
}
// delayFilterFactory implements [shared.HttpFilterFactory].
delayFilterFactory struct{}
// delayFilter implements [shared.HttpFilter].
//
// This filter demonstrates how to use the scheduler to delay the request processing,
// and how to use goroutines to perform the asynchronous operations.
delayFilter struct {
handle shared.HttpFilterHandle
onRequestHeaders time.Time
delayLapsed time.Duration
shared.EmptyHttpFilter
}
)
// Create implements [shared.HttpFilterConfigFactory].
func (p *delayFilterConfigFactory) Create(handle shared.HttpFilterConfigHandle, unparsedConfig []byte) (shared.HttpFilterFactory, error) {
return &delayFilterFactory{}, nil
}
// Create implements [shared.HttpFilterFactory].
func (p *delayFilterFactory) Create(handle shared.HttpFilterHandle) shared.HttpFilter {
return &delayFilter{handle: handle}
}
// OnRequestHeaders implements [shared.HttpFilter].
func (p *delayFilter) OnRequestHeaders(headers shared.HeaderMap, endOfStream bool) shared.HeadersStatus {
// Check if the headers contain the "do-delay" header to trigger the delay.
if len(headers.Get("do-delay")) == 0 {
// If the header is not present, continue the request processing.
return shared.HeadersStatusContinue
}
scheduler := p.handle.GetScheduler()
now := time.Now()
p.onRequestHeaders = now
go func() {
// Simulate some delay.
time.Sleep(2 * time.Second)
// Commit the event to continue the request processing.
scheduler.Schedule(func() {
p.delayLapsed = time.Since(p.onRequestHeaders)
// We can insert some headers at this phase.
headers := p.handle.RequestHeaders()
headers.Set("delay-filter-on-scheduled", "yes")
// Then continue the request processing.
p.handle.ContinueRequest()
})
}()
return shared.HeadersStatusStop
}
// OnResponseHeaders implements [shared.HttpFilter].
func (p *delayFilter) OnResponseHeaders(headers shared.HeaderMap, endOfStream bool) shared.HeadersStatus {
// Add a response header to indicate the delay.
if p.delayLapsed > 0 {
headers.Set("x-delay-filter-lapsed", p.delayLapsed.String())
}
return shared.HeadersStatusContinue
}