Skip to content

Instantly share code, notes, and snippets.

@agl
Created December 7, 2016 21:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save agl/2da9e61528f0d373894d8c919abfb518 to your computer and use it in GitHub Desktop.
Save agl/2da9e61528f0d373894d8c919abfb518 to your computer and use it in GitHub Desktop.
package main
import (
"crypto/tls"
"fmt"
"net"
"os"
"bytes"
"io"
)
func main() {
cert, err := tls.X509KeyPair([]byte(certPEM), []byte(keyPEM))
if err != nil {
panic(err)
}
config := tls.Config{
Certificates: []tls.Certificate{cert},
}
listener, err := tls.Listen("tcp", ":8080", &config)
if err != nil {
panic(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("%s\n", err)
continue
}
go worker(conn)
}
}
func worker(conn net.Conn) {
defer conn.Close()
var req []byte
buf := make([]byte, 64)
requestTerminator := []byte{'\r', '\n', '\r', '\n'}
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("%s\n", err)
return
}
req = append(req, buf[:n]...)
if bytes.HasSuffix(req, requestTerminator) {
break
}
}
os.Stdout.Write(req)
fmt.Printf("connecting...")
outConn, err := net.Dial("tcp", "www.google.com:443")
if err != nil {
fmt.Printf("%s\n", err)
return
}
fmt.Printf("ok\n")
if _, err := conn.Write([]byte("HTTP/1.1 200 Ok\r\nFoo: bar\r\n\r\n")); err != nil {
panic(err)
}
go io.Copy(conn, outConn)
io.Copy(outConn, conn)
}
var certPEM = `
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAINN8XM4BC00MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTYxMjA3MTkwMjUyWhcNMTcxMjA3MTkwMjUyWjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAnUMmv696aJVYk0FU39lSmUx2fwttCj9TYqdFl8lwm20rWhy/qZ9gqIFX
xrTlbGGZHqVBJHI96LD0anVtRM/0ADNmjchAU7JtQSnZ7mXisHfxwzjpZPV92x6d
UdIUwvTLAkzP14PemEW9h6a0Q/T5LyshkIOeXSZAaJqq+PGU6AJPNb4JEo4fm5di
3dkkp43IxKkQNTxJPwpreHonsDq+T5rPFwRkl34NERDi0C9pKvVAMOcYd6rWRnB8
/U9v23g0vIbYIVL2RtVcVTeHGUS2nncsHlMED/cA5C4eQudsa/2bvGtNKsadsiUg
lxzLxWQYd7RuzIMm2y6p1hVwsGxgAwIDAQABo1AwTjAdBgNVHQ4EFgQUDctFxD/b
CTCHmHBtPkaQHY93kO4wHwYDVR0jBBgwFoAUDctFxD/bCTCHmHBtPkaQHY93kO4w
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAS/3B3Sk/2B3qIN2Wdjdp
eKH1RvCWr4dh0L79MyOwvJEWnZLULz6IGWAeox7Ai8LOlBdMge2+EIEXUq0nHVSk
hh07B/Dnt7GaP/oEZvYT8Rk33QJbLfQaB1lpXl7UTf1sTBxywTzXeLWanA1eGIIG
piJuMXZvXoe9uBTDaYSuTc8W/4N+TtOmPEBPCmWCg3LtEgaU8KB37Rz8qrXtj8uY
wB+9yFEKEO7GnNU+5/qEU86B1NW/yl1Y0IdxDQyxTScFStEBFWJVyLuKuzqJmnKf
t5ZqxnR8cJfz9LgN5QyPXrLAwXsOwM+uYxrprabhsoRXvvtrPYg9XNdwwSfIUX32
2Q==
-----END CERTIFICATE-----
`
var keyPEM = `
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCdQya/r3polViT
QVTf2VKZTHZ/C20KP1Nip0WXyXCbbStaHL+pn2CogVfGtOVsYZkepUEkcj3osPRq
dW1Ez/QAM2aNyEBTsm1BKdnuZeKwd/HDOOlk9X3bHp1R0hTC9MsCTM/Xg96YRb2H
prRD9PkvKyGQg55dJkBomqr48ZToAk81vgkSjh+bl2Ld2SSnjcjEqRA1PEk/Cmt4
eiewOr5Pms8XBGSXfg0REOLQL2kq9UAw5xh3qtZGcHz9T2/beDS8htghUvZG1VxV
N4cZRLaedyweUwQP9wDkLh5C52xr/Zu8a00qxp2yJSCXHMvFZBh3tG7MgybbLqnW
FXCwbGADAgMBAAECggEAaKzXz+MXUSGHMYzc15qp1gwFG48ZZya7dADu25djcrD5
mCNml5rUFZTyPfsOclOMPc+1SnMYLhgKuAmtT44zVSbhbiIKXyt2eVdIDdyXROqx
a0YoY+Dbgswf3uQ8mX+i2McT2NmXgjd5bh9SAaG/ctv8nVpeQJZDbNz2THlQqhRE
R+yK4sNVNbOsIZGDR+N9ChLCxTlJ9e94q345D2SI6pGBG7PVDL3JQ9PhBNHsCWlX
yktr5mVluau6VpA9oViWaWA5XANb6XuuEjz3leIF3wSu1M9NZvDzI8m6TFO38oIt
BBdY75le60M8LXAtL1d6fjbMKf89/Fe4qImwbUtQsQKBgQDMoo4lQ9iAjooB+q81
sdl+qaowildh/UBwhQAVPbds4Y5wV1P7j3pcYxTj91haMbCpt1A3nzaRFoup5u1z
/oEYbbLFoWTKQA6ESjzaMEoHDBOzbIck/Eco8kyoHMZv4geD0BQvygfDWBqs3DHS
Ss6OKRGWXCb9R1/CAUavYPz9HwKBgQDEvIVI83IS6h3/00AQlyIV46TnM/L1IolC
AJ4FFLYvbrcB44RqM5/7jbBJHaxXgHLoTw7y3Pok3knPtJXEaEXVWFTxPzIMcs7r
9h25Rq35E2aMKGNiuEmKqa4cW+uapjxI4KLcUCW29dnpChtN/U8kOwcFLSsE1KVu
pKjcnfJcnQKBgE7w/qj9jU26rx6oWGL8Ywzr4s2q8J7KlctSY3/OOS51rP9FkQ5g
gTGWv35Z8umIdcBjCT0L3H8IFYTLoxq2OZL07pwy8LDdGTyLbwI00rn5PLhgy5nH
AKSZJF1ODHco2QFOihsNcwU2vcOlhkq7tQc+bJx2nEvk9tneqCgL4Ey9AoGAWVAc
Uhny15NhOxp0IxP5bWaDHlL/ITokhcox8qyMaMwiWMEpA+2b219fgFHwQ2kUwVHi
v26CQOqJJ7obo6aSzV/kcAD4f54/Qe/hXpMvt7uO+mH7fH2dJU4StN0mAHcnNw6D
4PChroW9/4WPD8DHhPMnJLp0pSTEVY56+mzZ8iECgYAqaxjIUaiuFgTv06MsKOqG
nOWeCz7gtE7EPm/gC0vy3jG3AF/lVBHNKwXwXV60IDGt3ckqr4FTpFiOxNN9RYxk
fStB7F7ceGdjCD14okw0Dv0yysPmnT5yugcyJ5LEKUQR09XPopmjpc49Z/BRT/Mn
nka39STMsu5nNV290NA+YQ==
-----END PRIVATE KEY-----
`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment