@@ -8,12 +8,15 @@ import (
8
8
"bufio"
9
9
"bytes"
10
10
"context"
11
+ "crypto/rand"
12
+ "crypto/tls"
11
13
"encoding/base64"
12
14
"fmt"
13
15
"io"
14
16
"io/ioutil"
15
17
"mime/multipart"
16
18
. "net/http"
19
+ "net/http/httptest"
17
20
"net/url"
18
21
"os"
19
22
"reflect"
@@ -1046,3 +1049,94 @@ func BenchmarkReadRequestWrk(b *testing.B) {
1046
1049
Host: localhost:8080
1047
1050
` )
1048
1051
}
1052
+
1053
+ const benchmarkRequestWriteFileSize = 10240000
1054
+
1055
+ func benchmarkRequestFileAndServer (useTLS bool ) (* os.File , func (), * httptest.Server , func (), error ) {
1056
+ tf , err := ioutil .TempFile ("" , "go-bench-http" )
1057
+ if err != nil {
1058
+ return nil , nil , nil , nil , err
1059
+ }
1060
+
1061
+ if _ , err = io .Copy (tf , io .LimitReader (rand .Reader , benchmarkRequestWriteFileSize )); err != nil {
1062
+ return nil , nil , nil , nil , err
1063
+ }
1064
+
1065
+ tf .Close ()
1066
+ tf , err = os .Open (tf .Name ())
1067
+ if err != nil {
1068
+ return nil , nil , nil , nil , err
1069
+ }
1070
+
1071
+ var ts * httptest.Server
1072
+ hf := HandlerFunc (func (w ResponseWriter , r * Request ) {
1073
+ n , err := io .Copy (ioutil .Discard , r .Body )
1074
+ if err != nil {
1075
+ panic (err )
1076
+ }
1077
+
1078
+ if n != benchmarkRequestWriteFileSize {
1079
+ panic (fmt .Errorf ("expected %d bytes read, got %d" , benchmarkRequestWriteFileSize , n ))
1080
+ }
1081
+
1082
+ r .Body .Close ()
1083
+ w .WriteHeader (200 )
1084
+ })
1085
+
1086
+ if useTLS {
1087
+ ts = httptest .NewTLSServer (hf )
1088
+ } else {
1089
+ ts = httptest .NewServer (hf )
1090
+ }
1091
+
1092
+ return tf , func () { tf .Close (); os .Remove (tf .Name ()) }, ts , func () { ts .Close () }, nil
1093
+ }
1094
+
1095
+ func runBenchmarkRequestWriteFile (b * testing.B , useTLS bool ) {
1096
+ tf , tfClose , ts , tsClose , err := benchmarkRequestFileAndServer (useTLS )
1097
+ if err != nil {
1098
+ b .Fatal (err )
1099
+ }
1100
+
1101
+ defer tsClose ()
1102
+ defer tfClose ()
1103
+
1104
+ tr := new (Transport )
1105
+ if useTLS {
1106
+ tr .TLSClientConfig = & tls.Config {
1107
+ InsecureSkipVerify : true ,
1108
+ }
1109
+ }
1110
+
1111
+ c := & Client {Transport : tr }
1112
+ r := ioutil .NopCloser (tf )
1113
+
1114
+ b .ResetTimer ()
1115
+ for i := 0 ; i < b .N ; i ++ {
1116
+ req , err := NewRequest ("PUT" , ts .URL , r )
1117
+ if err != nil {
1118
+ b .Fatal (err )
1119
+ }
1120
+
1121
+ req .ContentLength = benchmarkRequestWriteFileSize
1122
+ req .Header .Add ("Content-Type" , "application/octet-stream" )
1123
+ _ , err = c .Do (req )
1124
+ if err != nil {
1125
+ b .Fatal (err )
1126
+ }
1127
+
1128
+ b .SetBytes (benchmarkRequestWriteFileSize )
1129
+
1130
+ if _ , err := tf .Seek (0 , 0 ); err != nil {
1131
+ b .Fatal (err )
1132
+ }
1133
+ }
1134
+ }
1135
+
1136
+ func BenchmarkRequestWriteFileNoTLS (b * testing.B ) {
1137
+ runBenchmarkRequestWriteFile (b , false )
1138
+ }
1139
+
1140
+ func BenchmarkRequestWriteFileWithTLS (b * testing.B ) {
1141
+ runBenchmarkRequestWriteFile (b , true )
1142
+ }
0 commit comments