Skip to content

Commit

Permalink
fix: Update HttpJson regex for URL paths (#1340)
Browse files Browse the repository at this point in the history
* fix: Use specifc regex for matching URL path

* fix: Use specifc regex for matching URL path

* fix: Update test

* fix: Fix regex
  • Loading branch information
lqiu96 authored Jul 5, 2023
1 parent 082b527 commit 4110fee
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 60 deletions.
114 changes: 57 additions & 57 deletions server/genrest/genrest.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ func RegisterHandlers(router *gmux.Router, backend *services.Backend) {
router.HandleFunc("/v1beta1/repeat:body", rest.HandleRepeatDataBody).Methods("POST")
router.HandleFunc("/v1beta1/repeat:bodyinfo", rest.HandleRepeatDataBodyInfo).Methods("POST")
router.HandleFunc("/v1beta1/repeat:query", rest.HandleRepeatDataQuery).Methods("GET")
router.HandleFunc("/v1beta1/repeat/{info.fString:.+}/{info.fInt32:.+}/{info.fDouble:.+}/{info.fBool:.+}/{info.fKingdom:.+}:simplepath", rest.HandleRepeatDataSimplePath).Methods("GET")
router.HandleFunc("/v1beta1/repeat/{info.fString:first/.+}/{info.fChild.fString:second/.+}/bool/{info.fBool:.+}:pathresource", rest.HandleRepeatDataPathResource).Methods("GET")
router.HandleFunc("/v1beta1/repeat/{info.fChild.fString:first/.+}/{info.fString:second/.+}/bool/{info.fBool:.+}:childfirstpathresource", rest.HandleRepeatDataPathResource_1).Methods("GET")
router.HandleFunc("/v1beta1/repeat/{info.fString:first/.+}/{info.fChild.fString:second/.+}:pathtrailingresource", rest.HandleRepeatDataPathTrailingResource).Methods("GET")
router.HandleFunc("/v1beta1/repeat/{info.fString:[^:]+}/{info.fInt32:[^:]+}/{info.fDouble:[^:]+}/{info.fBool:[^:]+}/{info.fKingdom:[^:]+}:simplepath", rest.HandleRepeatDataSimplePath).Methods("GET")
router.HandleFunc("/v1beta1/repeat/{info.fString:first/[^:]+}/{info.fChild.fString:second/[^:]+}/bool/{info.fBool:[^:]+}:pathresource", rest.HandleRepeatDataPathResource).Methods("GET")
router.HandleFunc("/v1beta1/repeat/{info.fChild.fString:first/[^:]+}/{info.fString:second/[^:]+}/bool/{info.fBool:[^:]+}:childfirstpathresource", rest.HandleRepeatDataPathResource_1).Methods("GET")
router.HandleFunc("/v1beta1/repeat/{info.fString:first/[^:]+}/{info.fChild.fString:second/[^:]+}:pathtrailingresource", rest.HandleRepeatDataPathTrailingResource).Methods("GET")
router.HandleFunc("/v1beta1/repeat:bodyput", rest.HandleRepeatDataBodyPut).Methods("PUT")
router.HandleFunc("/v1beta1/repeat:bodypatch", rest.HandleRepeatDataBodyPatch).Methods("PATCH")
router.HandleFunc("/v1beta1/repeat:bodypatch", rest.HandleRepeatDataBodyPatch).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
Expand All @@ -53,67 +53,67 @@ func RegisterHandlers(router *gmux.Router, backend *services.Backend) {
router.HandleFunc("/v1beta1/echo:wait", rest.HandleWait).Methods("POST")
router.HandleFunc("/v1beta1/echo:block", rest.HandleBlock).Methods("POST")
router.HandleFunc("/v1beta1/users", rest.HandleCreateUser).Methods("POST")
router.HandleFunc("/v1beta1/{name:users/.+}", rest.HandleGetUser).Methods("GET")
router.HandleFunc("/v1beta1/{user.name:users/.+}", rest.HandleUpdateUser).Methods("PATCH")
router.HandleFunc("/v1beta1/{user.name:users/.+}", rest.HandleUpdateUser).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
router.HandleFunc("/v1beta1/{name:users/.+}", rest.HandleDeleteUser).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:users/[^:]+}", rest.HandleGetUser).Methods("GET")
router.HandleFunc("/v1beta1/{user.name:users/[^:]+}", rest.HandleUpdateUser).Methods("PATCH")
router.HandleFunc("/v1beta1/{user.name:users/[^:]+}", rest.HandleUpdateUser).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
router.HandleFunc("/v1beta1/{name:users/[^:]+}", rest.HandleDeleteUser).Methods("DELETE")
router.HandleFunc("/v1beta1/users", rest.HandleListUsers).Methods("GET")
router.HandleFunc("/v1beta1/rooms", rest.HandleCreateRoom).Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/.+}", rest.HandleGetRoom).Methods("GET")
router.HandleFunc("/v1beta1/{room.name:rooms/.+}", rest.HandleUpdateRoom).Methods("PATCH")
router.HandleFunc("/v1beta1/{room.name:rooms/.+}", rest.HandleUpdateRoom).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/.+}", rest.HandleDeleteRoom).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:rooms/[^:]+}", rest.HandleGetRoom).Methods("GET")
router.HandleFunc("/v1beta1/{room.name:rooms/[^:]+}", rest.HandleUpdateRoom).Methods("PATCH")
router.HandleFunc("/v1beta1/{room.name:rooms/[^:]+}", rest.HandleUpdateRoom).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/[^:]+}", rest.HandleDeleteRoom).Methods("DELETE")
router.HandleFunc("/v1beta1/rooms", rest.HandleListRooms).Methods("GET")
router.HandleFunc("/v1beta1/{parent:rooms/.+}/blurbs", rest.HandleCreateBlurb).Methods("POST")
router.HandleFunc("/v1beta1/{parent:users/.+/profile}/blurbs", rest.HandleCreateBlurb_1).Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/.+/blurbs/.+}", rest.HandleGetBlurb).Methods("GET")
router.HandleFunc("/v1beta1/{name:users/.+/profile/blurbs/.+}", rest.HandleGetBlurb_1).Methods("GET")
router.HandleFunc("/v1beta1/{blurb.name:rooms/.+/blurbs/.+}", rest.HandleUpdateBlurb).Methods("PATCH")
router.HandleFunc("/v1beta1/{blurb.name:rooms/.+/blurbs/.+}", rest.HandleUpdateBlurb).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
router.HandleFunc("/v1beta1/{blurb.name:users/.+/profile/blurbs/.+}", rest.HandleUpdateBlurb_1).Methods("PATCH")
router.HandleFunc("/v1beta1/{blurb.name:users/.+/profile/blurbs/.+}", rest.HandleUpdateBlurb_1).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/.+/blurbs/.+}", rest.HandleDeleteBlurb).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:users/.+/profile/blurbs/.+}", rest.HandleDeleteBlurb_1).Methods("DELETE")
router.HandleFunc("/v1beta1/{parent:rooms/.+}/blurbs", rest.HandleListBlurbs).Methods("GET")
router.HandleFunc("/v1beta1/{parent:users/.+/profile}/blurbs", rest.HandleListBlurbs_1).Methods("GET")
router.HandleFunc("/v1beta1/{parent:rooms/.+}/blurbs:search", rest.HandleSearchBlurbs).Methods("POST")
router.HandleFunc("/v1beta1/{parent:users/.+/profile}/blurbs:search", rest.HandleSearchBlurbs_1).Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/.+}/blurbs:stream", rest.HandleStreamBlurbs).Methods("POST")
router.HandleFunc("/v1beta1/{name:users/.+/profile}/blurbs:stream", rest.HandleStreamBlurbs_1).Methods("POST")
router.HandleFunc("/v1beta1/{parent:rooms/.+}/blurbs:send", rest.HandleSendBlurbs).Methods("POST")
router.HandleFunc("/v1beta1/{parent:users/.+/profile}/blurbs:send", rest.HandleSendBlurbs_1).Methods("POST")
router.HandleFunc("/v1beta1/{parent:rooms/[^:]+}/blurbs", rest.HandleCreateBlurb).Methods("POST")
router.HandleFunc("/v1beta1/{parent:users/[^:]+/profile}/blurbs", rest.HandleCreateBlurb_1).Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/[^:]+/blurbs/[^:]+}", rest.HandleGetBlurb).Methods("GET")
router.HandleFunc("/v1beta1/{name:users/[^:]+/profile/blurbs/[^:]+}", rest.HandleGetBlurb_1).Methods("GET")
router.HandleFunc("/v1beta1/{blurb.name:rooms/[^:]+/blurbs/[^:]+}", rest.HandleUpdateBlurb).Methods("PATCH")
router.HandleFunc("/v1beta1/{blurb.name:rooms/[^:]+/blurbs/[^:]+}", rest.HandleUpdateBlurb).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
router.HandleFunc("/v1beta1/{blurb.name:users/[^:]+/profile/blurbs/[^:]+}", rest.HandleUpdateBlurb_1).Methods("PATCH")
router.HandleFunc("/v1beta1/{blurb.name:users/[^:]+/profile/blurbs/[^:]+}", rest.HandleUpdateBlurb_1).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/[^:]+/blurbs/[^:]+}", rest.HandleDeleteBlurb).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:users/[^:]+/profile/blurbs/[^:]+}", rest.HandleDeleteBlurb_1).Methods("DELETE")
router.HandleFunc("/v1beta1/{parent:rooms/[^:]+}/blurbs", rest.HandleListBlurbs).Methods("GET")
router.HandleFunc("/v1beta1/{parent:users/[^:]+/profile}/blurbs", rest.HandleListBlurbs_1).Methods("GET")
router.HandleFunc("/v1beta1/{parent:rooms/[^:]+}/blurbs:search", rest.HandleSearchBlurbs).Methods("POST")
router.HandleFunc("/v1beta1/{parent:users/[^:]+/profile}/blurbs:search", rest.HandleSearchBlurbs_1).Methods("POST")
router.HandleFunc("/v1beta1/{name:rooms/[^:]+}/blurbs:stream", rest.HandleStreamBlurbs).Methods("POST")
router.HandleFunc("/v1beta1/{name:users/[^:]+/profile}/blurbs:stream", rest.HandleStreamBlurbs_1).Methods("POST")
router.HandleFunc("/v1beta1/{parent:rooms/[^:]+}/blurbs:send", rest.HandleSendBlurbs).Methods("POST")
router.HandleFunc("/v1beta1/{parent:users/[^:]+/profile}/blurbs:send", rest.HandleSendBlurbs_1).Methods("POST")
router.HandleFunc("/v1beta1/sequences", rest.HandleCreateSequence).Methods("POST")
router.HandleFunc("/v1beta1/streamingSequences", rest.HandleCreateStreamingSequence).Methods("POST")
router.HandleFunc("/v1beta1/{name:sequences/.+/sequenceReport}", rest.HandleGetSequenceReport).Methods("GET")
router.HandleFunc("/v1beta1/{name:streamingSequences/.+/streamingSequenceReport}", rest.HandleGetStreamingSequenceReport).Methods("GET")
router.HandleFunc("/v1beta1/{name:sequences/.+}", rest.HandleAttemptSequence).Methods("POST")
router.HandleFunc("/v1beta1/{name:streamingSequences/.+}:stream", rest.HandleAttemptStreamingSequence).Methods("POST")
router.HandleFunc("/v1beta1/{name:sequences/[^:]+/sequenceReport}", rest.HandleGetSequenceReport).Methods("GET")
router.HandleFunc("/v1beta1/{name:streamingSequences/[^:]+/streamingSequenceReport}", rest.HandleGetStreamingSequenceReport).Methods("GET")
router.HandleFunc("/v1beta1/{name:sequences/[^:]+}", rest.HandleAttemptSequence).Methods("POST")
router.HandleFunc("/v1beta1/{name:streamingSequences/[^:]+}:stream", rest.HandleAttemptStreamingSequence).Methods("POST")
router.HandleFunc("/v1beta1/sessions", rest.HandleCreateSession).Methods("POST")
router.HandleFunc("/v1beta1/{name:sessions/.+}", rest.HandleGetSession).Methods("GET")
router.HandleFunc("/v1beta1/{name:sessions/[^:]+}", rest.HandleGetSession).Methods("GET")
router.HandleFunc("/v1beta1/sessions", rest.HandleListSessions).Methods("GET")
router.HandleFunc("/v1beta1/{name:sessions/.+}", rest.HandleDeleteSession).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:sessions/.+}:report", rest.HandleReportSession).Methods("POST")
router.HandleFunc("/v1beta1/{parent:sessions/.+}/tests", rest.HandleListTests).Methods("GET")
router.HandleFunc("/v1beta1/{name:sessions/.+/tests/.+}", rest.HandleDeleteTest).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:sessions/.+/tests/.+}:check", rest.HandleVerifyTest).Methods("POST")
router.HandleFunc("/v1beta1/{name:projects/.+}/locations", rest.HandleListLocations).Methods("GET")
router.HandleFunc("/v1beta1/{name:projects/.+/locations/.+}", rest.HandleGetLocation).Methods("GET")
router.HandleFunc("/v1beta1/{resource:users/.+}:setIamPolicy", rest.HandleSetIamPolicy).Methods("POST")
router.HandleFunc("/v1beta1/{resource:rooms/.+}:setIamPolicy", rest.HandleSetIamPolicy_1).Methods("POST")
router.HandleFunc("/v1beta1/{resource:rooms/.+/blurbs/.+}:setIamPolicy", rest.HandleSetIamPolicy_2).Methods("POST")
router.HandleFunc("/v1beta1/{resource:sequences/.+}:setIamPolicy", rest.HandleSetIamPolicy_3).Methods("POST")
router.HandleFunc("/v1beta1/{resource:users/.+}:getIamPolicy", rest.HandleGetIamPolicy).Methods("GET")
router.HandleFunc("/v1beta1/{resource:rooms/.+}:getIamPolicy", rest.HandleGetIamPolicy_1).Methods("GET")
router.HandleFunc("/v1beta1/{resource:rooms/.+/blurbs/.+}:getIamPolicy", rest.HandleGetIamPolicy_2).Methods("GET")
router.HandleFunc("/v1beta1/{resource:sequences/.+}:getIamPolicy", rest.HandleGetIamPolicy_3).Methods("GET")
router.HandleFunc("/v1beta1/{resource:users/.+}:testIamPermissions", rest.HandleTestIamPermissions).Methods("POST")
router.HandleFunc("/v1beta1/{resource:rooms/.+}:testIamPermissions", rest.HandleTestIamPermissions_1).Methods("POST")
router.HandleFunc("/v1beta1/{resource:rooms/.+/blurbs/.+}:testIamPermissions", rest.HandleTestIamPermissions_2).Methods("POST")
router.HandleFunc("/v1beta1/{resource:sequences/.+}:testIamPermissions", rest.HandleTestIamPermissions_3).Methods("POST")
router.HandleFunc("/v1beta1/{name:sessions/[^:]+}", rest.HandleDeleteSession).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:sessions/[^:]+}:report", rest.HandleReportSession).Methods("POST")
router.HandleFunc("/v1beta1/{parent:sessions/[^:]+}/tests", rest.HandleListTests).Methods("GET")
router.HandleFunc("/v1beta1/{name:sessions/[^:]+/tests/[^:]+}", rest.HandleDeleteTest).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:sessions/[^:]+/tests/[^:]+}:check", rest.HandleVerifyTest).Methods("POST")
router.HandleFunc("/v1beta1/{name:projects/[^:]+}/locations", rest.HandleListLocations).Methods("GET")
router.HandleFunc("/v1beta1/{name:projects/[^:]+/locations/[^:]+}", rest.HandleGetLocation).Methods("GET")
router.HandleFunc("/v1beta1/{resource:users/[^:]+}:setIamPolicy", rest.HandleSetIamPolicy).Methods("POST")
router.HandleFunc("/v1beta1/{resource:rooms/[^:]+}:setIamPolicy", rest.HandleSetIamPolicy_1).Methods("POST")
router.HandleFunc("/v1beta1/{resource:rooms/[^:]+/blurbs/[^:]+}:setIamPolicy", rest.HandleSetIamPolicy_2).Methods("POST")
router.HandleFunc("/v1beta1/{resource:sequences/[^:]+}:setIamPolicy", rest.HandleSetIamPolicy_3).Methods("POST")
router.HandleFunc("/v1beta1/{resource:users/[^:]+}:getIamPolicy", rest.HandleGetIamPolicy).Methods("GET")
router.HandleFunc("/v1beta1/{resource:rooms/[^:]+}:getIamPolicy", rest.HandleGetIamPolicy_1).Methods("GET")
router.HandleFunc("/v1beta1/{resource:rooms/[^:]+/blurbs/[^:]+}:getIamPolicy", rest.HandleGetIamPolicy_2).Methods("GET")
router.HandleFunc("/v1beta1/{resource:sequences/[^:]+}:getIamPolicy", rest.HandleGetIamPolicy_3).Methods("GET")
router.HandleFunc("/v1beta1/{resource:users/[^:]+}:testIamPermissions", rest.HandleTestIamPermissions).Methods("POST")
router.HandleFunc("/v1beta1/{resource:rooms/[^:]+}:testIamPermissions", rest.HandleTestIamPermissions_1).Methods("POST")
router.HandleFunc("/v1beta1/{resource:rooms/[^:]+/blurbs/[^:]+}:testIamPermissions", rest.HandleTestIamPermissions_2).Methods("POST")
router.HandleFunc("/v1beta1/{resource:sequences/[^:]+}:testIamPermissions", rest.HandleTestIamPermissions_3).Methods("POST")
router.HandleFunc("/v1beta1/operations", rest.HandleListOperations).Methods("GET")
router.HandleFunc("/v1beta1/{name:operations/.+}", rest.HandleGetOperation).Methods("GET")
router.HandleFunc("/v1beta1/{name:operations/.+}", rest.HandleDeleteOperation).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:operations/.+}:cancel", rest.HandleCancelOperation).Methods("POST")
router.HandleFunc("/v1beta1/{name:operations/[^:]+}", rest.HandleGetOperation).Methods("GET")
router.HandleFunc("/v1beta1/{name:operations/[^:]+}", rest.HandleDeleteOperation).Methods("DELETE")
router.HandleFunc("/v1beta1/{name:operations/[^:]+}:cancel", rest.HandleCancelOperation).Methods("POST")
router.PathPrefix("/").HandlerFunc(rest.catchAllHandler)
}

Expand Down
2 changes: 1 addition & 1 deletion util/genrest/goviewcreator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func TestMatchingPath(t *testing.T) {
},
{
template: "/aa/{bb}/cc/{dd=ee/*/gg}/{hh=ii/jj/*/kk/**}",
expectMatch: "/aa/{bb:.+}/cc/{dd:ee/.+/gg}/{hh:ii/jj/.+/kk/.+}",
expectMatch: "/aa/{bb:[^:]+}/cc/{dd:ee/[^:]+/gg}/{hh:ii/jj/[^:]+/kk/[^:]+}",
expectVars: []string{"bb", "dd", "hh"},
},
} {
Expand Down
4 changes: 2 additions & 2 deletions util/genrest/resttools/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ const (
// RegexURLPathSingleSegmentValue contains the regex expression for matching a single URL
// path segment (i.e. `/` is not allowed). Since gorilla/mux hands uses the decoded paths to
// match, we can just accept any characters.
RegexURLPathSingleSegmentValue = ".+"
RegexURLPathSingleSegmentValue = "[^:]+"

// RegexURLPathSingleSegmentValue contains the regex expression for matching multiple URL
// path segments (i.e. `/` is allowed). Since gorilla/mux hands uses the decoded paths to
// match, we can just accept any characters.
RegexURLPathMultipleSegmentValue = ".+"
RegexURLPathMultipleSegmentValue = "[^:]+"
)

var (
Expand Down

0 comments on commit 4110fee

Please sign in to comment.