Skip to content

Instantly share code, notes, and snippets.

@tehmoon
Last active December 31, 2017 15:24
Show Gist options
  • Save tehmoon/d0b682c19efb0bdc61b98a635922dbba to your computer and use it in GitHub Desktop.
Save tehmoon/d0b682c19efb0bdc61b98a635922dbba to your computer and use it in GitHub Desktop.
Create and start http server in go
package main
import (
"github.com/pkg/errors"
"github.com/gorilla/mux"
"time"
"net/http"
"net"
"log"
"fmt"
"os"
)
func NewRouter() (http.Handler) {
r := mux.NewRouter()
r.Path("/").
Methods("GET").
HandlerFunc(HTTPRoot())
return r
}
func StartHTTPServer(addr *net.TCPAddr) (*http.Server, error) {
server := &http.Server{
WriteTimeout: 5 * time.Second,
ReadTimeout: 5 * time.Second,
Handler: NewRouter(),
}
l, err := net.ListenTCP(addr.Network(), addr)
if err != nil {
return nil, errors.Wrapf(err, "Error listening on address: %s", addr)
}
server.Addr = l.Addr().String()
go func(server *http.Server, l net.Listener) {
server.Serve(l)
}(server, l)
return server, nil
}
func HTTPRoot() (http.HandlerFunc) {
v1 := HTTPRootV1()
return func(w http.ResponseWriter, r *http.Request) {
// Route the request to the right handler's version
v1(w, r)
}
}
func HTTPRootV1() (http.HandlerFunc) {
return func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello"))
}
}
func main() {
// ensure address is correct, remove hardcoded value here
addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:12344")
if err != nil {
log.Fatal(err)
}
// you can pass more variables if you need to pass them to handlers
server, err := StartHTTPServer(addr/*, users */)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
log.Printf("HTTP Server listeing on: %s\n", server.Addr)
select{}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment