Skip to content

Commit f0a8011

Browse files
committed
Update client & server configuration
1 parent c97c1bf commit f0a8011

File tree

3 files changed

+78
-60
lines changed

3 files changed

+78
-60
lines changed

admin/client.go

+11-19
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package admin
1919

2020
import (
2121
"context"
22+
"crypto/tls"
2223
"fmt"
2324
"net/http"
2425
"strings"
@@ -66,9 +67,8 @@ type Options struct {
6667

6768
// Client is a client for admin service.
6869
type Client struct {
69-
conn *http.Client
70-
client v1connect.AdminServiceClient
71-
//dialOptions []grpc.DialOption
70+
conn *http.Client
71+
client v1connect.AdminServiceClient
7272
authInterceptor *AuthInterceptor
7373
logger *zap.Logger
7474
}
@@ -80,16 +80,11 @@ func New(opts ...Option) (*Client, error) {
8080
opt(&options)
8181
}
8282

83-
//tlsConfig := credentials.NewTLS(&tls.Config{MinVersion: tls.VersionTLS12})
84-
//credentialOptions := grpc.WithTransportCredentials(tlsConfig)
85-
//if options.IsInsecure {
86-
// credentialOptions = grpc.WithTransportCredentials(insecure.NewCredentials())
87-
//}
88-
//dialOptions := []grpc.DialOption{credentialOptions}
89-
//
90-
//authInterceptor := NewAuthInterceptor(options.Token)
91-
//dialOptions = append(dialOptions, grpc.WithUnaryInterceptor(authInterceptor.Unary()))
92-
//dialOptions = append(dialOptions, grpc.WithStreamInterceptor(authInterceptor.Stream()))
83+
conn := &http.Client{}
84+
if !options.IsInsecure {
85+
tlsConfig := &tls.Config{MinVersion: tls.VersionTLS12}
86+
conn.Transport = &http.Transport{TLSClientConfig: tlsConfig}
87+
}
9388

9489
logger := options.Logger
9590
if logger == nil {
@@ -101,8 +96,8 @@ func New(opts ...Option) (*Client, error) {
10196
}
10297

10398
return &Client{
104-
logger: logger,
105-
//dialOptions: dialOptions,
99+
conn: conn,
100+
logger: logger,
106101
authInterceptor: NewAuthInterceptor(options.Token),
107102
}, nil
108103
}
@@ -127,17 +122,14 @@ func (c *Client) Dial(rpcAddr string) error {
127122
rpcAddr = "http://" + rpcAddr
128123
}
129124

130-
c.conn = http.DefaultClient
131125
c.client = v1connect.NewAdminServiceClient(c.conn, rpcAddr, connect.WithInterceptors(c.authInterceptor))
132126

133127
return nil
134128
}
135129

136130
// Close closes the connection to the admin service.
137131
func (c *Client) Close() error {
138-
//if err := c.conn.Close(); err != nil {
139-
// return fmt.Errorf("close connection: %w", err)
140-
//}
132+
c.conn.CloseIdleConnections()
141133

142134
return nil
143135
}

client/client.go

+35-29
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ package client
2020

2121
import (
2222
"context"
23+
"crypto/tls"
24+
"crypto/x509"
2325
"errors"
2426
"fmt"
2527
"net/http"
28+
"os"
2629
"strings"
2730

2831
"connectrpc.com/connect"
@@ -80,8 +83,7 @@ type Client struct {
8083
client v1connect.YorkieServiceClient
8184
options Options
8285
clientOptions []connect.ClientOption
83-
// dialOptions []grpc.DialOption
84-
logger *zap.Logger
86+
logger *zap.Logger
8587

8688
id *time.ActorID
8789
key string
@@ -120,29 +122,22 @@ func New(opts ...Option) (*Client, error) {
120122
k = xid.New().String()
121123
}
122124

125+
conn := &http.Client{}
126+
if options.CertFile != "" {
127+
tlsConfig, err := newTLSConfigFromFile(options.CertFile, options.ServerNameOverride)
128+
if err != nil {
129+
return nil, fmt.Errorf("create client tls from file: %w", err)
130+
}
131+
132+
conn.Transport = &http.Transport{TLSClientConfig: tlsConfig}
133+
}
134+
123135
var clientOptions []connect.ClientOption
124136

125137
clientOptions = append(clientOptions, connect.WithInterceptors(NewAuthInterceptor(options.APIKey, options.Token)))
126-
127-
//var dialOptions []grpc.DialOption
128-
//
129-
//transportCreds := grpc.WithTransportCredentials(insecure.NewCredentials())
130-
//if options.CertFile != "" {
131-
// creds, err := credentials.NewClientTLSFromFile(options.CertFile, options.ServerNameOverride)
132-
// if err != nil {
133-
// return nil, fmt.Errorf("create client tls from file: %w", err)
134-
// }
135-
// transportCreds = grpc.WithTransportCredentials(creds)
136-
//}
137-
//dialOptions = append(dialOptions, transportCreds)
138-
//
139-
//authInterceptor := NewAuthInterceptor(options.APIKey, options.Token)
140-
//dialOptions = append(dialOptions, grpc.WithUnaryInterceptor(authInterceptor.Unary()))
141-
//dialOptions = append(dialOptions, grpc.WithStreamInterceptor(authInterceptor.Stream()))
142-
//
143-
//if options.MaxCallRecvMsgSize != 0 {
144-
// dialOptions = append(dialOptions, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(options.MaxCallRecvMsgSize)))
145-
//}
138+
if options.MaxCallRecvMsgSize != 0 {
139+
clientOptions = append(clientOptions, connect.WithReadMaxBytes(options.MaxCallRecvMsgSize))
140+
}
146141

147142
logger := options.Logger
148143
if logger == nil {
@@ -154,10 +149,10 @@ func New(opts ...Option) (*Client, error) {
154149
}
155150

156151
return &Client{
152+
conn: conn,
157153
clientOptions: clientOptions,
158-
//dialOptions: dialOptions,
159-
options: options,
160-
logger: logger,
154+
options: options,
155+
logger: logger,
161156

162157
key: k,
163158
status: deactivated,
@@ -185,7 +180,6 @@ func (c *Client) Dial(rpcAddr string) error {
185180
rpcAddr = "http://" + rpcAddr
186181
}
187182

188-
c.conn = http.DefaultClient
189183
c.client = v1connect.NewYorkieServiceClient(c.conn, rpcAddr, c.clientOptions...)
190184

191185
return nil
@@ -197,9 +191,7 @@ func (c *Client) Close() error {
197191
return err
198192
}
199193

200-
//if err := c.conn.Close(); err != nil {
201-
// return fmt.Errorf("close connection: %w", err)
202-
//}
194+
c.conn.CloseIdleConnections()
203195

204196
return nil
205197
}
@@ -726,6 +718,20 @@ func (c *Client) broadcast(ctx context.Context, doc *document.Document, topic st
726718
return nil
727719
}
728720

721+
// NewClientTLSFromFile
722+
func newTLSConfigFromFile(certFile, serverNameOverride string) (*tls.Config, error) {
723+
b, err := os.ReadFile(certFile)
724+
if err != nil {
725+
return nil, err
726+
}
727+
cp := x509.NewCertPool()
728+
if !cp.AppendCertsFromPEM(b) {
729+
return nil, fmt.Errorf("credentials: failed to append certificates")
730+
}
731+
732+
return &tls.Config{ServerName: serverNameOverride, RootCAs: cp}, nil
733+
}
734+
729735
/**
730736
* withShardKey returns a context with the given shard key in metadata.
731737
*/

server/rpc/server.go

+32-12
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,16 @@ func (s *Server) listenAndServe() error {
118118
newCORS().Handler(s.serverMux),
119119
&http2.Server{},
120120
)
121-
if err := s.httpServer.ListenAndServe(); err != http.ErrServerClosed {
122-
logging.DefaultLogger().Errorf("HTTP server ListenAndServe: %v", err)
121+
if s.conf.CertFile != "" && s.conf.KeyFile != "" {
122+
if err := s.httpServer.ListenAndServeTLS(s.conf.CertFile, s.conf.KeyFile); err != http.ErrServerClosed {
123+
logging.DefaultLogger().Errorf("HTTP server ListenAndServeTLS: %v", err)
124+
}
125+
return
126+
} else {
127+
if err := s.httpServer.ListenAndServe(); err != http.ErrServerClosed {
128+
logging.DefaultLogger().Errorf("HTTP server ListenAndServe: %v", err)
129+
}
130+
return
123131
}
124132
}()
125133
return nil
@@ -128,20 +136,35 @@ func (s *Server) listenAndServe() error {
128136
func newCORS() *cors.Cors {
129137
return cors.New(cors.Options{
130138
AllowedMethods: []string{
131-
http.MethodHead,
139+
http.MethodOptions,
132140
http.MethodGet,
133141
http.MethodPost,
134142
http.MethodPut,
135-
http.MethodPatch,
136143
http.MethodDelete,
137144
},
138145
AllowOriginFunc: func(origin string) bool {
139-
// Allow all origins, which effectively disables CORS.
140146
return true
141147
},
142-
AllowedHeaders: []string{"*"},
148+
AllowedHeaders: []string{
149+
"Grpc-Timeout",
150+
"Content-Type",
151+
"Keep-Alive",
152+
"User-Agent",
153+
"Cache-Control",
154+
"Content-Type",
155+
"Content-Transfer-Encoding",
156+
"Custom-Header-1",
157+
"X-Accept-Content-Transfer-Encoding",
158+
"X-Accept-Response-Streaming",
159+
"X-User-Agent",
160+
"X-Yorkie-User-Agent",
161+
"X-Grpc-Web",
162+
"Authorization",
163+
"X-API-Key",
164+
"X-Shard-Key",
165+
},
166+
MaxAge: int(1728 * time.Second),
143167
ExposedHeaders: []string{
144-
// Content-Type is in the default safelist.
145168
"Accept",
146169
"Accept-Encoding",
147170
"Accept-Post",
@@ -155,11 +178,8 @@ func newCORS() *cors.Cors {
155178
"Grpc-Status-Details-Bin",
156179
"X-Custom-Header",
157180
"Connect-Protocol-Version",
181+
"Custom-Header-1",
158182
},
159-
// Let browsers cache CORS information for longer, which reduces the number
160-
// of preflight requests. Any changes to ExposedHeaders won't take effect
161-
// until the cached data expires. FF caps this value at 24h, and modern
162-
// Chrome caps it at 2h.
163-
MaxAge: int(2 * time.Hour / time.Second),
183+
AllowCredentials: true,
164184
})
165185
}

0 commit comments

Comments
 (0)