@@ -944,8 +944,35 @@ func initLog(o Options) error {
944
944
return nil
945
945
}
946
946
947
- func (o * Options ) isHTTPS () bool {
948
- return (o .ProxyTLS != nil ) || (o .CertPathTLS != "" && o .KeyPathTLS != "" )
947
+ func (o * Options ) tlsConfig () (* tls.Config , error ) {
948
+ if o .ProxyTLS != nil {
949
+ return o .ProxyTLS , nil
950
+ }
951
+
952
+ if o .CertPathTLS == "" && o .KeyPathTLS == "" {
953
+ return nil , nil
954
+ }
955
+
956
+ crts := strings .Split (o .CertPathTLS , "," )
957
+ keys := strings .Split (o .KeyPathTLS , "," )
958
+
959
+ if len (crts ) != len (keys ) {
960
+ return nil , fmt .Errorf ("number of certificates does not match number of keys" )
961
+ }
962
+
963
+ config := & tls.Config {
964
+ MinVersion : o .TLSMinVersion ,
965
+ }
966
+
967
+ for i := 0 ; i < len (crts ); i ++ {
968
+ crt , key := crts [i ], keys [i ]
969
+ keypair , err := tls .LoadX509KeyPair (crt , key )
970
+ if err != nil {
971
+ return nil , fmt .Errorf ("failed to load X509 keypair from %s and %s: %w" , crt , key , err )
972
+ }
973
+ config .Certificates = append (config .Certificates , keypair )
974
+ }
975
+ return config , nil
949
976
}
950
977
951
978
func listen (o * Options , mtr metrics.Metrics ) (net.Listener , error ) {
@@ -1005,11 +1032,14 @@ func listenAndServeQuit(
1005
1032
idleConnsCH chan struct {},
1006
1033
mtr metrics.Metrics ,
1007
1034
) error {
1008
- // create the access log handler
1009
- log .Infof ("proxy listener on %v" , o .Address )
1035
+ tlsConfig , err := o .tlsConfig ()
1036
+ if err != nil {
1037
+ return err
1038
+ }
1010
1039
1011
1040
srv := & http.Server {
1012
1041
Addr : o .Address ,
1042
+ TLSConfig : tlsConfig ,
1013
1043
Handler : proxy ,
1014
1044
ReadTimeout : o .ReadTimeoutServer ,
1015
1045
ReadHeaderTimeout : o .ReadHeaderTimeoutServer ,
@@ -1025,35 +1055,6 @@ func listenAndServeQuit(
1025
1055
}
1026
1056
}
1027
1057
1028
- if o .isHTTPS () {
1029
- if o .ProxyTLS != nil {
1030
- srv .TLSConfig = o .ProxyTLS
1031
- o .CertPathTLS = ""
1032
- o .KeyPathTLS = ""
1033
- } else if strings .Index (o .CertPathTLS , "," ) > 0 && strings .Index (o .KeyPathTLS , "," ) > 0 {
1034
- tlsCfg := & tls.Config {
1035
- MinVersion : o .TLSMinVersion ,
1036
- }
1037
- crts := strings .Split (o .CertPathTLS , "," )
1038
- keys := strings .Split (o .KeyPathTLS , "," )
1039
- if len (crts ) != len (keys ) {
1040
- log .Fatalf ("number of certs does not match number of keys" )
1041
- }
1042
- for i , crt := range crts {
1043
- kp , err := tls .LoadX509KeyPair (crt , keys [i ])
1044
- if err != nil {
1045
- log .Fatalf ("Failed to load X509 keypair from %s/%s: %v" , crt , keys [i ], err )
1046
- }
1047
- tlsCfg .Certificates = append (tlsCfg .Certificates , kp )
1048
- }
1049
- o .CertPathTLS = ""
1050
- o .KeyPathTLS = ""
1051
- srv .TLSConfig = tlsCfg
1052
- }
1053
- return srv .ListenAndServeTLS (o .CertPathTLS , o .KeyPathTLS )
1054
- }
1055
- log .Infof ("TLS settings not found, defaulting to HTTP" )
1056
-
1057
1058
// making idleConnsCH and sigs optional parameters is required to be able to tear down a server
1058
1059
// from the tests
1059
1060
if idleConnsCH == nil {
@@ -1079,14 +1080,25 @@ func listenAndServeQuit(
1079
1080
close (idleConnsCH )
1080
1081
}()
1081
1082
1082
- l , err := listen (o , mtr )
1083
- if err != nil {
1084
- return err
1085
- }
1083
+ log .Infof ("proxy listener on %v" , o .Address )
1086
1084
1087
- if err := srv .Serve (l ); err != nil && err != http .ErrServerClosed {
1088
- log .Errorf ("Failed to start to ListenAndServe: %v" , err )
1089
- return err
1085
+ if srv .TLSConfig != nil {
1086
+ if err := srv .ListenAndServeTLS ("" , "" ); err != http .ErrServerClosed {
1087
+ log .Errorf ("ListenAndServeTLS failed: %v" , err )
1088
+ return err
1089
+ }
1090
+ } else {
1091
+ log .Infof ("TLS settings not found, defaulting to HTTP" )
1092
+
1093
+ l , err := listen (o , mtr )
1094
+ if err != nil {
1095
+ return err
1096
+ }
1097
+
1098
+ if err := srv .Serve (l ); err != http .ErrServerClosed {
1099
+ log .Errorf ("Serve failed: %v" , err )
1100
+ return err
1101
+ }
1090
1102
}
1091
1103
1092
1104
<- idleConnsCH
0 commit comments