Skip to content

Instantly share code, notes, and snippets.

@devi
Last active August 29, 2015 13:58
Show Gist options
  • Select an option

  • Save devi/10000876 to your computer and use it in GitHub Desktop.

Select an option

Save devi/10000876 to your computer and use it in GitHub Desktop.
// httplistener is a simplified version of camlistore.org/pkg/webserver
package httplistener
import (
"crypto/rand"
"crypto/tls"
"fmt"
"github.com/bradfitz/runsit/listen"
"net"
"time"
)
type Listener struct {
net.Listener
TLSCertFile,
TLSKeyFile string
}
func Listen(addr string) (error, net.Listener) {
return new(Listener).Listen(addr)
}
func ListenTLS(addr, certFile, keyFile string) (error, net.Listener) {
l := &Listener{TLSCertFile: certFile, TLSKeyFile: keyFile}
return l.Listen(addr)
}
func (l *Listener) Listen(addr string) (error, net.Listener) {
if l.Listener != nil {
return nil, l.Listener
}
var err error
l.Listener, err = listen.Listen(addr)
if err != nil {
return fmt.Errorf("Failed to listen on %s: %v", addr, err), nil
}
if l.TLSCertFile != "" && l.TLSKeyFile != "" {
config := &tls.Config{
Rand: rand.Reader,
Time: time.Now,
NextProtos: []string{"http/1.1"},
}
config.Certificates = make([]tls.Certificate, 1)
config.Certificates[0], err = tls.LoadX509KeyPair(l.TLSCertFile, l.TLSKeyFile)
if err != nil {
return fmt.Errorf("Failed to load TLS cert: %v", err), nil
}
l.Listener = tls.NewListener(l.Listener, config)
}
return nil, l.Listener
}
func (l *Listener) ListenURL() string {
scheme := "http"
if l.TLSCertFile != "" && l.TLSKeyFile != "" {
scheme = "https"
}
if l.Listener != nil {
if taddr, ok := l.Listener.Addr().(*net.TCPAddr); ok {
if taddr.IP.IsUnspecified() {
return fmt.Sprintf("%s://localhost:%d", scheme, taddr.Port)
}
return fmt.Sprintf("%s://%s", scheme, l.Listener.Addr())
}
}
return ""
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment