forked from roastedroot/proxy-wasm-java-host
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHttpBodyChunkTest.java
More file actions
141 lines (113 loc) · 4.38 KB
/
HttpBodyChunkTest.java
File metadata and controls
141 lines (113 loc) · 4.38 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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package io.roastedroot.proxywasm.examples;
import static io.roastedroot.proxywasm.Helpers.bytes;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import com.dylibso.chicory.wasm.Parser;
import com.dylibso.chicory.wasm.WasmModule;
import io.roastedroot.proxywasm.Action;
import io.roastedroot.proxywasm.HttpContext;
import io.roastedroot.proxywasm.ProxyWasm;
import io.roastedroot.proxywasm.StartException;
import java.nio.file.Path;
import java.util.Map;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/**
* Java port of https://github.com/proxy-wasm/proxy-wasm-go-sdk/blob/ab4161dcf9246a828008b539a82a1556cf0f2e24/examples/http_body_chunk/main_test.go
*/
public class HttpBodyChunkTest {
private static final WasmModule module =
Parser.parse(Path.of("./src/test/go-examples/http_body_chunk/main.wasm"));
private MockHandler handler;
private ProxyWasm proxyWasm;
private HttpContext host;
@BeforeEach
void setUp() throws StartException {
this.handler = new MockHandler();
ProxyWasm.Builder builder = ProxyWasm.builder();
this.proxyWasm = builder.build(module);
this.host = proxyWasm.createHttpContext(handler);
}
@AfterEach
void tearDown() {
host.close();
proxyWasm.close();
}
@Test
public void pauseUntilEOS() {
var action = host.callOnRequestBody(false);
Assertions.assertEquals(Action.PAUSE, action);
}
@Test
public void patternFound() {
var body = bytes("This is a payload with the pattern word.");
// Call OnRequestHeaders.
handler.setHttpRequestHeaders(Map.of("content-length", String.format("%d", body.length)));
var action = host.callOnRequestHeaders(false);
// Must be continued.
assertEquals(Action.CONTINUE, action);
// Call OnRequestBody.
handler.setHttpRequestBody(body);
action = host.callOnRequestBody(true);
// Must be paused
assertEquals(Action.PAUSE, action);
handler.assertLogsContain("pattern found in chunk: 1");
// Check the local response.
var response = handler.getSentHttpResponse();
assertNotNull(response);
assertEquals(403, response.statusCode);
}
@Test
public void patternFoundInMultipleChunks() {
var chunks =
new byte[][] {
bytes("chunk1..."),
bytes("chunk2..."),
bytes("chunk3..."),
bytes("chunk4 with pattern ...")
};
var chunksSize = 0;
for (byte[] chunk : chunks) {
chunksSize += chunk.length;
}
// Call OnRequestHeaders.
handler.setHttpRequestHeaders(Map.of("content-length", String.format("%d", chunksSize)));
var action = host.callOnRequestHeaders(false);
// Must be continued.
assertEquals(Action.CONTINUE, action);
// Call OnRequestBody.
for (byte[] chunk : chunks) {
handler.appendHttpRequestBody(chunk);
action = host.callOnRequestBody(false);
// Must be paused.
assertEquals(Action.PAUSE, action);
}
handler.assertLogsContain("pattern found in chunk: 4");
handler.assertLogsDoNotContain("read data does not match");
// Check the local response.
var response = handler.getSentHttpResponse();
assertNotNull(response);
assertEquals(403, response.statusCode);
}
@Test
public void patternNotFound() {
var body = bytes("This is a generic payload.");
// Call OnRequestHeaders.
handler.setHttpRequestHeaders(Map.of("content-length", String.format("%d", body.length)));
var action = host.callOnRequestHeaders(false);
// Must be continued.
assertEquals(Action.CONTINUE, action);
// Call OnRequestBody.
handler.setHttpRequestBody(body);
action = host.callOnRequestBody(false);
// Must be paused
assertEquals(Action.PAUSE, action);
// Call OnRequestBody.
action = host.callOnRequestBody(true);
// Must be paused
assertEquals(Action.CONTINUE, action);
handler.assertLogsContain("pattern not found");
}
}