Skip to content

Instantly share code, notes, and snippets.

@odeke-em
Last active May 19, 2016 23:49
Show Gist options
  • Save odeke-em/be6cfdbec9d16ddf1812cc3d670fe87a to your computer and use it in GitHub Desktop.
Save odeke-em/be6cfdbec9d16ddf1812cc3d670fe87a to your computer and use it in GitHub Desktop.
Investigating Go issue #15425
package main
import (
"crypto/tls"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
)
func main() {
serverURL := "https://localhost:1333"
if envServURL := os.Getenv("SERVER_URL"); envServURL != "" {
serverURL = envServURL
}
certs, err := tls.LoadX509KeyPair("key.crt", "key.key")
if err != nil {
log.Fatal(err)
}
tr := &http.Transport{
TLSClientConfig: &tls.Config{
Certificates: []tls.Certificate{certs},
InsecureSkipVerify: true,
},
}
client := &http.Client{
Transport: tr,
}
// Make a GigaByte of data
sr := strings.NewReader(strings.Repeat("A", 1024*1024*1024))
req, err := http.NewRequest("POST", serverURL, sr)
if err != nil {
log.Fatal(err)
}
log.Printf("client.Do next\n")
res, err := client.Do(req)
log.Printf("client.Do done\n")
if err != nil {
log.Fatal(err)
}
n, err := io.Copy(ioutil.Discard, res.Body)
log.Printf("done Reading the server response's body n=(%v) err=%v\n", n, err)
_ = res.Body.Close()
}
-----BEGIN CERTIFICATE-----
MIIC+TCCAeGgAwIBAgIQTQHa9/kuyl5tMXFsd8Xu9jANBgkqhkiG9w0BAQsFADAS
MRAwDgYDVQQKEwdBY21lIENvMB4XDTE2MDQyNTAzNTY1MVoXDTE3MDQyNTAzNTY1
MVowEjEQMA4GA1UEChMHQWNtZSBDbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBALi+Ju3eXS5Zaa+AGhfk9vy00PdiDsw0EhgCs29cBjlUHVgsOy6Uo9s5
MiklyefEq0ribIet6tL1g5iy0hPK5CMxvIdr8FosUAODA2n8YZ9rtsSvZ6NQgYDE
XLEBU2WUAXfZHsBpScrAIOH3l0vMLlfMKd+NFNAxVlYpA63DCrIIhKvzzqXOQLXf
+w7ybVyyOwZ5k4IjaV+YbiqtaPq3229eySkFoNuUZQ9oi13q0Z2FxRt7vGY7zIor
A/roy/Jbbp9cXlc7ABvuLr1SmTYgnc8zro+4VMSBtUblR/54dt7hInk+fnN8vDk2
xJci8MhjIVqAqjOaCRkjNcoXQL5buwkCAwEAAaNLMEkwDgYDVR0PAQH/BAQDAgWg
MBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwFAYDVR0RBA0wC4IJ
bG9jYWxob3N0MA0GCSqGSIb3DQEBCwUAA4IBAQCqlEWfBvw/bJk2MlFYX9+O+i7p
9vBieYGcLRw6Z1r2qDd27PwneSdzJoxKfSOG4zCceVCPSlB/JJpnlb4uiY7cW1zD
2b9ilK7UodM3wS1Uwd4F2VGt7khDfusAuKzXqKUr90FJ6Hs5ilOSZ03GrkGfzpwX
FEtm5p9fP7SujVl2eFRMQxl3p9R4FgFR0ZFRLUUMSPVsKhB8ts4ExeMpoPRs+at8
/SDEMqAYVXELxyyT1Jpsn526hZfV+ZwTkvDaJWff9IhT71lUVvWQkDGyv08vYo8R
XwVkteSj5vmAr0o+5RDSoY3AiM3kC7XihPde5Y6sEfnII5zbcLeOJ7MgfPqf
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuL4m7d5dLllpr4AaF+T2/LTQ92IOzDQSGAKzb1wGOVQdWCw7
LpSj2zkyKSXJ58SrSuJsh63q0vWDmLLSE8rkIzG8h2vwWixQA4MDafxhn2u2xK9n
o1CBgMRcsQFTZZQBd9kewGlJysAg4feXS8wuV8wp340U0DFWVikDrcMKsgiEq/PO
pc5Atd/7DvJtXLI7BnmTgiNpX5huKq1o+rfbb17JKQWg25RlD2iLXerRnYXFG3u8
ZjvMiisD+ujL8ltun1xeVzsAG+4uvVKZNiCdzzOuj7hUxIG1RuVH/nh23uEieT5+
c3y8OTbElyLwyGMhWoCqM5oJGSM1yhdAvlu7CQIDAQABAoIBAHaugefSMF50Rnbe
fuTWzOzvZEdokUUSNoWCRq/FmKH/rZJVZ/e2ucU960GP6zOfnsNOzpYjXnYED3Rr
fJYGg6UwcIM3DoN/cC+xXOIbpsN5uUKFxLigIXINs9ZqmZ7qBD9wFldZzHQaFYXV
PzcMhsEUgdoBkltlNqfHVXutjxNrWWU6XIr2pI0X48+vDhddm1hABRU83lUKnzvE
VIz662nSoGeRX0TP8/OJy2n64hT2CMUW+55IoV3Yqy+CxWYB9QoQuV+h5CEBm7VS
B9ltrfxF8a0pBn6go8peXzy8S0H0/xLxOXFutH9q28o8CkbqftTGQX2rQoV8bG00
++/W3dkCgYEAysSHNMGcCTQ02i/Xk/vqs+kdN3TDtUemULn1mrlFVc/vrSYml7OU
KtUlJD48XzoXiDA+/lyVWdZSQnpN29uGWwXVGwqvf8HAs7pXxIe8A/TC8MNBAjt0
Of95rt6laDkPvTcx/dAg39xG/6iQ6DG/iNMG6UEOcF++eoK+V6Lzq4MCgYEA6T43
5aJDtQun784AVvMKeC6Sh0n1v3Cz4sLqnLdWuDtsFHhiP0uvkkm+51BJcyfOCAYs
3jU1jElHt9uOozowJ9j5M8FRmsXEYZ0rhB5GyTI00yJqVixwsB/SwwYxKJwcql53
luN+p1cwOiHnHtyJEwfjd5fVD0bU55VQj6ukfYMCgYEAnGh2hwpli2/66OcImr0y
8S57fACUymwHbbPUMVKCmkv4bI7GLDS4sUWTDd74ANi1uDbHELxn9FFvSJpBHru6
atIX7XETqS/SrpCqDQ5KyJ5wFPn4Vnl4ERjxSyOxYbDKZEGETW3TPfsTxTfI92MQ
hMGLTjgBpEsmiif6HW20GnMCgYAHQ4nIHAKRy9giDr9R9eW4knK7xeDiYmcnw7w8
vzTzLd6S0KD2qavBGYzZdVWkQXQYKeER1oRhZxLVtf++M5y2UPqJ0xZwhII2LAfj
6HF56Jdej+7R2jZ0NbmBm1rCkgIOiDyfNVyHZ5634MBq5KFcN12tJsxa2nDc+Xh1
0PmhcwKBgQDKTxFE5i6kht22VkkmH7j6A6jazDxdvvUw6TtsuMXMqmeX2RtluPTA
ID0Q0wDIGTVMrbm13uuBBJCISFEoFeA9rovt4DvS68CcqYwZpgz1E1V/cyIC5f/B
ZzZm8abql1Y1GUMK/MfkHktQ5lBUZAV3Kw5pNdRuGJQD3w+w7qK22Q==
-----END RSA PRIVATE KEY-----
package main
import (
"io"
"io/ioutil"
"log"
"net/http"
"strings"
"time"
)
func handler(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
log.Printf("Received post request whose Headers are %v", r.Header)
if false {
io.Copy(ioutil.Discard, r.Body)
}
err := r.Body.Close()
log.Printf("req.Body.Close() here, err=%v\n", err)
if false {
time.Sleep(700 * time.Millisecond)
}
//http.Error(w, error, code)
w.WriteHeader(413)
b, err := io.Copy(w, strings.NewReader(strings.Repeat("XXXXXX", 4192)))
log.Printf("Wrote %d bytes. Error: %v", b, err)
return
}
w.Header().Set("Content-Type", "text/html")
w.Write([]byte(`
<body>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-beta1/jquery.min.js"></script>
<script>
var reqs = 1;
$('body').text('Sending ' + reqs + ' requests...');
function send(i) {
var el = $('<div class="req">Waiting...</div>').attr('id', i).appendTo('body');
var data = new FormData();
data.append('file', new File([new Blob([new Array(5 * 1024 * 1024).join('0')], {type: 'image/jpeg'})], 'test.jpg'));
var done = false;
var req = new XMLHttpRequest();
req.upload.onprogress = function(e) {
if (!e.lengthComputable || done) return;
el.text((e.loaded / e.total * 100) + '%');
}
req.onreadystatechange = function(e) {
if (done || req.readyState !== 3) return;
done = true;
el.text('Done. Got ' + req.status);
}
req.open('POST', '/', true);
req.send(data);
}
for (var i = 0; i < reqs; i++)
send(i);
</script>
</body>
`))
}
func main() {
http.HandleFunc("/", handler)
if err := http.ListenAndServeTLS(":1333", "key.crt", "key.key", nil); err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment