libNetHttp

package
v0.22.0 Latest Latest
Warning

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

Go to latest
Published: Dec 23, 2025 License: GPL-3.0 Imports: 16 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 AddSpanAttribute added in v0.18.0

func AddSpanAttribute(ctx context.Context, key, value string)

AddSpanAttribute adds an attribute to the current span

func AddSpanAttributes added in v0.18.0

func AddSpanAttributes(ctx context.Context, attrs map[string]string)

AddSpanAttributes adds multiple attributes to the current span

func AddSpanEvent added in v0.18.0

func AddSpanEvent(ctx context.Context, name string, attrs map[string]string)

AddSpanEvent adds an event to the current span

func CustomTracingMiddleware added in v0.18.0

func CustomTracingMiddleware(tm *libTracing.TracingManager) func(http.Handler) http.Handler

CustomTracingMiddleware creates a custom net/http middleware with more control

func GetSpanFromContext added in v0.18.0

func GetSpanFromContext(ctx context.Context) trace.Span

GetSpanFromContext gets the span from context

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

func RecordSpanError added in v0.18.0

func RecordSpanError(ctx context.Context, err error, attrs map[string]string)

RecordSpanError records an error in the current span

func TracingMiddleware added in v0.18.0

func TracingMiddleware() func(http.Handler) http.Handler

TracingMiddleware creates net/http middleware for OpenTelemetry tracing

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) AddSpanAttribute added in v0.18.0

func (c NetHttpParser) AddSpanAttribute(key, value string)

func (NetHttpParser) AddSpanAttributes added in v0.18.0

func (c NetHttpParser) AddSpanAttributes(attrs map[string]string)

func (NetHttpParser) AddSpanEvent added in v0.18.0

func (c NetHttpParser) AddSpanEvent(name string, attrs map[string]string)

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) GetContext added in v0.22.0

func (c NetHttpParser) GetContext() context.Context

GetContext returns the context from the HTTP request

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) GetTraceContext added in v0.18.0

func (c NetHttpParser) GetTraceContext() trace.SpanContext

Tracing methods for NetHttpParser

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) RecordSpanError added in v0.18.0

func (c NetHttpParser) RecordSpanError(err error, attrs map[string]string)

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) SetContext added in v0.22.0

func (c NetHttpParser) SetContext(ctx context.Context)

SetContext updates the context in the HTTP request

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)

func (NetHttpParser) SetTraceContext added in v0.18.0

func (c NetHttpParser) SetTraceContext(spanCtx trace.SpanContext)

func (NetHttpParser) StartSpan added in v0.18.0

func (c NetHttpParser) StartSpan(name string, opts ...trace.SpanStartOption) (context.Context, trace.Span)

Jump to

Keyboard shortcuts

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