From 0a3996fa93e271e0a91185644121da3f624a4dd9 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 23 Jun 2023 14:48:57 -0400 Subject: [PATCH 1/4] fix: Use specifc regex for matching URL path --- server/genrest/genrest.go | 114 ++++++++++++++-------------- util/genrest/resttools/constants.go | 4 +- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/server/genrest/genrest.go b/server/genrest/genrest.go index e2c828720..6959649bf 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:[a-zA-Z0-9_\\-]+}/{info.fInt32:[a-zA-Z0-9_\\-]+}/{info.fDouble:[a-zA-Z0-9_\\-]+}/{info.fBool:[a-zA-Z0-9_\\-]+}/{info.fKingdom:[a-zA-Z0-9_\\-]+}:simplepath", rest.HandleRepeatDataSimplePath).Methods("GET") + router.HandleFunc("/v1beta1/repeat/{info.fString:first/[a-zA-Z0-9_\\-]+}/{info.fChild.fString:second/[a-zA-Z0-9_\\-]+}/bool/{info.fBool:[a-zA-Z0-9_\\-]+}:pathresource", rest.HandleRepeatDataPathResource).Methods("GET") + router.HandleFunc("/v1beta1/repeat/{info.fChild.fString:first/[a-zA-Z0-9_\\-]+}/{info.fString:second/[a-zA-Z0-9_\\-]+}/bool/{info.fBool:[a-zA-Z0-9_\\-]+}:childfirstpathresource", rest.HandleRepeatDataPathResource_1).Methods("GET") + router.HandleFunc("/v1beta1/repeat/{info.fString:first/[a-zA-Z0-9_\\-]+}/{info.fChild.fString:second/[a-zA-Z0-9_\\-\\/]+}: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/[a-zA-Z0-9_\\-]+}", rest.HandleGetUser).Methods("GET") + router.HandleFunc("/v1beta1/{user.name:users/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateUser).Methods("PATCH") + router.HandleFunc("/v1beta1/{user.name:users/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateUser).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST") + router.HandleFunc("/v1beta1/{name:users/[a-zA-Z0-9_\\-]+}", 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/[a-zA-Z0-9_\\-]+}", rest.HandleGetRoom).Methods("GET") + router.HandleFunc("/v1beta1/{room.name:rooms/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateRoom).Methods("PATCH") + router.HandleFunc("/v1beta1/{room.name:rooms/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateRoom).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST") + router.HandleFunc("/v1beta1/{name:rooms/[a-zA-Z0-9_\\-]+}", 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/[a-zA-Z0-9_\\-]+}/blurbs", rest.HandleCreateBlurb).Methods("POST") + router.HandleFunc("/v1beta1/{parent:users/[a-zA-Z0-9_\\-]+/profile}/blurbs", rest.HandleCreateBlurb_1).Methods("POST") + router.HandleFunc("/v1beta1/{name:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleGetBlurb).Methods("GET") + router.HandleFunc("/v1beta1/{name:users/[a-zA-Z0-9_\\-]+/profile/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleGetBlurb_1).Methods("GET") + router.HandleFunc("/v1beta1/{blurb.name:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateBlurb).Methods("PATCH") + router.HandleFunc("/v1beta1/{blurb.name:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateBlurb).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST") + router.HandleFunc("/v1beta1/{blurb.name:users/[a-zA-Z0-9_\\-]+/profile/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateBlurb_1).Methods("PATCH") + router.HandleFunc("/v1beta1/{blurb.name:users/[a-zA-Z0-9_\\-]+/profile/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateBlurb_1).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST") + router.HandleFunc("/v1beta1/{name:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleDeleteBlurb).Methods("DELETE") + router.HandleFunc("/v1beta1/{name:users/[a-zA-Z0-9_\\-]+/profile/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleDeleteBlurb_1).Methods("DELETE") + router.HandleFunc("/v1beta1/{parent:rooms/[a-zA-Z0-9_\\-]+}/blurbs", rest.HandleListBlurbs).Methods("GET") + router.HandleFunc("/v1beta1/{parent:users/[a-zA-Z0-9_\\-]+/profile}/blurbs", rest.HandleListBlurbs_1).Methods("GET") + router.HandleFunc("/v1beta1/{parent:rooms/[a-zA-Z0-9_\\-]+}/blurbs:search", rest.HandleSearchBlurbs).Methods("POST") + router.HandleFunc("/v1beta1/{parent:users/[a-zA-Z0-9_\\-]+/profile}/blurbs:search", rest.HandleSearchBlurbs_1).Methods("POST") + router.HandleFunc("/v1beta1/{name:rooms/[a-zA-Z0-9_\\-]+}/blurbs:stream", rest.HandleStreamBlurbs).Methods("POST") + router.HandleFunc("/v1beta1/{name:users/[a-zA-Z0-9_\\-]+/profile}/blurbs:stream", rest.HandleStreamBlurbs_1).Methods("POST") + router.HandleFunc("/v1beta1/{parent:rooms/[a-zA-Z0-9_\\-]+}/blurbs:send", rest.HandleSendBlurbs).Methods("POST") + router.HandleFunc("/v1beta1/{parent:users/[a-zA-Z0-9_\\-]+/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/[a-zA-Z0-9_\\-]+/sequenceReport}", rest.HandleGetSequenceReport).Methods("GET") + router.HandleFunc("/v1beta1/{name:streamingSequences/[a-zA-Z0-9_\\-]+/streamingSequenceReport}", rest.HandleGetStreamingSequenceReport).Methods("GET") + router.HandleFunc("/v1beta1/{name:sequences/[a-zA-Z0-9_\\-]+}", rest.HandleAttemptSequence).Methods("POST") + router.HandleFunc("/v1beta1/{name:streamingSequences/[a-zA-Z0-9_\\-]+}: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/[a-zA-Z0-9_\\-]+}", 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/[a-zA-Z0-9_\\-]+}", rest.HandleDeleteSession).Methods("DELETE") + router.HandleFunc("/v1beta1/{name:sessions/[a-zA-Z0-9_\\-]+}:report", rest.HandleReportSession).Methods("POST") + router.HandleFunc("/v1beta1/{parent:sessions/[a-zA-Z0-9_\\-]+}/tests", rest.HandleListTests).Methods("GET") + router.HandleFunc("/v1beta1/{name:sessions/[a-zA-Z0-9_\\-]+/tests/[a-zA-Z0-9_\\-]+}", rest.HandleDeleteTest).Methods("DELETE") + router.HandleFunc("/v1beta1/{name:sessions/[a-zA-Z0-9_\\-]+/tests/[a-zA-Z0-9_\\-]+}:check", rest.HandleVerifyTest).Methods("POST") + router.HandleFunc("/v1beta1/{name:projects/[a-zA-Z0-9_\\-]+}/locations", rest.HandleListLocations).Methods("GET") + router.HandleFunc("/v1beta1/{name:projects/[a-zA-Z0-9_\\-]+/locations/[a-zA-Z0-9_\\-]+}", rest.HandleGetLocation).Methods("GET") + router.HandleFunc("/v1beta1/{resource:users/[a-zA-Z0-9_\\-]+}:setIamPolicy", rest.HandleSetIamPolicy).Methods("POST") + router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+}:setIamPolicy", rest.HandleSetIamPolicy_1).Methods("POST") + router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}:setIamPolicy", rest.HandleSetIamPolicy_2).Methods("POST") + router.HandleFunc("/v1beta1/{resource:sequences/[a-zA-Z0-9_\\-]+}:setIamPolicy", rest.HandleSetIamPolicy_3).Methods("POST") + router.HandleFunc("/v1beta1/{resource:users/[a-zA-Z0-9_\\-]+}:getIamPolicy", rest.HandleGetIamPolicy).Methods("GET") + router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+}:getIamPolicy", rest.HandleGetIamPolicy_1).Methods("GET") + router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}:getIamPolicy", rest.HandleGetIamPolicy_2).Methods("GET") + router.HandleFunc("/v1beta1/{resource:sequences/[a-zA-Z0-9_\\-]+}:getIamPolicy", rest.HandleGetIamPolicy_3).Methods("GET") + router.HandleFunc("/v1beta1/{resource:users/[a-zA-Z0-9_\\-]+}:testIamPermissions", rest.HandleTestIamPermissions).Methods("POST") + router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+}:testIamPermissions", rest.HandleTestIamPermissions_1).Methods("POST") + router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}:testIamPermissions", rest.HandleTestIamPermissions_2).Methods("POST") + router.HandleFunc("/v1beta1/{resource:sequences/[a-zA-Z0-9_\\-]+}: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/[a-zA-Z0-9_\\-\\/]+}", rest.HandleGetOperation).Methods("GET") + router.HandleFunc("/v1beta1/{name:operations/[a-zA-Z0-9_\\-\\/]+}", rest.HandleDeleteOperation).Methods("DELETE") + router.HandleFunc("/v1beta1/{name:operations/[a-zA-Z0-9_\\-\\/]+}:cancel", rest.HandleCancelOperation).Methods("POST") router.PathPrefix("/").HandlerFunc(rest.catchAllHandler) } diff --git a/util/genrest/resttools/constants.go b/util/genrest/resttools/constants.go index b1e8d5211..577013ea9 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 = "[a-zA-Z0-9_\\-]+" // 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 = "[a-zA-Z0-9_\\-\\/]+" ) var ( From 98e9b0a64281c1c9971c87aa482f24989f2b4db2 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 26 Jun 2023 10:45:55 -0400 Subject: [PATCH 2/4] fix: Use specifc regex for matching URL path --- server/genrest/genrest.go | 114 ++++++++++++++-------------- util/genrest/resttools/constants.go | 4 +- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/server/genrest/genrest.go b/server/genrest/genrest.go index 6959649bf..24849e671 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:[a-zA-Z0-9_\\-]+}/{info.fInt32:[a-zA-Z0-9_\\-]+}/{info.fDouble:[a-zA-Z0-9_\\-]+}/{info.fBool:[a-zA-Z0-9_\\-]+}/{info.fKingdom:[a-zA-Z0-9_\\-]+}:simplepath", rest.HandleRepeatDataSimplePath).Methods("GET") - router.HandleFunc("/v1beta1/repeat/{info.fString:first/[a-zA-Z0-9_\\-]+}/{info.fChild.fString:second/[a-zA-Z0-9_\\-]+}/bool/{info.fBool:[a-zA-Z0-9_\\-]+}:pathresource", rest.HandleRepeatDataPathResource).Methods("GET") - router.HandleFunc("/v1beta1/repeat/{info.fChild.fString:first/[a-zA-Z0-9_\\-]+}/{info.fString:second/[a-zA-Z0-9_\\-]+}/bool/{info.fBool:[a-zA-Z0-9_\\-]+}:childfirstpathresource", rest.HandleRepeatDataPathResource_1).Methods("GET") - router.HandleFunc("/v1beta1/repeat/{info.fString:first/[a-zA-Z0-9_\\-]+}/{info.fChild.fString:second/[a-zA-Z0-9_\\-\\/]+}: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/[a-zA-Z0-9_\\-]+}", rest.HandleGetUser).Methods("GET") - router.HandleFunc("/v1beta1/{user.name:users/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateUser).Methods("PATCH") - router.HandleFunc("/v1beta1/{user.name:users/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateUser).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST") - router.HandleFunc("/v1beta1/{name:users/[a-zA-Z0-9_\\-]+}", 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/[a-zA-Z0-9_\\-]+}", rest.HandleGetRoom).Methods("GET") - router.HandleFunc("/v1beta1/{room.name:rooms/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateRoom).Methods("PATCH") - router.HandleFunc("/v1beta1/{room.name:rooms/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateRoom).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST") - router.HandleFunc("/v1beta1/{name:rooms/[a-zA-Z0-9_\\-]+}", 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/[a-zA-Z0-9_\\-]+}/blurbs", rest.HandleCreateBlurb).Methods("POST") - router.HandleFunc("/v1beta1/{parent:users/[a-zA-Z0-9_\\-]+/profile}/blurbs", rest.HandleCreateBlurb_1).Methods("POST") - router.HandleFunc("/v1beta1/{name:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleGetBlurb).Methods("GET") - router.HandleFunc("/v1beta1/{name:users/[a-zA-Z0-9_\\-]+/profile/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleGetBlurb_1).Methods("GET") - router.HandleFunc("/v1beta1/{blurb.name:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateBlurb).Methods("PATCH") - router.HandleFunc("/v1beta1/{blurb.name:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateBlurb).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST") - router.HandleFunc("/v1beta1/{blurb.name:users/[a-zA-Z0-9_\\-]+/profile/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateBlurb_1).Methods("PATCH") - router.HandleFunc("/v1beta1/{blurb.name:users/[a-zA-Z0-9_\\-]+/profile/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleUpdateBlurb_1).HeadersRegexp("X-HTTP-Method-Override", "^PATCH$").Methods("POST") - router.HandleFunc("/v1beta1/{name:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleDeleteBlurb).Methods("DELETE") - router.HandleFunc("/v1beta1/{name:users/[a-zA-Z0-9_\\-]+/profile/blurbs/[a-zA-Z0-9_\\-]+}", rest.HandleDeleteBlurb_1).Methods("DELETE") - router.HandleFunc("/v1beta1/{parent:rooms/[a-zA-Z0-9_\\-]+}/blurbs", rest.HandleListBlurbs).Methods("GET") - router.HandleFunc("/v1beta1/{parent:users/[a-zA-Z0-9_\\-]+/profile}/blurbs", rest.HandleListBlurbs_1).Methods("GET") - router.HandleFunc("/v1beta1/{parent:rooms/[a-zA-Z0-9_\\-]+}/blurbs:search", rest.HandleSearchBlurbs).Methods("POST") - router.HandleFunc("/v1beta1/{parent:users/[a-zA-Z0-9_\\-]+/profile}/blurbs:search", rest.HandleSearchBlurbs_1).Methods("POST") - router.HandleFunc("/v1beta1/{name:rooms/[a-zA-Z0-9_\\-]+}/blurbs:stream", rest.HandleStreamBlurbs).Methods("POST") - router.HandleFunc("/v1beta1/{name:users/[a-zA-Z0-9_\\-]+/profile}/blurbs:stream", rest.HandleStreamBlurbs_1).Methods("POST") - router.HandleFunc("/v1beta1/{parent:rooms/[a-zA-Z0-9_\\-]+}/blurbs:send", rest.HandleSendBlurbs).Methods("POST") - router.HandleFunc("/v1beta1/{parent:users/[a-zA-Z0-9_\\-]+/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/[a-zA-Z0-9_\\-]+/sequenceReport}", rest.HandleGetSequenceReport).Methods("GET") - router.HandleFunc("/v1beta1/{name:streamingSequences/[a-zA-Z0-9_\\-]+/streamingSequenceReport}", rest.HandleGetStreamingSequenceReport).Methods("GET") - router.HandleFunc("/v1beta1/{name:sequences/[a-zA-Z0-9_\\-]+}", rest.HandleAttemptSequence).Methods("POST") - router.HandleFunc("/v1beta1/{name:streamingSequences/[a-zA-Z0-9_\\-]+}: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/[a-zA-Z0-9_\\-]+}", 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/[a-zA-Z0-9_\\-]+}", rest.HandleDeleteSession).Methods("DELETE") - router.HandleFunc("/v1beta1/{name:sessions/[a-zA-Z0-9_\\-]+}:report", rest.HandleReportSession).Methods("POST") - router.HandleFunc("/v1beta1/{parent:sessions/[a-zA-Z0-9_\\-]+}/tests", rest.HandleListTests).Methods("GET") - router.HandleFunc("/v1beta1/{name:sessions/[a-zA-Z0-9_\\-]+/tests/[a-zA-Z0-9_\\-]+}", rest.HandleDeleteTest).Methods("DELETE") - router.HandleFunc("/v1beta1/{name:sessions/[a-zA-Z0-9_\\-]+/tests/[a-zA-Z0-9_\\-]+}:check", rest.HandleVerifyTest).Methods("POST") - router.HandleFunc("/v1beta1/{name:projects/[a-zA-Z0-9_\\-]+}/locations", rest.HandleListLocations).Methods("GET") - router.HandleFunc("/v1beta1/{name:projects/[a-zA-Z0-9_\\-]+/locations/[a-zA-Z0-9_\\-]+}", rest.HandleGetLocation).Methods("GET") - router.HandleFunc("/v1beta1/{resource:users/[a-zA-Z0-9_\\-]+}:setIamPolicy", rest.HandleSetIamPolicy).Methods("POST") - router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+}:setIamPolicy", rest.HandleSetIamPolicy_1).Methods("POST") - router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}:setIamPolicy", rest.HandleSetIamPolicy_2).Methods("POST") - router.HandleFunc("/v1beta1/{resource:sequences/[a-zA-Z0-9_\\-]+}:setIamPolicy", rest.HandleSetIamPolicy_3).Methods("POST") - router.HandleFunc("/v1beta1/{resource:users/[a-zA-Z0-9_\\-]+}:getIamPolicy", rest.HandleGetIamPolicy).Methods("GET") - router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+}:getIamPolicy", rest.HandleGetIamPolicy_1).Methods("GET") - router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}:getIamPolicy", rest.HandleGetIamPolicy_2).Methods("GET") - router.HandleFunc("/v1beta1/{resource:sequences/[a-zA-Z0-9_\\-]+}:getIamPolicy", rest.HandleGetIamPolicy_3).Methods("GET") - router.HandleFunc("/v1beta1/{resource:users/[a-zA-Z0-9_\\-]+}:testIamPermissions", rest.HandleTestIamPermissions).Methods("POST") - router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+}:testIamPermissions", rest.HandleTestIamPermissions_1).Methods("POST") - router.HandleFunc("/v1beta1/{resource:rooms/[a-zA-Z0-9_\\-]+/blurbs/[a-zA-Z0-9_\\-]+}:testIamPermissions", rest.HandleTestIamPermissions_2).Methods("POST") - router.HandleFunc("/v1beta1/{resource:sequences/[a-zA-Z0-9_\\-]+}: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/[a-zA-Z0-9_\\-\\/]+}", rest.HandleGetOperation).Methods("GET") - router.HandleFunc("/v1beta1/{name:operations/[a-zA-Z0-9_\\-\\/]+}", rest.HandleDeleteOperation).Methods("DELETE") - router.HandleFunc("/v1beta1/{name:operations/[a-zA-Z0-9_\\-\\/]+}: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/resttools/constants.go b/util/genrest/resttools/constants.go index 577013ea9..c3342f85d 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 = "[a-zA-Z0-9_\\-]+" + 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 = "[a-zA-Z0-9_\\-\\/]+" + RegexURLPathMultipleSegmentValue = "[^:]+" ) var ( From cb5b6703eece6e4e492a8cf5b6bf6a59c0d2cf8d Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 26 Jun 2023 11:07:08 -0400 Subject: [PATCH 3/4] fix: Update test --- util/genrest/goviewcreator_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/genrest/goviewcreator_test.go b/util/genrest/goviewcreator_test.go index 2051aa180..c293ad59e 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"}, }, } { From b8994dd431dda502590cf10112c87f1f1293f3ec Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 26 Jun 2023 11:34:45 -0400 Subject: [PATCH 4/4] fix: Fix regex --- server/genrest/genrest.go | 108 ++++++++++++++-------------- util/genrest/goviewcreator_test.go | 2 +- util/genrest/resttools/constants.go | 2 +- 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/server/genrest/genrest.go b/server/genrest/genrest.go index 24849e671..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,63 +53,63 @@ 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") diff --git a/util/genrest/goviewcreator_test.go b/util/genrest/goviewcreator_test.go index c293ad59e..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 c3342f85d..65421dad9 100644 --- a/util/genrest/resttools/constants.go +++ b/util/genrest/resttools/constants.go @@ -26,7 +26,7 @@ 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