msrc
/
HttpServiceUnix.go
101 строка · 3.7 Кб
1package msrc
2
3import (
4"context"
5"net"
6"net/http"
7"os"
8
9"github.com/pkg/errors"
10"github.com/sirupsen/logrus"
11hh "gitlab.systems-fd.com/packages/golang/helpers/h"
12)
13
14// httpService реализует базовый функционал HTTP сервера для приложений
15// в виде сервиса для библиотеки.
16type httpServiceUnix struct {
17router http.Handler
18server *http.Server
19logger *logrus.Entry
20
21addr string
22}
23
24// HttpServiceUnix реализует фабрику сервиса для библиотеки, реализующего
25// функционал HTTP сервера, через unix socket. На вход передаются обязательные аргументы
26// для HTTP сервера, а так же возможна передача конфигурации запуска
27// сервера.
28//
29// Если конфигурация запуска не передана, то будет использоваться конфигурация
30// `http.Server{}`, при этом в обоих случаях (передано/не передано) будет
31// происходить переопределение полей Addr и Handler в соответствии с
32// переданными обязательными аргументами функции.
33func HttpServiceUnix(
34addr string,
35Router http.Handler,
36GraceStopPeriodSeconds uint8,
37ServerConfig ...*http.Server,
38) ServiceInterface {
39if 0 == len(ServerConfig) {
40ServerConfig = append(ServerConfig, &http.Server{})
41}
42
43if ServerConfig[0] == nil {
44ServerConfig[0] = &http.Server{}
45}
46
47return NewSimpleService(
48&httpServiceUnix{
49router: Router,
50server: ServerConfig[0],
51logger: logrus.WithField("prefix", "msrc/HttpServiceUnix"),
52addr: addr,
53},
54GraceStopPeriodSeconds,
55)
56}
57
58// Run выполняет запуск упрощенной версии сервиса.
59// На вход передается контекст, который передаст `<-ctx.Done()` в случае
60// его остановки. Сам сервис должен обрабатывать его, если он не реализует
61// своего собственного, отдельного алгоритма остановки.
62func (h *httpServiceUnix) Run(ctx context.Context) (err error) {
63defer func() { err = errors.Wrap(err, "[httpServiceUnix:Run]") }()
64
65h.server.Addr = h.addr
66h.server.Handler = h.router
67
68h.logger.WithField("type", "unix").WithField("host", h.server.Addr).Info("Starting HTTP Server")
69
70ln, err := net.Listen("unix", h.addr)
71if err != nil {
72return errors.Wrap(err, "failed starting HTTP Server")
73}
74
75err = h.server.Serve(ln)
76if hh.IsCtxDone(ctx) {
77return nil
78}
79
80if err != nil {
81return err
82}
83
84return nil
85}
86
87// GracefulShutdown выполняет правильную остановку упрощенного
88// сервиса. В данном случае, если сервис необходимо останавливать
89// вызовом отдельного функционала остановки, этот метод предоставляет
90// такую возможность.
91//
92// Метод вызывается в процессе остановки сервера и принимает на вход
93// контекст с deadline, устанавливаемым сверху. За установленное время
94// сервис либо завершает работу, либо отключается принудительно.
95func (h *httpServiceUnix) GracefulShutdown(ctx context.Context) (err error) {
96defer func() { err = errors.Wrap(err, "[httpServiceUnix:GracefulShutdown]") }()
97return errors.Wrap(
98h.server.Shutdown(ctx),
99os.Remove(h.addr).Error(),
100)
101}
102