Skip to content

Commit d0cbed7

Browse files
authored
Merge pull request #3 from kauche/rust
all: Rewritten in Rust
2 parents 9832dce + 4955eb8 commit d0cbed7

File tree

9 files changed

+259
-1
lines changed

9 files changed

+259
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/vendor
22
/.bin
33
/.env
4+
/target

Cargo.lock

Lines changed: 141 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "proxy-wasm-http-header-rename"
3+
version = "0.3.0"
4+
edition = "2021"
5+
6+
[lib]
7+
crate-type = ["cdylib"]
8+
9+
[dependencies]
10+
proxy-wasm = { git = "https://github.com/proxy-wasm/proxy-wasm-rust-sdk.git", branch = "main" }
11+
serde = { version = "1.0.216", features = ["derive"] }
12+
serde_json = "1.0.134"

Dockerfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
ARG RUST_VERSION=1.85.1
2+
3+
FROM rust:${RUST_VERSION}
4+
5+
RUN rustup target add wasm32-wasip1 --toolchain "${RUST_VERSION}"

Dockerfile.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*

Makefile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ test-docker:
3737
build: $(TINYGO)
3838
@$(TINYGO) build -o $(BIN_DIR)/proxy-wasm-http-header-rename.wasm -scheduler=none -target=wasi .
3939

40+
.PHONY: build-rust
41+
build-rust:
42+
@cargo build --target wasm32-wasip1 --release
43+
@cp ./target/wasm32-wasip1/release/proxy_wasm_http_header_rename.wasm $(BIN_DIR)/proxy-wasm-http-header-rename.wasm
44+
4045
.PHONY: build-docker
4146
build-docker:
4247
@docker run \
@@ -47,3 +52,14 @@ build-docker:
4752
--workdir /workspace \
4853
golang:1.21.7-bullseye \
4954
make build
55+
56+
.PHONY: build-docker-rust
57+
build-docker-rust:
58+
@docker build -t proxy-wasm-http-header-rename-rust-builder -f ./Dockerfile .
59+
@docker run \
60+
--rm \
61+
--volume "$(shell pwd):/workspace" \
62+
--user "$(shell id -u):$(shell id -g)" \
63+
--workdir /workspace \
64+
proxy-wasm-http-header-rename-rust-builder \
65+
make build-rust

compose.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ services:
44
image: envoyproxy/envoy:v1.29.1
55
ports:
66
- ${PORT-8080}:8080
7+
- ${ADMIN_PORT-15000}:15000
78
volumes:
89
- ./test/envoy.yaml:/etc/envoy/envoy.yaml
910
- ./.bin/proxy-wasm-http-header-rename.wasm:/etc/envoy/proxy-wasm-http-header-rename.wasm

src/lib.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use proxy_wasm::traits::{Context, HttpContext, RootContext};
2+
use proxy_wasm::types::{Action, ContextType, LogLevel};
3+
use serde::{Deserialize, Serialize};
4+
5+
#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))]
6+
7+
proxy_wasm::main! {{
8+
proxy_wasm::set_log_level(LogLevel::Trace);
9+
proxy_wasm::set_root_context(|_| -> Box<dyn RootContext> { Box::new(HTTPHeaderRenameRoot{
10+
config: Config { request_headers_to_rename: vec![] }
11+
})
12+
});
13+
}}
14+
15+
struct HTTPHeaderRenameRoot {
16+
config: Config,
17+
}
18+
19+
impl Context for HTTPHeaderRenameRoot {}
20+
21+
impl RootContext for HTTPHeaderRenameRoot {
22+
fn get_type(&self) -> Option<ContextType> {
23+
Some(ContextType::HttpContext)
24+
}
25+
26+
fn on_configure(&mut self, _: usize) -> bool {
27+
if let Some(config_bytes) = self.get_plugin_configuration() {
28+
self.config = serde_json::from_reader(config_bytes.as_slice()).unwrap();
29+
}
30+
true
31+
}
32+
33+
fn create_http_context(&self, _: u32) -> Option<Box<dyn HttpContext>> {
34+
Some(Box::new(HTTPHeadeRename {
35+
config: self.config.clone(),
36+
}))
37+
}
38+
}
39+
40+
struct HTTPHeadeRename {
41+
config: Config,
42+
}
43+
44+
impl Context for HTTPHeadeRename {}
45+
46+
impl HttpContext for HTTPHeadeRename {
47+
fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action {
48+
for header in &self.config.request_headers_to_rename {
49+
let old_header = header.header.key.as_str();
50+
let header_value = self.get_http_request_header(old_header);
51+
if let Some(header_value) = header_value {
52+
let mut value = header_value.to_string();
53+
if let Some(prefix) = &header.header.prefix {
54+
value = format!("{}{}", prefix, header_value);
55+
}
56+
57+
self.set_http_request_header(header.header.value.as_str(), Some(&value));
58+
self.remove_http_request_header(old_header);
59+
}
60+
}
61+
62+
Action::Continue
63+
}
64+
}
65+
66+
#[derive(Serialize, Deserialize, Clone)]
67+
struct Config {
68+
request_headers_to_rename: Vec<HTTPHeaderRenameRule>,
69+
}
70+
71+
#[derive(Serialize, Deserialize, Clone)]
72+
struct HTTPHeaderRenameRule {
73+
header: HTTPHeader,
74+
}
75+
76+
#[derive(Serialize, Deserialize, Clone)]
77+
struct HTTPHeader {
78+
key: String,
79+
value: String,
80+
prefix: Option<String>,
81+
}

test/envoy.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,5 @@ static_resources:
101101
admin:
102102
address:
103103
socket_address:
104-
address: 127.0.0.1
104+
address: 0.0.0.0
105105
port_value: 15000

0 commit comments

Comments
 (0)