Skip to content

Commit

Permalink
feat: create a Go sample for the docs first plugin (#176)
Browse files Browse the repository at this point in the history
Co-authored-by: Matt Leon <[email protected]>
  • Loading branch information
walves-cit and leonm1 authored Feb 11, 2025
1 parent e456e4d commit a914f94
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 1 deletion.
14 changes: 13 additions & 1 deletion plugins/samples/docs_first_plugin/BUILD
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
load("//:plugins.bzl", "proxy_wasm_plugin_cpp", "proxy_wasm_plugin_rust", "proxy_wasm_tests")
load(
"//:plugins.bzl",
"proxy_wasm_plugin_cpp",
"proxy_wasm_plugin_go",
"proxy_wasm_plugin_rust",
"proxy_wasm_tests"
)

licenses(["notice"]) # Apache 2

Expand All @@ -16,10 +22,16 @@ proxy_wasm_plugin_cpp(
srcs = ["plugin.cc"],
)

proxy_wasm_plugin_go(
name = "plugin_go.wasm",
srcs = ["plugin.go"],
)

proxy_wasm_tests(
name = "tests",
plugins = [
":plugin_cpp.wasm",
":plugin_go.wasm",
":plugin_rust.wasm",
],
tests = ":tests.textpb",
Expand Down
88 changes: 88 additions & 0 deletions plugins/samples/docs_first_plugin/plugin.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// [START serviceextensions_plugin_docs_first_plugin]
package main

import (
"fmt"

"github.com/proxy-wasm/proxy-wasm-go-sdk/proxywasm"
"github.com/proxy-wasm/proxy-wasm-go-sdk/proxywasm/types"
)

func main() {}
func init() {
proxywasm.SetVMContext(&vmContext{})
}

type vmContext struct {
types.DefaultVMContext
}

type pluginContext struct {
types.DefaultPluginContext
}

type httpContext struct {
types.DefaultHttpContext
}

func (*vmContext) NewPluginContext(contextID uint32) types.PluginContext {
return &pluginContext{}
}

func (*pluginContext) NewHttpContext(uint32) types.HttpContext {
return &httpContext{}
}

func (ctx *httpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action {
defer func() {
err := recover()
if err != nil {
proxywasm.SendHttpResponse(500, [][2]string{}, []byte(fmt.Sprintf("%v", err)), 0)
}
}()
proxywasm.LogInfof("onRequestHeaders: hello from wasm")

// Route Extension example: host rewrite
err := proxywasm.ReplaceHttpRequestHeader(":host", "service-extensions.com")
if err != nil {
panic(err)
}
err = proxywasm.ReplaceHttpRequestHeader(":path", "/")
if err != nil {
panic(err)
}
return types.ActionContinue
}

func (ctx *httpContext) OnHttpResponseHeaders(numHeaders int, endOfStream bool) types.Action {
defer func() {
err := recover()
if err != nil {
proxywasm.SendHttpResponse(500, [][2]string{}, []byte(fmt.Sprintf("%v", err)), 0)
}
}()
proxywasm.LogInfof("onResponseHeaders: hello from wasm")

// Traffic Extension example: add response header
err := proxywasm.AddHttpResponseHeader("hello", "service-extensions")
if err != nil {
panic(err)
}
return types.ActionContinue
}

// [END serviceextensions_plugin_docs_first_plugin]

0 comments on commit a914f94

Please sign in to comment.