@@ -582,20 +582,45 @@ func (m *multiHandlerTransport) RoundTrip(req *http.Request) (*http.Response, er
582582return executeHandler (handler ,req ),nil
583583}
584584
585- // Then try pattern matching
585+ // Then try pattern matching, prioritizing patterns without wildcards
586+ // This is important because wildcard patterns like /{owner}/{repo}/{sha}/{path:.*}
587+ // can incorrectly match API paths like /repos/owner/repo/pulls/42
588+ var wildcardPattern string
589+ var wildcardHandler http.HandlerFunc
590+
586591for pattern ,handler := range m .handlers {
587592if pattern == "" {
588593continue // Skip catch-all
589594}
590595parts := strings .SplitN (pattern ," " ,2 )
591- if len (parts )== 2 {
592- method ,pathPattern := parts [0 ],parts [1 ]
593- if req .Method == method && matchPath (pathPattern ,req .URL .Path ) {
596+ if len (parts )!= 2 {
597+ continue
598+ }
599+ method ,pathPattern := parts [0 ],parts [1 ]
600+ if req .Method != method {
601+ continue
602+ }
603+
604+ // Check if this pattern contains a wildcard like {path:.*}
605+ isWildcard := strings .Contains (pathPattern ,":.*}" )
606+
607+ if matchPath (pathPattern ,req .URL .Path ) {
608+ if isWildcard {
609+ // Save wildcard match for later, prefer non-wildcard patterns
610+ wildcardPattern = pattern
611+ wildcardHandler = handler
612+ }else {
613+ // Non-wildcard pattern takes priority
594614return executeHandler (handler ,req ),nil
595615}
596616}
597617}
598618
619+ // If we found a wildcard match but no specific match, use it
620+ if wildcardPattern != "" && wildcardHandler != nil {
621+ return executeHandler (wildcardHandler ,req ),nil
622+ }
623+
599624// No handler found
600625return & http.Response {
601626StatusCode :http .StatusNotFound ,