1212import requests
1313from dateutil import parser as dateparser
1414from django .utils .dateparse import parse_datetime
15+ from vulnerabilities .helpers import get_item
1516
1617from vulnerabilities .package_managers import VersionResponse
1718
@@ -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,15 +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" )
97- ),
99+ download_item .get ("upload_time_iso_8601" )),
98100 )
99101 versions .add (
100102 LegacyVersion (
@@ -117,8 +119,12 @@ def fetch(self, pkg):
117119 self .cache [pkg ] = versions
118120 return
119121 for release in response :
120- if release ["number" ] and release ["published_at" ]:
122+ release_date = None
123+ if release .get ("published_at" ):
121124 release_date = dateparser .parse (release ["published_at" ])
125+ elif release .get ("created_at" ):
126+ release_date = dateparser .parse (release ["created_at" ])
127+ if release .get ("number" ):
122128 versions .add (LegacyVersion (value = release ["number" ], release_date = release_date ))
123129 else :
124130 LOGGER .error (f"Failed to parse release { release } " )
@@ -196,9 +202,9 @@ def nuget_url(pkg_name: str) -> str:
196202 @staticmethod
197203 def extract_versions (resp : dict ) -> Set [LegacyVersion ]:
198204 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 {}
205+ for entry_group in resp . get ( "items" ) or []:
206+ for entry in entry_group . get ( "items" ) or []:
207+ catalog_entry = entry . get ( "catalogEntry" ) or {}
202208 version = catalog_entry .get ("version" )
203209 release_date = dateparser .parse (catalog_entry .get ("published" ))
204210 if version and release_date :
@@ -345,7 +351,7 @@ def composer_url(pkg_name: str) -> Optional[str]:
345351 @staticmethod
346352 def extract_versions (resp : dict , pkg_name : str ) -> Set [LegacyVersion ]:
347353 all_versions = set ()
348- for version in resp [ "packages" ][ pkg_name ] :
354+ for version in get_item ( resp , "packages" , pkg_name ) :
349355 if "dev" in version :
350356 continue
351357
@@ -355,7 +361,7 @@ def extract_versions(resp: dict, pkg_name: str) -> Set[LegacyVersion]:
355361 all_versions .add (
356362 LegacyVersion (
357363 value = version .lstrip ("v" ),
358- release_date = dateparser .parse (resp [ "packages" ][ pkg_name ][ version ][ "time" ] ),
364+ release_date = dateparser .parse (get_item ( resp , "packages" , pkg_name , version , "time" ) ),
359365 )
360366 )
361367 return all_versions
0 commit comments