From 4110fee63a22f8d32cae7f8ba318919bee94e752 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 5 Jul 2023 13:52:59 -0400 Subject: [PATCH] fix: Update HttpJson regex for URL paths (#1340) * fix: Use specifc regex for matching URL path * fix: Use specifc regex for matching URL path * fix: Update test * fix: Fix regex --- server/genrest/genrest.go | 114 ++++++++++++++-------------- util/genrest/goviewcreator_test.go | 2 +- util/genrest/resttools/constants.go | 4 +- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/server/genrest/genrest.go b/server/genrest/genrest.go index e2c828720..6f852ca53 100644 --- a/server/genrest/genrest.go +++ b/server/genrest/genrest.go @@ -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") @@ -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) } diff --git a/util/genrest/goviewcreator_test.go b/util/genrest/goviewcreator_test.go index 2051aa180..7e8109475 100644 --- a/util/genrest/goviewcreator_test.go +++ b/util/genrest/goviewcreator_test.go @@ -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"}, }, } { diff --git a/util/genrest/resttools/constants.go b/util/genrest/resttools/constants.go index b1e8d5211..65421dad9 100644 --- a/util/genrest/resttools/constants.go +++ b/util/genrest/resttools/constants.go @@ -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 (