Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Routing groups in Go 1.22 #468

Closed
Mike-at-EQT opened this issue Jun 5, 2024 · 2 comments
Closed

Routing groups in Go 1.22 #468

Mike-at-EQT opened this issue Jun 5, 2024 · 2 comments

Comments

@Mike-at-EQT
Copy link

Could you help me understand why the following code is not routed properly to Huma?

Basically, the "/api/" gets stripped and then I end up with just "/" everywhere. I can't call the healthcheck or the OpenAPI docs.

func NewRouter() http.Handler {
	mux := http.NewServeMux()

	mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Welcome to the API 🎉"))
	}))

	mux.Handle("/api/", ApiMux())

	return mux
}

func ApiMux() http.Handler {
	apiMux := http.NewServeMux()

	apiConfig := huma.DefaultConfig("API Service", "1.0.0")
	apiConfig.Servers = []*huma.Server{
		{URL: config.LoadConfig().BaseURL + "/api"},
	}
	api := humago.NewWithPrefix(apiMux, "/api", apiConfig)

	huma.Get(api, "/health", handlers.HandleHealthCheck)

	return apiMux
}
@LeeSaferite
Copy link

LeeSaferite commented Jun 6, 2024

Your code works fine for me on go 1.22.2 and Huma v2.18.0

package main

import (
	"context"
	"net/http"

	"github.com/danielgtaylor/huma/v2"
	"github.com/danielgtaylor/huma/v2/adapters/humago"
)

func main() {
	server := http.Server{
		Addr:    ":8080",
		Handler: NewRouter(),
	}
	if err := server.ListenAndServe(); err != nil {
		panic(err)
	}
}

func NewRouter() http.Handler {
	mux := http.NewServeMux()

	mux.Handle(
		"/", http.HandlerFunc(
			func(w http.ResponseWriter, r *http.Request) {
				w.Write([]byte("Welcome to the API 🎉"))
			},
		),
	)

	mux.Handle("/api/", ApiMux())

	return mux
}

func ApiMux() http.Handler {
	apiMux := http.NewServeMux()

	apiConfig := huma.DefaultConfig("API Service", "1.0.0")
	apiConfig.Servers = []*huma.Server{
		{URL: "http://localhost:8080/api"},
	}
	api := humago.NewWithPrefix(apiMux, "/api", apiConfig)
	huma.Get(
		api, "/health", func(ctx context.Context, i *Input) (*Output, error) {
			return &Output{Body: "healthy"}, nil
		},
	)

	return apiMux
}

type Input struct {
}

type Output struct {
	Body string `json:"body"`
}

@Mike-at-EQT
Copy link
Author

Thank you @LeeSaferite . I copied and ran your code locally (Go 1.22.4, Huma 2.18.0).

In Chrome (usual window):
http://localhost:8080/api/docs becomes http://localhost:8080/docs

In Chrome (private mode):
Works!

In curl:
Works!

So in other words, there is something fishy going on with my browser that causes URL re-writing :(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants