libNetHttp

package
v0.17.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 23, 2025 License: GPL-3.0 Imports: 11 Imported by: 0

README

Net/HTTP Web Framework Support for requestCore

This package provides support for Go's standard net/http package as a web framework in the requestCore ecosystem.

Features

  • ✅ Full compatibility with requestCore's RequestParser interface
  • ✅ Support for all standard HTTP methods (GET, POST, PUT, DELETE, PATCH)
  • ✅ Built-in middleware support (CORS, Logging, Recovery, Auth)
  • ✅ File upload and download capabilities
  • ✅ Cookie handling
  • ✅ URL parameter and query parameter extraction
  • ✅ JSON request/response handling
  • ✅ Form data parsing
  • ✅ Custom error handling
  • ✅ Static file serving
  • ✅ Redirect support

Quick Start

Basic Server Setup
package main

import (
    "log"
    "net/http"
    
    "github.com/hmmftg/requestCore/libNetHttp"
)

func main() {
    // Create a server with requestCore integration
    server := libNetHttp.CreateExampleServer()
    
    log.Println("Starting server on :8080")
    log.Fatal(server.ListenAndServe())
}
Custom Handler with requestCore
func MyHandler(w http.ResponseWriter, r *http.Request) {
    // Initialize requestCore context
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    // Get request information
    method := parser.GetMethod()
    path := parser.GetPath()
    
    // Parse JSON body
    var requestData MyRequestStruct
    err := parser.GetBody(&requestData)
    if err != nil {
        http.Error(w, "Invalid JSON", http.StatusBadRequest)
        return
    }
    
    // Process request...
    
    // Send JSON response
    response := MyResponseStruct{
        Message: "Success",
        Data:    requestData,
    }
    
    parser.SendJSONRespBody(http.StatusOK, response)
}

Middleware

Built-in Middleware
// Chain multiple middleware
handler := libNetHttp.ChainMiddleware(
    libNetHttp.LoggingMiddleware(),
    libNetHttp.CORSMiddleware(),
    libNetHttp.RecoveryMiddleware(),
    libNetHttp.AuthMiddleware(),
)

mux.HandleFunc("/api/endpoint", handler(http.HandlerFunc(MyHandler)).ServeHTTP)
Custom Middleware
func CustomMiddleware() libNetHttp.Middleware {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // Pre-processing
            log.Println("Before handler")
            
            // Call next middleware/handler
            next.ServeHTTP(w, r)
            
            // Post-processing
            log.Println("After handler")
        })
    }
}

Request Parsing

JSON Body Parsing
type UserRequest struct {
    Name  string `json:"name"`
    Email string `json:"email"`
}

func CreateUser(w http.ResponseWriter, r *http.Request) {
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    var user UserRequest
    err := parser.GetBody(&user)
    if err != nil {
        http.Error(w, "Invalid JSON", http.StatusBadRequest)
        return
    }
    
    // Process user creation...
}
URL Parameters
func GetUser(w http.ResponseWriter, r *http.Request) {
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    // Set URL parameters (typically done by your router)
    parser.AddParam("id", "123")
    
    // Get parameter
    userID := parser.GetUrlParam("id")
    
    // Get all parameters
    params := parser.GetUrlParams()
}
Query Parameters
func SearchUsers(w http.ResponseWriter, r *http.Request) {
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    // Parse query parameters into struct
    type SearchParams struct {
        Query string `json:"q"`
        Limit int    `json:"limit"`
    }
    
    var searchParams SearchParams
    err := parser.GetUrlQuery(&searchParams)
    if err != nil {
        http.Error(w, "Invalid query parameters", http.StatusBadRequest)
        return
    }
    
    // Process search...
}
Form Data
func HandleForm(w http.ResponseWriter, r *http.Request) {
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    // Parse form data
    err := parser.ParseForm()
    if err != nil {
        http.Error(w, "Error parsing form", http.StatusBadRequest)
        return
    }
    
    // Get form values
    name := parser.GetFormValue("name")
    email := parser.GetFormValue("email")
    
    // Get all values for a key
    tags := parser.GetFormValues("tags")
}

File Operations

File Upload
func UploadFile(w http.ResponseWriter, r *http.Request) {
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    // Parse multipart form
    err := parser.ParseMultipartForm(32 << 20) // 32 MB max
    if err != nil {
        http.Error(w, "Error parsing multipart form", http.StatusBadRequest)
        return
    }
    
    // Save uploaded file
    err = parser.SaveFile("file", "/uploads/uploaded_file.txt")
    if err != nil {
        http.Error(w, "Error saving file", http.StatusInternalServerError)
        return
    }
    
    // Response
    response := map[string]string{
        "message": "File uploaded successfully",
    }
    parser.SendJSONRespBody(http.StatusOK, response)
}
File Download
func DownloadFile(w http.ResponseWriter, r *http.Request) {
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    // Serve file as attachment
    parser.FileAttachment("/path/to/file.pdf", "document.pdf")
}
func HandleCookies(w http.ResponseWriter, r *http.Request) {
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    // Get all cookies
    cookies := parser.GetCookies()
    
    // Get specific cookie
    sessionCookie, err := parser.GetCookie("session")
    if err != nil {
        // Cookie not found
    }
    
    // Set new cookie
    cookie := &http.Cookie{
        Name:    "user_preference",
        Value:   "dark_mode",
        Expires: time.Now().Add(24 * time.Hour),
        Path:    "/",
    }
    parser.SetCookie(cookie)
}

Error Handling

func ErrorHandler(w http.ResponseWriter, r *http.Request) {
    wf := libContext.InitNetHttpContext(r, w, false)
    parser := wf.Parser.(libNetHttp.NetHttpParser)
    
    // Custom error response
    errorResponse := map[string]string{
        "error":   "Custom error message",
        "code":    "CUSTOM_ERROR",
        "details": "Additional error details",
    }
    
    parser.SendJSONRespBody(http.StatusBadRequest, errorResponse)
}

Integration with BaseHandler

If you're using requestCore's BaseHandler, you can integrate it like this:

func CreateServerWithBaseHandler() *http.Server {
    mux := http.NewServeMux()
    
    // Add middleware
    handler := libNetHttp.ChainMiddleware(
        libNetHttp.LoggingMiddleware(),
        libNetHttp.CORSMiddleware(),
        libNetHttp.RecoveryMiddleware(),
    )
    
    // Wrap BaseHandler with NetHttpHandler
    mux.HandleFunc("/api/users", handler(libNetHttp.NetHttpHandler(
        handlers.BaseHandler(core, userHandler, false)
    )).ServeHTTP)
    
    return &http.Server{
        Addr:    ":8080",
        Handler: mux,
    }
}

Testing

Unit Testing
func TestMyHandler(t *testing.T) {
    // Create test request
    req := httptest.NewRequest("GET", "/api/test", nil)
    req.Header.Set("User-Id", "test-user")
    
    // Create response recorder
    w := httptest.NewRecorder()
    
    // Call handler
    MyHandler(w, req)
    
    // Assertions
    assert.Equal(t, http.StatusOK, w.Code)
    
    var response map[string]interface{}
    err := json.Unmarshal(w.Body.Bytes(), &response)
    assert.NoError(t, err)
    assert.Equal(t, "Success", response["message"])
}

Performance Considerations

  • Use connection pooling for database connections
  • Implement proper caching strategies
  • Use http.ServeMux for simple routing or consider gorilla/mux for complex routing
  • Enable HTTP/2 for better performance
  • Use middleware sparingly to avoid overhead

Comparison with Other Frameworks

Feature net/http Gin Fiber
Performance High High Very High
Memory Usage Low Medium Low
Learning Curve Medium Low Low
Ecosystem Large Large Growing
Built-in Features Basic Rich Rich
Middleware Manual Built-in Built-in

Best Practices

  1. Use middleware for cross-cutting concerns (logging, auth, CORS)
  2. Validate input early in your handlers
  3. Use proper HTTP status codes
  4. Implement proper error handling
  5. Use context for request-scoped values
  6. Implement graceful shutdown
  7. Use structured logging
  8. Add health check endpoints

Example Complete Server

package main

import (
    "log"
    "net/http"
    "os"
    "os/signal"
    "syscall"
    "time"
    
    "github.com/hmmftg/requestCore/libNetHttp"
)

func main() {
    // Create server
    server := &http.Server{
        Addr:    ":8080",
        Handler: createHandler(),
    }
    
    // Start server in goroutine
    go func() {
        log.Println("Starting server on :8080")
        if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
            log.Fatalf("Server failed to start: %v", err)
        }
    }()
    
    // Wait for interrupt signal
    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit
    
    log.Println("Shutting down server...")
    
    // Graceful shutdown
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    
    if err := server.Shutdown(ctx); err != nil {
        log.Fatalf("Server forced to shutdown: %v", err)
    }
    
    log.Println("Server exited")
}

func createHandler() http.Handler {
    mux := http.NewServeMux()
    
    // Add middleware
    handler := libNetHttp.ChainMiddleware(
        libNetHttp.LoggingMiddleware(),
        libNetHttp.CORSMiddleware(),
        libNetHttp.RecoveryMiddleware(),
    )
    
    // Routes
    mux.HandleFunc("/health", handler(http.HandlerFunc(healthHandler)).ServeHTTP)
    mux.HandleFunc("/api/users", handler(http.HandlerFunc(usersHandler)).ServeHTTP)
    
    return mux
}

func healthHandler(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("OK"))
}

func usersHandler(w http.ResponseWriter, r *http.Request) {
    // Your user handling logic here
    response := map[string]string{"message": "Users endpoint"}
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(response)
}

This implementation provides full compatibility with requestCore while leveraging Go's standard net/http package for maximum performance and flexibility.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NetHttpErrorHandler

func NetHttpErrorHandler(path, title string, handler ContextInitiator) http.HandlerFunc

func NetHttpHandler

func NetHttpHandler(handler any) http.HandlerFunc

NetHttpHandler wraps a handler function to work with net/http

Types

type ContextInitiator

type ContextInitiator interface {
	InitContext(r *http.Request, w http.ResponseWriter) webFramework.WebFramework
	Respond(int, int, string, any, bool, webFramework.WebFramework)
}

type Middleware

type Middleware func(http.Handler) http.Handler

Middleware function type for net/http

func AuthMiddleware

func AuthMiddleware() Middleware

AuthMiddleware example for net/http

func CORSMiddleware

func CORSMiddleware() Middleware

CORS middleware for net/http

func ChainMiddleware

func ChainMiddleware(middlewares ...Middleware) Middleware

ChainMiddleware chains multiple middleware functions

func LoggingMiddleware

func LoggingMiddleware() Middleware

Logging middleware for net/http

func RecoveryMiddleware

func RecoveryMiddleware() Middleware

Recovery middleware for net/http

type NetHttpParser

type NetHttpParser struct {
	Request  *http.Request
	Response http.ResponseWriter
	Locals   map[string]any
	Params   map[string]string
}

func InitContext

func InitContext(r *http.Request, w http.ResponseWriter) NetHttpParser

func (NetHttpParser) Abort

func (c NetHttpParser) Abort() error

func (NetHttpParser) AddCustomAttributes

func (c NetHttpParser) AddCustomAttributes(attr slog.Attr)

func (*NetHttpParser) AddParam

func (c *NetHttpParser) AddParam(key, value string)

AddParam adds a single URL parameter

func (NetHttpParser) CheckUrlParam

func (c NetHttpParser) CheckUrlParam(name string) (string, bool)

func (NetHttpParser) FileAttachment

func (c NetHttpParser) FileAttachment(path, fileName string)

func (NetHttpParser) FormValue

func (c NetHttpParser) FormValue(name string) string

func (NetHttpParser) GetArgs

func (c NetHttpParser) GetArgs(args ...any) map[string]string

func (NetHttpParser) GetBody

func (c NetHttpParser) GetBody(target any) error

func (NetHttpParser) GetCookie

func (c NetHttpParser) GetCookie(name string) (*http.Cookie, error)

GetCookie gets a cookie by name

func (NetHttpParser) GetCookies

func (c NetHttpParser) GetCookies() []*http.Cookie

GetCookies gets all cookies

func (NetHttpParser) GetFormValue

func (c NetHttpParser) GetFormValue(key string) string

GetFormValue gets form value

func (NetHttpParser) GetFormValues

func (c NetHttpParser) GetFormValues(key string) []string

GetFormValues gets all form values for a key

func (NetHttpParser) GetHeader

func (c NetHttpParser) GetHeader(target webFramework.HeaderInterface) error

func (NetHttpParser) GetHeaderValue

func (c NetHttpParser) GetHeaderValue(name string) string

func (NetHttpParser) GetHttpHeader

func (c NetHttpParser) GetHttpHeader() http.Header

func (NetHttpParser) GetLocal

func (c NetHttpParser) GetLocal(name string) any

func (NetHttpParser) GetLocalString

func (c NetHttpParser) GetLocalString(name string) string

func (NetHttpParser) GetMethod

func (c NetHttpParser) GetMethod() string

func (NetHttpParser) GetPath

func (c NetHttpParser) GetPath() string

func (NetHttpParser) GetPostFormValue

func (c NetHttpParser) GetPostFormValue(key string) string

GetPostFormValue gets POST form value

func (NetHttpParser) GetPostFormValues

func (c NetHttpParser) GetPostFormValues(key string) []string

GetPostFormValues gets all POST form values for a key

func (NetHttpParser) GetRawUrlQuery

func (c NetHttpParser) GetRawUrlQuery() string

func (NetHttpParser) GetUri

func (c NetHttpParser) GetUri(target any) error

func (NetHttpParser) GetUrlParam

func (c NetHttpParser) GetUrlParam(name string) string

func (NetHttpParser) GetUrlParams

func (c NetHttpParser) GetUrlParams() map[string]string

func (NetHttpParser) GetUrlQuery

func (c NetHttpParser) GetUrlQuery(target any) error

func (NetHttpParser) Next

func (c NetHttpParser) Next() error

func (NetHttpParser) ParseCommand

func (c NetHttpParser) ParseCommand(command, title string, request webFramework.RecordData, parser webFramework.FieldParser) string

func (NetHttpParser) ParseForm

func (c NetHttpParser) ParseForm() error

ParseForm parses form data

func (NetHttpParser) ParseMultipartForm

func (c NetHttpParser) ParseMultipartForm(maxMemory int64) error

ParseMultipartForm parses multipart form data

func (NetHttpParser) Redirect

func (c NetHttpParser) Redirect(url string, statusCode int)

Redirect redirects to a URL

func (NetHttpParser) SaveFile

func (c NetHttpParser) SaveFile(formTagName, path string) error

func (NetHttpParser) SendJSONRespBody

func (c NetHttpParser) SendJSONRespBody(status int, resp any) error

func (NetHttpParser) ServeContent

func (c NetHttpParser) ServeContent(name string, modtime time.Time, content io.ReadSeeker)

ServeContent serves content

func (NetHttpParser) ServeFile

func (c NetHttpParser) ServeFile(name string)

ServeFile serves a file

func (NetHttpParser) SetCookie

func (c NetHttpParser) SetCookie(cookie *http.Cookie)

SetCookie sets a cookie

func (NetHttpParser) SetLocal

func (c NetHttpParser) SetLocal(name string, value any)

func (*NetHttpParser) SetParams

func (c *NetHttpParser) SetParams(params map[string]string)

SetParams sets URL parameters (useful for routing)

func (NetHttpParser) SetReqHeader

func (c NetHttpParser) SetReqHeader(name string, value string)

func (NetHttpParser) SetRespHeader

func (c NetHttpParser) SetRespHeader(name string, value string)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL