Skip to content

Commit

Permalink
fix npn client
Browse files Browse the repository at this point in the history
  • Loading branch information
Jxck committed Jan 9, 2014
1 parent 1d23c33 commit 4f0d255
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 56 deletions.
19 changes: 19 additions & 0 deletions keys/cert.pem
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDBjCCAe4CCQCC8qgopCwXKDANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB
VTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0
cyBQdHkgTHRkMB4XDTEzMDEwODEyMzYyM1oXDTIzMDEwNjEyMzYyM1owRTELMAkG
A1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0
IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ALYWwPVTdWu+55Y9WKcZKi+iC/BVoV6uejF/7twOQZRAMAs2rFhCnxmds8d7jcX6
wBHOejKFYqbm9WPORckieOVmHRHYLhzCXHrhYMHSYW5NxwTCxdka+QEzoFJqBSwO
AkBQaF9ETA/GDa22TGN0DqUAtH6AiT3FAf4lSng1gLnMaa6+jYDmHmGHf2epRw+N
U8Kb4g8iNLPP10M3x1DIlVtB2MvXgHFY5/fz4BSD8QweqUGaoIuAcLdJ6qJmbztm
FWCWmr3uNHo2V6KxjHMMpziCa+280im6OgsdsgMuQO949hk+5k+PZ/WR+Ia4NylE
FI6cVXpZwALAVWxC9VO1oocCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAluAKUeNS
brX8+Jr7hOEftd+maTb8ERV4CU2wFSeCqupoSGh4Er37FO+eL1cAzaewpQzx8Uvp
q7oO+utrOKGA42P0bkdX6vqXZ73seorKl4Mv6Lnq1z1uTRTQyAbvJpv6mYrr+oz5
QgTGvPqUWqpv+OPf2R9J00IVLlfIjdKGLt0iZ3QEeS6SDkV/MHT4fEc9fImsg6Rq
xcb8kmcv9GAHo7YzxOw2F85h93epl6zUUlW2QCzUbvEF2S5NQowdkDQz0py6o4tv
S5Dh5XYLDm7gjcRElLNLaTmdhq9IGBEdbXy6a9kzJqZz4+AOn5+WPnA/KhVhWoTE
nJHIzjR3CQEkbA==
-----END CERTIFICATE-----
16 changes: 16 additions & 0 deletions keys/csr.pem
@@ -0,0 +1,16 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUx
ITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBALYWwPVTdWu+55Y9WKcZKi+iC/BVoV6uejF/7twO
QZRAMAs2rFhCnxmds8d7jcX6wBHOejKFYqbm9WPORckieOVmHRHYLhzCXHrhYMHS
YW5NxwTCxdka+QEzoFJqBSwOAkBQaF9ETA/GDa22TGN0DqUAtH6AiT3FAf4lSng1
gLnMaa6+jYDmHmGHf2epRw+NU8Kb4g8iNLPP10M3x1DIlVtB2MvXgHFY5/fz4BSD
8QweqUGaoIuAcLdJ6qJmbztmFWCWmr3uNHo2V6KxjHMMpziCa+280im6OgsdsgMu
QO949hk+5k+PZ/WR+Ia4NylEFI6cVXpZwALAVWxC9VO1oocCAwEAAaAAMA0GCSqG
SIb3DQEBBQUAA4IBAQCuMWhXWTpHDZTYFtkasd/b02D45RyyQTYNvw0qS67rBKnj
52YvHKXvdjXe+TFuEzq6G7QAa7cgcdv12ffzboa8l9E4hY4OTO/lysCB1gMxgpTg
ulDFRTQrIgCjrIm4rIGkFj47VL0ieSRhU4bf9npQydXdaYk0DHOxpLdGrs85LbZf
lt/5Bsls9bSsh+JYcgoOPYxcgKBzhingh/FV93HQ39JHxtcqkrpZqrfNfHSVr9gT
t+YyvUh0ctO5oGEfQj27Ewk3yt1nwgCETP55yCUhWIhJF5ATSFqm0nfeS1QYHMcU
27Hcp+20/4D4MbZ04gi4bi6Z92DawssfKfow/B4u
-----END CERTIFICATE REQUEST-----
27 changes: 27 additions & 0 deletions keys/key.pem
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAthbA9VN1a77nlj1YpxkqL6IL8FWhXq56MX/u3A5BlEAwCzas
WEKfGZ2zx3uNxfrAEc56MoVipub1Y85FySJ45WYdEdguHMJceuFgwdJhbk3HBMLF
2Rr5ATOgUmoFLA4CQFBoX0RMD8YNrbZMY3QOpQC0foCJPcUB/iVKeDWAucxprr6N
gOYeYYd/Z6lHD41TwpviDyI0s8/XQzfHUMiVW0HYy9eAcVjn9/PgFIPxDB6pQZqg
i4Bwt0nqomZvO2YVYJaave40ejZXorGMcwynOIJr7bzSKbo6Cx2yAy5A73j2GT7m
T49n9ZH4hrg3KUQUjpxVelnAAsBVbEL1U7WihwIDAQABAoIBACdvHBDFJ0vTRzI5
TOa7Q3CXZoCA+vaXUK1BqIgNqlQh5oW3LHHc07nndlTARD7ZBBmXHs2sJ2Y/5Grd
9C0QAyCjEa6Yo7vkt8SA5MR0/Fa4D17Pk6tl9QE2ngTbIw2cZw5om4HuN46+9J1n
OnnbW4SOd4hh69btwHW6u7r2007pQXme0AMlAxhgfIEiD6tHjqZDCtK4G0d+GSq6
Ks/IpXckLcrluqJ2gHVB2sbBbjh1m7dHCVzBKynCwaHrWbNla8P6j3SdabP4Umcb
tu3hP3nLigMJmA16KdkayUg05OvUTBAkReLcVZYZQ80LmM+NioB6UvwYy677h4ma
XFihvLkCgYEA3aLOY2rve6DxvTXDJe8D91V//+5B9XBcyLP2cMEXIP+3W9Gto9tz
vTIOcwj8MLKh22KBBMCP7OQlXFalBoG/d5Y9YKr6X2XHBcEw96Nm1HZctUPRPQdd
+C8S5ikwTre9QMfLmLGKzgfIpDRYyijv0ZQZw+8qlNATtVrAMQGu6D0CgYEA0lI9
zXK+4P28+SkkCUIG/Y31wF4KeM8V5s8eUYej8LV67GQIGs9XPCEIJY2cHZpn7qD8
H90lucr90rwAHN2rLUSdq28NVL0+RTYKNBFRRvPNloLlKOR9RvorsFz5U4z48i9x
yZ6gk+WL0ycc2oUFfihmQpHhRUiV46IB7deEXhMCgYEA1rW+3V8eC5VaOuOXXutS
20vwCX7GVUB6ElENICRfBK/V8NSLM98IG7QffV+p+H9E/+RIetMVWveWHgMuMcSG
ORLJ+RkKHlrZ2IBUsMKSfqb/nvbJACdf6GuqEmC6lLe5VsV3PkBY6MlvnWu8zHOm
CFFCOKc8iBef0CPPZmpsCD0CgYAOtS+bOWX9x+C6L9VUTGi+vHmuDSWAU0L91AgT
vX+KaraA53HlphA8pTazoZaEP3L7LgjTlZx4xKhBX2JGon3A+aZpAagV//Hl1ySZ
hYiAhLYgy2CJHolgOEhr2eSZoicakJTNe6lRDmFbz8Vlxp2et+aGyzrMpInO1Fp8
LnEUPwKBgExMk6THLz8CzjJhaKDrNn1fSs6jUxgK12+1cIJxb5JEgRJs4W+yFuLw
exCE5YKPwnZNrbji+bdkk9FwHPLuf20aH5fIB0UlMMVcvLGKyxYl7BG1pShN4k8C
kKXaClwkngJ2eSs/AsNAe9hhbEpFjAHt+3D7Sbg8EvgeCwdjnIxw
-----END RSA PRIVATE KEY-----
117 changes: 82 additions & 35 deletions main/client.go
@@ -1,14 +1,11 @@
package main

import (
"bytes"
"crypto/tls"
"flag"
"fmt"
"github.com/jxck/http2"
"github.com/jxck/logger"
"io/ioutil"
"io"
"log"
"net/http"
"os"
)

Expand All @@ -31,40 +28,90 @@ func init() {
logger.LogLevel(loglevel)
}

func main() {
url := os.Args[1]
// func main() {
// url := os.Args[1]
//
// transport := &http2.Transport{
// Upgrade: upgrade,
// FlowCtl: flowctl,
// }
// client := &http.Client{
// Transport: transport,
// }
//
// var res *http.Response
// var err error
// if post == "" {
// // GET
// res, err = client.Get(url)
// if err != nil {
// log.Println(err)
// }
// } else {
// // POST
// buf := bytes.NewBufferString(post)
// res, err = client.Post(url, "text/plain", buf)
// if err != nil {
// log.Println(err)
// }
// }
//
// defer res.Body.Close()
// if !nullout {
// body, err := ioutil.ReadAll(res.Body)
// if err != nil {
// log.Println(err)
// }
// fmt.Println(string(body))
// }
// }

transport := &http2.Transport{
Upgrade: upgrade,
FlowCtl: flowctl,
}
client := &http.Client{
Transport: transport,
// NPN Dial
func DialNPN(address, certpath, keypath string) *tls.Conn {
// 証明書の設定
cert, err := tls.LoadX509KeyPair(certpath, keypath)
if err != nil {
log.Fatal(err)
}

var res *http.Response
var err error
if post == "" {
// GET
res, err = client.Get(url)
if err != nil {
log.Println(err)
}
} else {
// POST
buf := bytes.NewBufferString(post)
res, err = client.Post(url, "text/plain", buf)
if err != nil {
log.Println(err)
}
// TLS の設定(証明書検証無)
config := tls.Config{
Certificates: []tls.Certificate{cert},
InsecureSkipVerify: true,
NextProtos: []string{"http2.0/draft-09"},
}
conn, err := tls.Dial("tcp", address, &config)
if err != nil {
log.Fatal(err)
}

defer res.Body.Close()
if !nullout {
body, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Println(err)
}
fmt.Println(string(body))
// 接続確認
state := conn.ConnectionState()
log.Println("handshake: ", state.HandshakeComplete)
log.Println("protocol: ", state.NegotiatedProtocol)

return conn
}

func main() {
// セットアップ
address := "jxck.io:8443"
certpath, keypath := "keys/cert.pem", "keys/key.pem"

// Dial NPN
conn := DialNPN(address, certpath, keypath)
defer conn.Close() // err

// データの送受信
message := "Hello\n"

n, err := io.WriteString(conn, message)
if err != nil {
log.Fatalf("write: %s", err)
}
log.Printf("wrote %q (%d bytes)", message, n)
reply := make([]byte, 256)
n, err = conn.Read(reply)
log.Printf("read %q (%d bytes)", string(reply[:n]), n)
log.Print("exiting")
}
40 changes: 19 additions & 21 deletions url.go
Expand Up @@ -3,39 +3,22 @@ package http2
import (
"fmt"
"log"
urllib "net/url"
neturl "net/url"
"strings"
)

func init() {
log.SetFlags(log.Lshortfile)
}

// Exted net/url with adding Port
type URL struct {
*urllib.URL
*neturl.URL
Port string
}

func (url *URL) SplitHostPort() (err error) {
splitted := strings.Split(url.Host, ":")
switch {
case len(splitted) > 2:
return fmt.Errorf("parse error %q in HOST:PORT", url.Host)
case len(splitted) > 1:
url.Host, url.Port = splitted[0], splitted[1]
return
case url.Scheme == "https":
url.Host, url.Port = splitted[0], "443"
return
case url.Scheme == "http":
url.Host, url.Port = splitted[0], "80"
return
}
return
}

func NewURL(rawurl string) (*URL, error) {
u, err := urllib.Parse(rawurl)
u, err := neturl.Parse(rawurl)
if err != nil {
return nil, err
}
Expand All @@ -49,3 +32,18 @@ func NewURL(rawurl string) (*URL, error) {
}
return url, nil
}

func (url *URL) SplitHostPort() (err error) {
splitted := strings.Split(url.Host, ":")
switch {
case len(splitted) > 2:
err = fmt.Errorf("parse error %q in HOST:PORT", url.Host)
case len(splitted) > 1:
url.Host, url.Port = splitted[0], splitted[1]
case url.Scheme == "https":
url.Host, url.Port = splitted[0], "443"
case url.Scheme == "http":
url.Host, url.Port = splitted[0], "80"
}
return
}

0 comments on commit 4f0d255

Please sign in to comment.