// http_request — 發送任意 HTTP 請求,回傳 status + body // 透過 host function 發出 HTTP,.wasm 本身不含網路 syscall // //go:build tinygo package main import ( "encoding/json" "io" "os" "unsafe" ) // host function 宣告(由 WASI shim 注入) // //go:wasmimport u6u http_request func hostHttpRequest( urlPtr uintptr, urlLen uint32, methodPtr uintptr, methodLen uint32, headersPtr uintptr, headersLen uint32, bodyPtr uintptr, bodyLen uint32, outPtr uintptr, outLenPtr uintptr, ) uint32 type Input struct { URL string `json:"url"` Method string `json:"method"` Headers map[string]string `json:"headers"` Body json.RawMessage `json:"body"` } func main() { raw, err := io.ReadAll(os.Stdin) if err != nil { writeError("failed to read stdin: " + err.Error()) return } var input Input if err := json.Unmarshal(raw, &input); err != nil { writeError("invalid input JSON: " + err.Error()) return } if input.URL == "" { writeError("url 必填") return } method := input.Method if method == "" { method = "GET" } // 序列化 headers headersJSON := "{}" if len(input.Headers) > 0 { b, _ := json.Marshal(input.Headers) headersJSON = string(b) } // body bodyStr := "" if len(input.Body) > 0 { bodyStr = string(input.Body) } // 呼叫 host function urlBytes := []byte(input.URL) methodBytes := []byte(method) headersBytes := []byte(headersJSON) bodyBytes := []byte(bodyStr) outBuf := make([]byte, 65536) // 64KB output buffer var outLen uint32 result := hostHttpRequest( uintptr(unsafe.Pointer(&urlBytes[0])), uint32(len(urlBytes)), uintptr(unsafe.Pointer(&methodBytes[0])), uint32(len(methodBytes)), uintptr(unsafe.Pointer(&headersBytes[0])), uint32(len(headersBytes)), uintptr(unsafe.Pointer(&bodyBytes[0])), uint32(len(bodyBytes)), uintptr(unsafe.Pointer(&outBuf[0])), uintptr(unsafe.Pointer(&outLen)), ) if result != 0 { writeError("HTTP request failed") return } responseStr := string(outBuf[:outLen]) out, _ := json.Marshal(map[string]interface{}{ "success": true, "data": map[string]interface{}{"body": responseStr}, }) os.Stdout.Write(out) } func writeError(msg string) { out, _ := json.Marshal(map[string]interface{}{"success": false, "error": msg}) os.Stdout.Write(out) }