Skip to content

Commit

Permalink
add access to Route from Request, issue #459 (#462)
Browse files Browse the repository at this point in the history
* add access to Route from Request

* add RouteReader
  • Loading branch information
emicklei authored Apr 10, 2021
1 parent ccd1b24 commit 83fd2c0
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 2 deletions.
8 changes: 7 additions & 1 deletion request.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type Request struct {
pathParameters map[string]string
attributes map[string]interface{} // for storing request-scoped values
selectedRoutePath string // root path + route path that matched the request, e.g. /meetings/{id}/attendees
selectedRoute *Route
}

func NewRequest(httpRequest *http.Request) *Request {
Expand Down Expand Up @@ -114,5 +115,10 @@ func (r Request) Attribute(name string) interface{} {

// SelectedRoutePath root path + route path that matched the request, e.g. /meetings/{id}/attendees
func (r Request) SelectedRoutePath() string {
return r.selectedRoutePath
return r.selectedRoute.Path
}

// SelectedRoute return the Route that selected by the container
func (r Request) SelectedRoute() RouteReader {
return routeAccessor{route: r.selectedRoute}
}
2 changes: 1 addition & 1 deletion route.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func (r *Route) postBuild() {
func (r *Route) wrapRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request, pathParams map[string]string) (*Request, *Response) {
wrappedRequest := NewRequest(httpRequest)
wrappedRequest.pathParameters = pathParams
wrappedRequest.selectedRoutePath = r.Path
wrappedRequest.selectedRoute = r
wrappedResponse := NewResponse(httpWriter)
wrappedResponse.requestAccept = httpRequest.Header.Get(HEADER_Accept)
wrappedResponse.routeProduces = r.Produces
Expand Down
66 changes: 66 additions & 0 deletions route_reader.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package restful

// Copyright 2021 Ernest Micklei. All rights reserved.
// Use of this source code is governed by a license
// that can be found in the LICENSE file.

type RouteReader interface {
Method() string
Consumes() []string
Path() string
Doc() string
Notes() string
Operation() string
ParameterDocs() []*Parameter
// Returns a copy
Metadata() map[string]interface{}
Deprecated() bool
}

type routeAccessor struct {
route *Route
}

func (r routeAccessor) Method() string {
return r.route.Method
}
func (r routeAccessor) Consumes() []string {
return r.route.Consumes[:]
}
func (r routeAccessor) Path() string {
return r.route.Path
}
func (r routeAccessor) Doc() string {
return r.route.Doc
}
func (r routeAccessor) Notes() string {
return r.route.Notes
}
func (r routeAccessor) Operation() string {
return r.route.Operation
}
func (r routeAccessor) ParameterDocs() []*Parameter {
return r.route.ParameterDocs[:]
}

// Returns a copy
func (r routeAccessor) Metadata() map[string]interface{} {
return copyMap(r.route.Metadata)
}
func (r routeAccessor) Deprecated() bool {
return r.route.Deprecated
}

// https://stackoverflow.com/questions/23057785/how-to-copy-a-map
func copyMap(m map[string]interface{}) map[string]interface{} {
cp := make(map[string]interface{})
for k, v := range m {
vm, ok := v.(map[string]interface{})
if ok {
cp[k] = copyMap(vm)
} else {
cp[k] = v
}
}
return cp
}

0 comments on commit 83fd2c0

Please sign in to comment.