tls listener

This commit is contained in:
changx 2018-10-14 13:56:04 +08:00
parent 515a5dffa5
commit 5383ac4fc0

View File

@ -6,6 +6,7 @@ package http
import (
"bufio"
"bytes"
"crypto/tls"
"encoding/base64"
"errors"
"fmt"
@ -29,9 +30,15 @@ type HTTP struct {
password string
}
type HTTPS struct {
HTTP
tlsConfig *tls.Config
}
func init() {
proxy.RegisterDialer("http", NewHTTPDialer)
proxy.RegisterServer("http", NewHTTPServer)
proxy.RegisterServer("https", NewHTTPSServer)
}
// NewHTTP returns a http proxy.
@ -56,6 +63,35 @@ func NewHTTP(s string, dialer proxy.Dialer) (*HTTP, error) {
return h, nil
}
func NewHTTPS(s string, dialer proxy.Dialer) (*HTTPS, error) {
u, _ := url.Parse(s)
// TODO: cert=&key=
certFile := u.Query().Get("cert")
keyFile := u.Query().Get("key")
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
log.F("unabled load cert: %s, key %s", certFile, keyFile)
return nil, err
}
tlsConfig := tls.Config{
Certificates: []tls.Certificate{cert},
}
http, err := NewHTTP(s, dialer)
if err != nil {
return nil, err
}
https := &HTTPS{
HTTP: *http,
tlsConfig: &tlsConfig,
}
return https, nil
}
// NewHTTPDialer returns a http proxy dialer.
func NewHTTPDialer(s string, dialer proxy.Dialer) (proxy.Dialer, error) {
return NewHTTP(s, dialer)
@ -66,6 +102,32 @@ func NewHTTPServer(s string, dialer proxy.Dialer) (proxy.Server, error) {
return NewHTTP(s, dialer)
}
// NewHTTPSServer returns a https proxy server
func NewHTTPSServer(s string, dialer proxy.Dialer) (proxy.Server, error) {
return NewHTTPS(s, dialer)
}
// ListenAndServe serves tls http proxy
func (s *HTTPS) ListenAndServe() {
l, err := tls.Listen("tcp", s.addr, s.tlsConfig)
if err != nil {
log.F("failed to listen on tls %s: %v", s.addr, err)
return
}
defer l.Close()
for {
c, err := l.Accept()
if err != nil {
log.F("[https] failed to accept: %v", err)
continue
}
go s.HTTP.Serve(c)
}
}
// ListenAndServe .
func (s *HTTP) ListenAndServe() {
l, err := net.Listen("tcp", s.addr)
@ -88,6 +150,7 @@ func (s *HTTP) ListenAndServe() {
}
}
// Serve .
func (s *HTTP) Serve(c net.Conn) {
defer c.Close()