1313from dateutil import parser as dateparser
1414from django .utils .dateparse import parse_datetime
1515
16+ from vulnerabilities .helpers import get_item
1617from vulnerabilities .package_managers import VersionResponse
1718
1819LOGGER = logging .getLogger (__name__ )
@@ -31,7 +32,11 @@ class VersionResponse:
3132
3233
3334def get_response (url , type = "json" ):
34- resp = requests .get (url = url )
35+ try :
36+ resp = requests .get (url = url )
37+ except :
38+ LOGGER .error (traceback .format_exc ())
39+ return None
3540 if not resp .status_code == 200 :
3641 LOGGER .error (f"Error while fetching { url } : { resp .status_code } " )
3742 return None
@@ -86,14 +91,12 @@ def fetch(self, pkg):
8691 self .cache [pkg ] = versions
8792 return
8893
89- for version , download_items in response [ "releases" ] .items () or {}:
94+ for version , download_items in response . get ( "releases" ) .items () or {}:
9095 if download_items :
9196 latest_download_item = max (
9297 download_items ,
9398 key = lambda download_item : dateparser .parse (
94- download_item ["upload_time_iso_8601" ]
95- if "upload_time_iso_8601" in download_item
96- else LOGGER .error (f"{ download_item } has no upload_time_iso_8601" )
99+ download_item .get ("upload_time_iso_8601" )
97100 ),
98101 )
99102 versions .add (
@@ -117,8 +120,12 @@ def fetch(self, pkg):
117120 self .cache [pkg ] = versions
118121 return
119122 for release in response :
120- if release ["number" ] and release ["published_at" ]:
123+ release_date = None
124+ if release .get ("published_at" ):
121125 release_date = dateparser .parse (release ["published_at" ])
126+ elif release .get ("created_at" ):
127+ release_date = dateparser .parse (release ["created_at" ])
128+ if release .get ("number" ):
122129 versions .add (LegacyVersion (value = release ["number" ], release_date = release_date ))
123130 else :
124131 LOGGER .error (f"Failed to parse release { release } " )
@@ -196,9 +203,9 @@ def nuget_url(pkg_name: str) -> str:
196203 @staticmethod
197204 def extract_versions (resp : dict ) -> Set [LegacyVersion ]:
198205 all_versions = set ()
199- for entry_group in resp [ "items" ] or []:
200- for entry in entry_group [ "items" ] or []:
201- catalog_entry = entry [ "catalogEntry" ] or {}
206+ for entry_group in resp . get ( "items" ) or []:
207+ for entry in entry_group . get ( "items" ) or []:
208+ catalog_entry = entry . get ( "catalogEntry" ) or {}
202209 version = catalog_entry .get ("version" )
203210 release_date = dateparser .parse (catalog_entry .get ("published" ))
204211 if version and release_date :
@@ -345,7 +352,7 @@ def composer_url(pkg_name: str) -> Optional[str]:
345352 @staticmethod
346353 def extract_versions (resp : dict , pkg_name : str ) -> Set [LegacyVersion ]:
347354 all_versions = set ()
348- for version in resp [ "packages" ][ pkg_name ] :
355+ for version in get_item ( resp , "packages" , pkg_name ) :
349356 if "dev" in version :
350357 continue
351358
@@ -355,7 +362,9 @@ def extract_versions(resp: dict, pkg_name: str) -> Set[LegacyVersion]:
355362 all_versions .add (
356363 LegacyVersion (
357364 value = version .lstrip ("v" ),
358- release_date = dateparser .parse (resp ["packages" ][pkg_name ][version ]["time" ]),
365+ release_date = dateparser .parse (
366+ get_item (resp , "packages" , pkg_name , version , "time" )
367+ ),
359368 )
360369 )
361370 return all_versions
0 commit comments