47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
package webfinger
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
)
|
|
|
|
// Handler handles WebFinger requests to an HTTP server
|
|
type Handler struct {
|
|
// DescriptorFunc is the function used to resolve resource strings
|
|
// to WebFinger descriptors. It's called on every request to the
|
|
// WebFinger endpoint. The errors it returns are handled by ErrorHandler.
|
|
DescriptorFunc func(resource string) (*Descriptor, error)
|
|
|
|
// ErrorHandler handles any errors that occur in the process of performing
|
|
// a WebFinger lookup. If not provided, a simple default handler is used.
|
|
ErrorHandler func(err error, res http.ResponseWriter)
|
|
}
|
|
|
|
// ServeHTTP implements the http.Handler interface
|
|
func (h Handler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
|
|
if h.ErrorHandler == nil {
|
|
h.ErrorHandler = func(err error, res http.ResponseWriter) {
|
|
http.Error(res, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
}
|
|
|
|
descriptor, err := h.DescriptorFunc(req.URL.Query().Get("resource"))
|
|
if err != nil {
|
|
h.ErrorHandler(err, res)
|
|
return
|
|
}
|
|
|
|
data, err := json.Marshal(descriptor)
|
|
if err != nil {
|
|
h.ErrorHandler(err, res)
|
|
return
|
|
}
|
|
|
|
res.Header().Set("Content-Type", "application/jrd+json")
|
|
_, err = res.Write(data)
|
|
if err != nil {
|
|
h.ErrorHandler(err, res)
|
|
return
|
|
}
|
|
}
|