Initial commit

This commit is contained in:
2025-01-21 20:36:07 -05:00
commit cdb221b752
3 changed files with 97 additions and 0 deletions

13
go.mod Normal file
View File

@@ -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
)

12
go.sum Normal file
View File

@@ -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=

72
main.go Normal file
View File

@@ -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))
}