Skip to content

Commit 4fc396f

Browse files
Setup bare http server
1 parent cda90b7 commit 4fc396f

File tree

5 files changed

+126
-6
lines changed

5 files changed

+126
-6
lines changed

cmd/internal/config/config.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
11
package config
22

3+
import "time"
4+
35
// Load loads a config.
4-
func Load() (Config, error) {
6+
func Load(getenv func(string) string) (Config, error) {
57
// TODO: load environment variables into the config using viper
6-
return Config{}, nil
8+
return Config{
9+
Server: ServerConfig{
10+
AppEnv: "local",
11+
Addr: "8999",
12+
ReadTimeout: 30 * time.Second,
13+
WriteTimeout: 30 * time.Second,
14+
},
15+
JWT: JWTConfig{
16+
Secret: "123",
17+
},
18+
}, nil
719
}

cmd/internal/config/models.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package config
22

3+
import "time"
4+
35
// ServerConfig represents the configuration for the server.
46
type ServerConfig struct {
5-
BindAddr string `mapstructure:"bind_address"`
6-
AppEnv string `mapstructure:"app_env"`
7+
AppEnv string `mapstructure:"app_env"`
8+
Addr string `mapstructure:"address"`
9+
ReadTimeout time.Duration `mapstructure:"read_timeout"`
10+
WriteTimeout time.Duration `mapstructure:"write_timeout"`
711
}
812

913
// JWTConfig represents the configuration of the JWT secret

cmd/internal/logging/logging.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package logging
2+
3+
import (
4+
"io"
5+
"log"
6+
"net/http"
7+
)
8+
9+
func NewLogger(w io.Writer) *log.Logger {
10+
logger := log.Logger{}
11+
logger.SetOutput(w)
12+
logger.SetPrefix("HELLO PREFIX | ")
13+
return &logger
14+
}
15+
16+
func AddLoggingMiddleware(handler http.Handler, logger *log.Logger) http.Handler {
17+
return handler
18+
}

cmd/internal/server/server.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package server
2+
3+
import (
4+
"log"
5+
"net/http"
6+
7+
"github.com/simondanielsson/recite/cmd/internal/config"
8+
"github.com/simondanielsson/recite/cmd/internal/logging"
9+
)
10+
11+
type Server struct {
12+
server http.Server
13+
}
14+
15+
func New(config config.Config, logger *log.Logger) http.Server {
16+
mux := http.NewServeMux()
17+
// Register routes
18+
mux.Handle("/", rootMux(logger))
19+
20+
var handler http.Handler = mux
21+
handler = logging.AddLoggingMiddleware(handler, logger)
22+
23+
// TODO: might not need this wrapping
24+
return http.Server{
25+
Addr: ":" + config.Server.Addr,
26+
ReadTimeout: config.Server.ReadTimeout,
27+
WriteTimeout: config.Server.WriteTimeout,
28+
Handler: handler,
29+
}
30+
}
31+
32+
func rootMux(logger *log.Logger) http.Handler {
33+
return http.HandlerFunc(
34+
func(w http.ResponseWriter, r *http.Request) {
35+
logger.Println("CALLED /")
36+
},
37+
)
38+
}

cmd/recite/main.go

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,55 @@
11
package main
22

3-
import "os"
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"net/http"
8+
"os"
9+
"os/signal"
10+
"syscall"
11+
12+
"github.com/simondanielsson/recite/cmd/internal/config"
13+
"github.com/simondanielsson/recite/cmd/internal/logging"
14+
"github.com/simondanielsson/recite/cmd/internal/server"
15+
)
416

517
func main() {
6-
os.Exit(0)
18+
getenv := os.Getenv
19+
ctx := context.Background()
20+
21+
if err := run(ctx, getenv, os.Stdout, os.Stderr, os.Args); err != nil {
22+
fmt.Fprintf(os.Stderr, "%s\n", err)
23+
os.Exit(0)
24+
}
25+
}
26+
27+
func run(ctx context.Context, getenv func(string) string, outWriter io.Writer, errWriter io.Writer, args []string) error {
28+
config, err := config.Load(getenv)
29+
if err != nil {
30+
return err
31+
}
32+
33+
logger := logging.NewLogger(outWriter)
34+
server := server.New(config, logger)
35+
36+
quit := make(chan os.Signal, 1)
37+
signal.Notify(quit, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
38+
go func() {
39+
// Note: goroutine waits here until interrupt
40+
<-quit
41+
logger.Println("shutting down server...")
42+
43+
if err := server.Shutdown(ctx); err != nil {
44+
logger.Fatalf("failed to shutdown server: %v", err)
45+
}
46+
logger.Println("server stopped gracefully")
47+
}()
48+
49+
logger.Printf("listening on %s\n", server.Addr)
50+
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
51+
fmt.Fprintf(errWriter, "error listening and serving: %s\n", err)
52+
return err
53+
}
54+
return nil
755
}

0 commit comments

Comments
 (0)