@@ -18,6 +18,33 @@ const userAgent = `octokit-request.js/0.0.0-development ${getUserAgent()}`;
1818const stringToArrayBuffer = require ( "string-to-arraybuffer" ) ;
1919
2020describe ( "request()" , ( ) => {
21+ it ( "Test ReDoS - attack string" , ( ) => {
22+ const fakeFetch = async ( url : string , options ?: RequestInit ) => {
23+ const response = await fetch ( url , options ) ;
24+ const fakeHeaders = new Headers ( response . headers ) ;
25+ fakeHeaders . set ( "link" , "<" . repeat ( 100000 ) + ">" ) ;
26+ fakeHeaders . set ( "deprecation" , "true" ) ;
27+ return new Response ( response . body , {
28+ status : response . status ,
29+ statusText : response . statusText ,
30+ headers : fakeHeaders ,
31+ } ) ;
32+ } ;
33+ const startTime = performance . now ( ) ;
34+ request ( "GET /repos/octocat/hello-world" , {
35+ request : { fetch : fakeFetch } ,
36+ } ) ;
37+ const endTime = performance . now ( ) ;
38+ const elapsedTime = endTime - startTime ;
39+ const reDosThreshold = 2000 ;
40+ expect ( elapsedTime ) . toBeLessThanOrEqual ( reDosThreshold ) ;
41+ if ( elapsedTime > reDosThreshold ) {
42+ console . warn (
43+ `🚨 Potential ReDoS Attack! getDuration method took ${ elapsedTime . toFixed ( 2 ) } ms, exceeding threshold of ${ reDosThreshold } ms.` ,
44+ ) ;
45+ }
46+ } ) ;
47+
2148 it ( "is a function" , ( ) => {
2249 expect ( request ) . toBeInstanceOf ( Function ) ;
2350 } ) ;
0 commit comments