Skip to content

Commit 661e733

Browse files
authored
Merge pull request #456 from tonkeeper/unix_sockets
Support connections via unix sockets
2 parents b4700f3 + d98178f commit 661e733

File tree

3 files changed

+43
-12
lines changed

3 files changed

+43
-12
lines changed

cmd/api/main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func main() {
9090
storageBlockCh,
9191
})
9292

93-
server, err := api.NewServer(log, h, fmt.Sprintf(":%d", cfg.API.Port),
93+
server, err := api.NewServer(log, h,
9494
api.WithTransactionSource(source),
9595
api.WithBlockHeadersSource(source),
9696
api.WithTraceSource(tracer),
@@ -110,5 +110,5 @@ func main() {
110110
}()
111111

112112
log.Warn("start server", zap.Int("port", cfg.API.Port))
113-
server.Run()
113+
server.Run(fmt.Sprintf(":%d", cfg.API.Port), cfg.API.UnixSockets)
114114
}

pkg/api/server.go

+39-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ package api
22

33
import (
44
"errors"
5+
"fmt"
6+
"net"
57
"net/http"
8+
"os"
69

710
"github.com/tonkeeper/tongo/config"
811
"go.uber.org/zap"
@@ -93,7 +96,7 @@ func WithMemPool(memPool sources.MemPoolSource) ServerOption {
9396
}
9497
}
9598

96-
func NewServer(log *zap.Logger, handler *Handler, address string, opts ...ServerOption) (*Server, error) {
99+
func NewServer(log *zap.Logger, handler *Handler, opts ...ServerOption) (*Server, error) {
97100
options := &ServerOptions{}
98101
for _, o := range opts {
99102
o(options)
@@ -137,7 +140,6 @@ func NewServer(log *zap.Logger, handler *Handler, address string, opts ...Server
137140
mux: mux,
138141
asyncMiddlewares: asyncMiddlewares,
139142
httpServer: &http.Server{
140-
Addr: address,
141143
Handler: mux,
142144
},
143145
}
@@ -161,11 +163,39 @@ func (s *Server) RegisterAsyncHandler(pattern string, handler AsyncHandler, conn
161163
s.mux.Handle(pattern, wrapAsync(connectionType, allowTokenInQuery, chainMiddlewares(handler, s.asyncMiddlewares...)))
162164
}
163165

164-
func (s *Server) Run() {
165-
err := s.httpServer.ListenAndServe()
166-
if errors.Is(err, http.ErrServerClosed) {
167-
s.logger.Warn("opentonapi quit")
168-
return
169-
}
170-
s.logger.Fatal("ListedAndServe() failed", zap.Error(err))
166+
func (s *Server) Run(address string, unixSockets []string) {
167+
go func() {
168+
tcpListener, err := net.Listen("tcp", address)
169+
if err != nil {
170+
s.logger.Fatal("Failed to listen on tcp address", zap.Error(err))
171+
}
172+
err = s.httpServer.Serve(tcpListener)
173+
174+
if errors.Is(err, http.ErrServerClosed) {
175+
s.logger.Warn("opentonapi quit")
176+
return
177+
}
178+
s.logger.Fatal("ListenAndServe() failed", zap.Error(err))
179+
}()
180+
181+
for _, socketPath := range unixSockets {
182+
go func(socketPath string) {
183+
if _, err := os.Stat(socketPath); err == nil {
184+
os.Remove(socketPath)
185+
}
186+
187+
unixListener, err := net.Listen("unix", socketPath)
188+
if err != nil {
189+
s.logger.Fatal(fmt.Sprintf("Failed to listen on Unix socket %v", socketPath), zap.Error(err))
190+
}
191+
192+
err = s.httpServer.Serve(unixListener)
193+
if errors.Is(err, http.ErrServerClosed) {
194+
s.logger.Warn("opentonapi quit")
195+
return
196+
}
197+
s.logger.Fatal(fmt.Sprintf("ListenAndServe() failed for %v", socketPath), zap.Error(err))
198+
}(socketPath)
199+
}
200+
<-make(chan struct{})
171201
}

pkg/config/config.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import (
1313

1414
type Config struct {
1515
API struct {
16-
Port int `env:"PORT" envDefault:"8081"`
16+
Port int `env:"PORT" envDefault:"8081"`
17+
UnixSockets []string `env:"UNIX_SOCKETS" envSeparator:","`
1718
}
1819
App struct {
1920
LogLevel string `env:"LOG_LEVEL" envDefault:"INFO"`

0 commit comments

Comments
 (0)