summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2025-01-21 20:36:07 -0500
committerRobby Zambito <contact@robbyzambito.me>2025-02-01 11:03:44 -0500
commitcdb221b7523cc3a0fbebc28b40176642027c7f83 (patch)
treeb4b48037e2cbb0f920eca4c2aaef290b346835ad
Initial commit
-rw-r--r--go.mod13
-rw-r--r--go.sum12
-rw-r--r--main.go72
3 files changed, 97 insertions, 0 deletions
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..f64546f
--- /dev/null
+++ b/go.mod
@@ -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
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..10a7c79
--- /dev/null
+++ b/go.sum
@@ -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=
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..0e4a288
--- /dev/null
+++ b/main.go
@@ -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))
+}