@@ -46,6 +46,38 @@ class SimpleRedirectResolver implements IUriResolver<Error> {
4646 }
4747}
4848
49+ class InfiniteRedirectResolver implements IUriResolver < Error > {
50+ async tryResolveUri (
51+ uri : Uri ,
52+ client : CoreClient ,
53+ resolutionContext : IUriResolutionContext
54+ ) : Promise < Result < UriPackageOrWrapper , Error > > {
55+ let result : Result < UriPackageOrWrapper , Error > ;
56+
57+ switch ( uri . uri ) {
58+ case "wrap://test/1" :
59+ result = UriResolutionResult . ok ( Uri . from ( "test/2" ) ) ;
60+ break ;
61+ case "wrap://test/2" :
62+ result = UriResolutionResult . ok ( Uri . from ( "test/3" ) ) ;
63+ break ;
64+ case "wrap://test/3" :
65+ result = UriResolutionResult . ok ( Uri . from ( "test/1" ) ) ;
66+ break ;
67+ default :
68+ result = UriResolutionResult . ok ( uri ) ;
69+ }
70+
71+ resolutionContext . trackStep ( {
72+ sourceUri : uri ,
73+ result,
74+ description : "InfiniteRedirectResolver" ,
75+ } ) ;
76+
77+ return result ;
78+ }
79+ }
80+
4981describe ( "RecursiveResolver" , ( ) => {
5082 it ( "can recursively resolve a URI" , async ( ) => {
5183 const uri = new Uri ( "test/1" ) ;
@@ -100,4 +132,28 @@ describe("RecursiveResolver", () => {
100132
101133 expect ( result . value . uri . uri ) . toEqual ( "wrap://test/not-a-match" ) ;
102134 } ) ;
135+
136+ it ( "should raise an error if infinite loop detected during URI Resolution" , async ( ) => {
137+ const uri = new Uri ( "test/1" ) ;
138+
139+ const client = new PolywrapCoreClient ( {
140+ resolver : RecursiveResolver . from ( new InfiniteRedirectResolver ( ) ) ,
141+ } ) ;
142+
143+ let resolutionContext = new UriResolutionContext ( ) ;
144+ let result = await client . tryResolveUri ( { uri, resolutionContext } ) ;
145+
146+ await expectHistory (
147+ resolutionContext . getHistory ( ) ,
148+ "recursive-resolver" ,
149+ "infinite-loop"
150+ ) ;
151+
152+ if ( result . ok ) {
153+ fail ( `Expected an error got value: ${ result . value } ` ) ;
154+ }
155+
156+ // @ts -ignore
157+ expect ( result . error ! . message ) . toMatch ( "An infinite loop was detected while resolving the URI: wrap://test/1" ) ;
158+ } )
103159} ) ;
0 commit comments