Update usage

This commit is contained in:
Jiayu Yi 2018-08-18 00:03:05 +08:00
parent 704cba197d
commit b3064f553c
No known key found for this signature in database
GPG key ID: 84B60878E8AEAD6C
2 changed files with 47 additions and 20 deletions

View file

@ -9,20 +9,33 @@ I wanted HTTPS for `godoc -http :6060`.
## Usage
```
secure -key-file path/to/key/file -cert-file path/to/cert/file -upstream http://localhost:6060 -addr :443
usage: secure [-addr host:port] -cert certfile -key keyfile upstream
-addr string
listen address (default ":443")
-cert string
path to cert file
-key string
path to key file
upstream string
upstream url
```
### Example
```
secure -cert cert.pem -key key.pem http://localhost:6060
```
## Demo
*nix:
```
# generate cert
# generate self-signed certificate and private key
openssl req -newkey rsa:4096 -nodes -keyout key.pem -x509 -days 365 -out cert.pem -subj "/CN=localhost"
# start godoc
godoc -http localhost:6060 &
# secure it
go run main.go -key-file key.pem -cert-file cert.pem -upstream http://localhost:6060 -addr :443
secure -key key.pem -cert cert.pem http://localhost:6060
```
Windows (PowerShell)
@ -30,11 +43,11 @@ Windows (PowerShell)
# somehow obtain key.pem and cert.pem
# start godoc
# cmd: start godoc -http localhost:6060
# Command Prompt: start godoc -http localhost:6060
Start-Process godoc "-http localhost:6060"
# secure it
go run main.go -key-file key.pem -cert-file cert.pem -upstream http://localhost:6060 -addr :443
secure -key key.pem -cert cert.pem http://localhost:6060
```
## Features

44
main.go
View file

@ -1,14 +1,17 @@
// secure is a super simple TLS termination proxy
package main
import (
"context"
"flag"
"fmt"
"log"
"net/http"
"net/http/httputil"
"net/url"
"fmt"
"net/http"
"os/signal"
"os"
"context"
"os/signal"
"path/filepath"
"syscall"
)
@ -20,15 +23,29 @@ var (
)
func init() {
flag.StringVar(&certFile, "cert-file", "", "path to cert file")
flag.StringVar(&keyFile, "key-file", "", "path to key file")
flag.StringVar(&upstream, "upstream", "", "upstream address")
flag.StringVar(&addr, "addr", ":443", "listen address")
flag.StringVar(&certFile, "cert", "", "path to cert file")
flag.StringVar(&keyFile, "key", "", "path to key file")
flag.Usage = func() {
fmt.Fprintf(flag.CommandLine.Output(),
"usage: %s [-addr host:port] -cert certfile -key keyfile upstream\n",
filepath.Base(os.Args[0]))
flag.PrintDefaults()
fmt.Fprintln(flag.CommandLine.Output(), " upstream string\n \tupstream url")
}
}
func _main() error {
flag.Parse()
if flag.NArg() == 1 {
upstream = flag.Arg(0)
} else {
flag.Usage()
os.Exit(2)
}
u, err := url.Parse(upstream)
if err != nil {
return fmt.Errorf("invalid upstream address: %v", err)
@ -40,27 +57,24 @@ func _main() error {
Addr: addr,
}
idleConnsClosed := make(chan struct{})
done := make(chan struct{})
go func() {
sig := make(chan os.Signal, 1)
signal.Notify(sig, os.Interrupt, syscall.SIGTERM)
fmt.Println(<-sig)
// We received an interrupt signal, shut down.
if err := srv.Shutdown(context.Background()); err != nil {
// Error from closing listeners, or context timeout:
fmt.Printf("HTTP server Shutdown: %v", err)
fmt.Printf("Shutdown: %v", err)
}
close(idleConnsClosed)
close(done)
}()
log.Printf("cert-file=%s key-file=%s listen-addr=%s upstream-url=%s", certFile, keyFile, srv.Addr, u.String())
if err := srv.ListenAndServeTLS(certFile, keyFile); err != http.ErrServerClosed {
// Error starting or closing listener:
return fmt.Errorf("ListenAndServeTLS: %v", err)
}
<-idleConnsClosed
<-done
return nil
}