diff options
author | Robby Zambito <contact@robbyzambito.me> | 2025-01-21 20:36:07 -0500 |
---|---|---|
committer | Robby Zambito <contact@robbyzambito.me> | 2025-02-01 11:03:44 -0500 |
commit | cdb221b7523cc3a0fbebc28b40176642027c7f83 (patch) | |
tree | b4b48037e2cbb0f920eca4c2aaef290b346835ad |
Initial commit
-rw-r--r-- | go.mod | 13 | ||||
-rw-r--r-- | go.sum | 12 | ||||
-rw-r--r-- | main.go | 72 |
3 files changed, 97 insertions, 0 deletions
@@ -0,0 +1,13 @@ +module robbyzambito.me/http-nats-proxy/v2 + +go 1.23.2 + +require github.com/nats-io/nats.go v1.38.0 + +require ( + github.com/klauspost/compress v1.17.9 // indirect + github.com/nats-io/nkeys v0.4.9 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect +) @@ -0,0 +1,12 @@ +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/nats-io/nats.go v1.38.0 h1:A7P+g7Wjp4/NWqDOOP/K6hfhr54DvdDQUznt5JFg9XA= +github.com/nats-io/nats.go v1.38.0/go.mod h1:IGUM++TwokGnXPs82/wCuiHS02/aKrdYUQkU8If6yjw= +github.com/nats-io/nkeys v0.4.9 h1:qe9Faq2Gxwi6RZnZMXfmGMZkg3afLLOtrU+gDZJ35b0= +github.com/nats-io/nkeys v0.4.9/go.mod h1:jcMqs+FLG+W5YO36OX6wFIFcmpdAns+w1Wm6D3I/evE= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -0,0 +1,72 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "strings" + "time" + + "github.com/nats-io/nats.go" +) + +func main() { + // Connect to NATS server + nc, err := nats.Connect(nats.DefaultURL) + if err != nil { + log.Fatal(err) + } + defer nc.Close() + + // HTTP handler function + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + // Read the request body + body, err := ioutil.ReadAll(r.Body) + if err != nil { + http.Error(w, "Error reading request body", http.StatusInternalServerError) + return + } + defer r.Body.Close() + + // Drop the leading slash if there is one, and replace slashes with dots. + subject := strings.ReplaceAll(strings.TrimPrefix(r.URL.Path, "/"), "/", ".") + + // Create a NATS message with the request body and headers + msg := nats.Msg{ + Subject: fmt.Sprintf("http.%s", subject), + Data: body, + Header: nats.Header{}, + } + log.Println("subject:", msg.Subject) + + // Copy HTTP headers to NATS message headers + for key, values := range r.Header { + for _, value := range values { + msg.Header.Add(key, value) + } + } + + // Send request to NATS and wait for reply + reply, err := nc.RequestMsg(&msg, 30*time.Second) + if err != nil { + http.Error(w, "Error processing request", http.StatusInternalServerError) + log.Println("Error processing the request", err) + return + } + + // Copy NATS reply headers to HTTP response + for key, values := range reply.Header { + for _, value := range values { + w.Header().Add(key, value) + } + } + + // Write NATS reply body to HTTP response + w.Write(reply.Data) + }) + + // Start HTTP server + fmt.Println("Server is running on http://localhost:8080") + log.Fatal(http.ListenAndServe(":8080", nil)) +} |