Files
golib/hws
2026-01-26 21:48:18 +11:00
..
2026-01-26 00:23:46 +11:00
2026-01-26 00:23:46 +11:00
2026-01-26 00:23:46 +11:00
2026-01-04 00:59:24 +11:00
2026-01-26 21:48:18 +11:00
2026-01-04 00:59:24 +11:00
2026-01-04 00:59:24 +11:00
2026-01-26 21:38:02 +11:00
2026-01-26 00:23:46 +11:00
2026-01-26 00:23:46 +11:00
2026-01-26 00:23:46 +11:00
2026-01-04 00:59:24 +11:00
2026-01-26 00:23:46 +11:00

HWS (H Web Server) - v0.2.3

A lightweight, opinionated HTTP web server framework for Go built on top of the standard library's net/http.

Features

  • Built on Go 1.22+ routing patterns with method and path matching
  • Structured error handling with customizable error pages
  • Integrated logging with zerolog via hlog
  • Middleware support with predictable execution order
  • GZIP compression support
  • Safe static file serving (prevents directory listing)
  • Environment variable configuration with ConfigFromEnv
  • Request timing and logging middleware
  • Graceful shutdown support
  • Built-in health check endpoint

Installation

go get git.haelnorr.com/h/golib/hws

Quick Start

package main

import (
    "context"
    "net/http"
    "git.haelnorr.com/h/golib/hws"
)

func main() {
    // Load configuration from environment variables
    config, _ := hws.ConfigFromEnv()
    
    // Create server
    server, _ := hws.NewServer(config)

    // Define routes
    routes := []hws.Route{
        {
            Path:    "/",
            Method:  hws.MethodGET,
            Handler: http.HandlerFunc(homeHandler),
        },
        {
            Path:    "/api/users/{id}",
            Method:  hws.MethodGET,
            Handler: http.HandlerFunc(getUserHandler),
        },
        {
            // Single route handling multiple HTTP methods
            Path:    "/api/resource",
            Methods: []hws.Method{hws.MethodGET, hws.MethodPOST, hws.MethodPUT},
            Handler: http.HandlerFunc(resourceHandler),
        },
    }

    // Add routes and middleware
    server.AddRoutes(routes...)
    server.AddMiddleware()

    // Start server
    ctx := context.Background()
    server.Start(ctx)

    // Wait for server to be ready
    <-server.Ready()
}

func homeHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, World!"))
}

func getUserHandler(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")
    w.Write([]byte("User ID: " + id))
}

func resourceHandler(w http.ResponseWriter, r *http.Request) {
    // Handle GET, POST, and PUT for the same path
    switch r.Method {
    case "GET":
        w.Write([]byte("Getting resource"))
    case "POST":
        w.Write([]byte("Creating resource"))
    case "PUT":
        w.Write([]byte("Updating resource"))
    }
}

Documentation

For detailed documentation, see the HWS Wiki.

Additional API documentation is available at GoDoc.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  • hwsauth - JWT authentication middleware for HWS
  • hlog - Structured logging with zerolog
  • jwt - JWT token generation and validation