Awesome
go-http-server
Go package to provide interfaces and implementation for HTTP servers.
It is mostly a syntactic wrapper around existing HTTP server implementation with a common interface configured using a URI-based syntax.
Documentation
Example
Error hanldling has been removed for the sake of brevity.
Using a server
package main
import (
"context"
"flag"
"fmt"
"github.com/aaronland/go-http-server"
"net/http"
)
func NewHandler() http.Handler {
fn := func(rsp http.ResponseWriter, req *http.Request) {
msg := fmt.Sprintf("Hello, %s", req.Host)
rsp.Write([]byte(msg))
}
h := http.HandlerFunc(fn)
return h
}
func main() {
server_uri := flag.String("server-uri", "http://localhost:8080", "...")
flag.Parse()
ctx := context.Background()
s, _ := server.NewServer(ctx, *server_uri)
mux := http.NewServeMux()
mux.Handle("/", NewHandler())
log.Printf("Listening on %s", s.Address())
s.ListenAndServe(ctx, mux)
}
Writing a server
package server
import (
"context"
"net/http"
"net/url"
)
func init() {
ctx := context.Background()
RegisterServer(ctx, "http", NewHTTPServer)
}
type HTTPServer struct {
Server
url *url.URL
}
func NewHTTPServer(ctx context.Context, uri string) (Server, error) {
u, _ := url.Parse(uri)
u.Scheme = "http"
server := HTTPServer{
url: u,
}
return &server, nil
}
func (s *HTTPServer) Address() string {
return s.url.String()
}
func (s *HTTPServer) ListenAndServe(ctx context.Context, mux *http.ServeMux) error {
return http.ListenAndServe(s.url.Host, mux)
}
Server schemes
The following schemes/implementations are included by default with this package.
functionurl://
An AWS Lambda Function URL compatible HTTP server.
http://{HOST}
A standard, plain-vanilla, HTTP server.
https://{HOST}?cert={TLS_CERTIFICATE}&key={TLS_KEY}
This is an alias to the tls://
scheme.
lambda://
An AWS Lambda function + API Gateway compatible HTTP server.
mkcert://{HOST}
A thin wrapper to invoke the mkcert tool to generate locally signed TLS certificate and key files. Once created this implementation will invoke the tls://
scheme with the files create by mkcert
. It is hoped this will be a short-lived scheme but it is necessary in the absence of an ACME compatibility with the mkcert
tool.
tls://{HOST}?cert={TLS_CERTIFICATE}&key={TLS_KEY}
A standard, plain-vanilla, HTTPS/TLS server. You must provide TLS certificate and key files.