Skip to content

Commit 9e7aa68

Browse files
committed
Create httpsify.go
1 parent 16ec0fc commit 9e7aa68

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

httpsify.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"net"
6+
"log"
7+
"flag"
8+
"strings"
9+
"net/http"
10+
"crypto/tls"
11+
"path/filepath"
12+
"github.com/dkumor/acmewrapper"
13+
)
14+
15+
// --------------
16+
17+
var (
18+
port *string = flag.String("port", "443", "the port that will serve the https requests")
19+
cert *string = flag.String("cert", "./cert.pem", "the cert.pem save-path")
20+
key *string = flag.String("key", "./key.pem", "the key.pem save-path")
21+
domains *string = flag.String("domains", "", "a comma separated list of your site(s) domain(s)")
22+
backend *string = flag.String("backend", "", "the backend http server that will serve the terminated requests")
23+
)
24+
25+
// --------------
26+
27+
func init() {
28+
flag.Parse()
29+
if ( *domains == "" ) {
30+
log.Fatal("err> Please enter your site(s) domain(s)")
31+
}
32+
if ( *backend == "" ) {
33+
log.Fatal("err> Please enter the backend http server")
34+
}
35+
}
36+
37+
// --------------
38+
39+
func main() {
40+
acme, err := acmewrapper.New(acmewrapper.Config{
41+
Domains: strings.Split(*domains, ","),
42+
Address: ":" + *port,
43+
TLSCertFile: *cert,
44+
TLSKeyFile: *key,
45+
RegistrationFile: filepath.Dir(*cert) + "/lets-encrypt-user.reg",
46+
PrivateKeyFile: filepath.Dir(*cert) + "/lets-encrypt-user.pem",
47+
TOSCallback: acmewrapper.TOSAgree,
48+
})
49+
if err!=nil {
50+
log.Fatal("err> "+ err.Error())
51+
}
52+
listener, err := tls.Listen("tcp", ":" + *port, acme.TLSConfig())
53+
if err != nil {
54+
log.Fatal("err> " + err.Error())
55+
}
56+
log.Fatal(http.Serve(listener, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
57+
defer r.Body.Close()
58+
req, err := http.NewRequest(r.Method, *backend, r.Body)
59+
if err != nil {
60+
http.Error(w, http.StatusText(504), 504)
61+
return
62+
}
63+
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
64+
for k, v := range r.Header {
65+
for i := 0; i < len(v); i ++ {
66+
if i == 0 {
67+
req.Header.Set(k, v[i])
68+
} else {
69+
req.Header.Add(k, v[i])
70+
}
71+
}
72+
}
73+
req.Header.Set("X-Real-IP", ip)
74+
req.Header.Set("X-Forwarded-For", ip)
75+
req.Header.Set("X-Forwarded-Proto", "https")
76+
req.Header.Set("X-Forwarded-Host", r.Host)
77+
req.Header.Set("X-Forwarded-Port", *port)
78+
res, err := http.DefaultClient.Do(req)
79+
if err != nil {
80+
http.Error(w, http.StatusText(504), 504)
81+
return
82+
}
83+
defer res.Body.Close()
84+
for k, v := range res.Header {
85+
for i := 0; i < len(v); i ++ {
86+
if i == 0 {
87+
w.Header().Set(k, v[i])
88+
} else {
89+
w.Header().Add(k, v[i])
90+
}
91+
}
92+
}
93+
w.WriteHeader(res.StatusCode)
94+
io.Copy(w, res.Body)
95+
})))
96+
}

0 commit comments

Comments
 (0)