Skip to content

Commit aa1995c

Browse files
committed
commit delayed return demo
Signed-off-by: yangyang <yang.yang@daocloud.io>
1 parent ad6a8d5 commit aa1995c

File tree

7 files changed

+122
-116
lines changed

7 files changed

+122
-116
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ jobs:
3131
uses: docker/build-push-action@v4
3232
with:
3333
push: true
34-
tags: release.daocloud.io/skoala/envoy-extproc-payloadlimit-demo-go:${{ github.sha }}
34+
tags: release.daocloud.io/skoala/envoy-extproc-delayed-return:${{ github.sha }}

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ FROM busybox
2020
COPY --from=0 /extproc /bin/extproc
2121
RUN chmod +x /bin/extproc
2222

23-
ARG EXAMPLE=payload-limit
23+
ARG EXAMPLE=delayed-return
2424

2525
EXPOSE 50051
2626

2727
ENTRYPOINT [ "/bin/extproc" ]
28-
CMD [ "payload-limit", "--log-stream", "--log-phases", "payload-limit", "32" ]
28+
CMD [ "delayed-return", "--log-stream", "--log-phases" ]

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# envoy-extproc-payloadlimit-demo-go
1+
# envoy-extproc-delayed-return-demo
22

3-
This repository contains a demo application written in Go that demonstrates the usage of Envoy's External Processor (ExtProc) filter to do `payload limit` for POST request.
3+
This repository contains a demo application written in Go that demonstrates the usage of Envoy's External Processor (ExtProc) filter to do `delayed return` for POST request.
44

55
## Overview
66

@@ -19,7 +19,7 @@ To get started with the demo application, follow these steps:
1919

2020
1. Clone the repository:
2121
```
22-
git clone https://github.com/projectsesame/envoy-extproc-payloadlimit-demo-go.git
22+
git clone https://github.com/projectsesame/envoy-extproc-delayed-return.git
2323
```
2424
2525
2. Build the Go application:
@@ -29,7 +29,7 @@ To get started with the demo application, follow these steps:
2929
3030
3. Run the application:
3131
```
32-
./envoy-extproc-payloadlimit-demo-go payload-limit --log-stream --log-phases payload-limit 32
32+
./envoy-extproc-delayed-return delayed-return --log-stream --log-phases
3333
```
3434
3535
@@ -51,4 +51,4 @@ Special thanks to the community for their contributions and support.
5151
5252
## Contact
5353
54-
For any questions or inquiries, please feel free to reach out to us for any assistance or feedback.
54+
For any questions or inquiries, please feel free to reach out to us for any assistance or feedback.

delayed-return.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"strconv"
6+
"time"
7+
8+
typev3 "github.com/envoyproxy/go-control-plane/envoy/type/v3"
9+
ep "github.com/wrossmorrow/envoy-extproc-sdk-go"
10+
)
11+
12+
type delayedReturnRequestProcessor struct {
13+
opts *ep.ProcessingOptions
14+
}
15+
16+
func (s *delayedReturnRequestProcessor) GetName() string {
17+
return "delayed-return"
18+
}
19+
20+
func (s *delayedReturnRequestProcessor) GetOptions() *ep.ProcessingOptions {
21+
return s.opts
22+
}
23+
24+
const kDelayedTime = "delayed-time"
25+
26+
func (s *delayedReturnRequestProcessor) ProcessRequestHeaders(ctx *ep.RequestContext, headers ep.AllHeaders) error {
27+
cancel := func(code int32, msg string) error {
28+
return ctx.CancelRequest(code, map[string]ep.HeaderValue{}, typev3.StatusCode_name[code])
29+
}
30+
31+
var delayedTime int64
32+
var err error
33+
34+
if headers.RawHeaders[kDelayedTime] == nil {
35+
delayedTime = 100
36+
log.Printf("[%s], delayed-time header is not set, use default value 100", ctx.RequestID)
37+
38+
} else {
39+
delayedTime, err = strconv.ParseInt(string(headers.RawHeaders[kDelayedTime]), 10, 64)
40+
if err != nil {
41+
return cancel(400, "delayed-time header is invalid")
42+
}
43+
}
44+
45+
if delayedTime < 0 {
46+
return cancel(400, "delayed-time header is invalid")
47+
}
48+
49+
ctx.SetValue("delayed-time", delayedTime)
50+
51+
logDelayedTime(ctx, "ProcessRequestHeaders")
52+
53+
return ctx.ContinueRequest()
54+
}
55+
56+
func (s *delayedReturnRequestProcessor) ProcessRequestBody(ctx *ep.RequestContext, body []byte) error {
57+
58+
logDelayedTime(ctx, "ProcessRequestBody")
59+
60+
return ctx.ContinueRequest()
61+
}
62+
63+
func logDelayedTime(ctx *ep.RequestContext, method string) {
64+
65+
var delayedTime int64
66+
67+
v, _ := ctx.GetValue(`delayed-time`)
68+
69+
delayedTime = v.(int64)
70+
71+
now := time.Now()
72+
time.Sleep(time.Duration(delayedTime) * time.Millisecond)
73+
74+
log.Printf("[%s],process %s, delayed time: %d, elapsed time: %d\n", ctx.RequestID, method, delayedTime, time.Since(now).Milliseconds())
75+
76+
}
77+
78+
func (s *delayedReturnRequestProcessor) ProcessRequestTrailers(ctx *ep.RequestContext, trailers ep.AllHeaders) error {
79+
80+
logDelayedTime(ctx, "ProcessRequestTrailers")
81+
82+
return ctx.ContinueRequest()
83+
}
84+
85+
func (s *delayedReturnRequestProcessor) ProcessResponseHeaders(ctx *ep.RequestContext, headers ep.AllHeaders) error {
86+
87+
logDelayedTime(ctx, "ProcessResponseHeaders")
88+
return ctx.ContinueRequest()
89+
}
90+
91+
func (s *delayedReturnRequestProcessor) ProcessResponseBody(ctx *ep.RequestContext, body []byte) error {
92+
93+
logDelayedTime(ctx, "ProcessResponseBody")
94+
return ctx.ContinueRequest()
95+
}
96+
97+
func (s *delayedReturnRequestProcessor) ProcessResponseTrailers(ctx *ep.RequestContext, trailers ep.AllHeaders) error {
98+
99+
logDelayedTime(ctx, "ProcessResponseTrailers")
100+
return ctx.ContinueRequest()
101+
}
102+
103+
func (s *delayedReturnRequestProcessor) Init(opts *ep.ProcessingOptions, nonFlagArgs []string) error {
104+
s.opts = opts
105+
return nil
106+
}
107+
108+
func (s *delayedReturnRequestProcessor) Finish() {}

envoy.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ static_resources:
3535
"@type": type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor
3636
grpc_service:
3737
envoy_grpc:
38-
cluster_name: payload-limit
38+
cluster_name: delayed-return
3939
timeout: 30s
4040
failure_mode_allow: true
4141
message_timeout: 0.2s
@@ -70,19 +70,19 @@ static_resources:
7070
socket_address:
7171
address: upstream
7272
port_value: 8000
73-
- name: payload-limit
73+
- name: delayed-return
7474
dns_lookup_family: V4_ONLY
7575
lb_policy: LEAST_REQUEST
7676
load_assignment:
77-
cluster_name: payload-limit
77+
cluster_name: delayed-return
7878
endpoints:
7979
- lb_endpoints:
8080
- endpoint:
8181
address:
8282
socket_address:
83-
address: payload-limit
83+
address: delayed-return
8484
port_value: 50051
85-
hostname: payload-limit
85+
hostname: delayed-return
8686
type: LOGICAL_DNS
8787
typed_extension_protocol_options:
8888
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type processor interface {
1616
}
1717

1818
var processors = map[string]processor{
19-
"payload-limit": &payloadLimitRequestProcessor{},
19+
"delayed-return": &delayedReturnRequestProcessor{},
2020
}
2121

2222
func parseArgs(args []string) (port *int, opts *ep.ProcessingOptions, nonFlagArgs []string) {

payload-limit.go

Lines changed: 0 additions & 102 deletions
This file was deleted.

0 commit comments

Comments
 (0)