Skip to content

Commit 7c1afbf

Browse files
Fix 500 error with malformed POM
1 parent 891ce72 commit 7c1afbf

2 files changed

Lines changed: 45 additions & 4 deletions

File tree

minecode/collectors/maven.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,11 @@ def fetch_parent(pom_text, base_url=MAVEN_BASE_URL):
163163
"""Return the parent pom text of `pom_text`, or None if `pom_text` has no parent."""
164164
if not pom_text:
165165
return
166-
pom = get_maven_pom(text=pom_text)
166+
try:
167+
pom = get_maven_pom(text=pom_text)
168+
except Exception as e:
169+
logger.error(f"Failed to parse POM text: {e}")
170+
return
167171
if pom.parent and pom.parent.group_id and pom.parent.artifact_id and pom.parent.version.version:
168172
parent_namespace = pom.parent.group_id
169173
parent_name = pom.parent.artifact_id
@@ -289,14 +293,19 @@ def map_maven_package(package_url, package_content, pipelines, priority=0, reind
289293
error += msg + "\n"
290294
logger.error(msg)
291295
return db_package, error
292-
293-
package = _parse(
296+
try:
297+
package = _parse(
294298
"maven_pom",
295299
"maven",
296300
"Java",
297301
text=pom_text,
298302
base_url=base_url,
299-
)
303+
)
304+
except Exception as e:
305+
msg = f"Failed to parse POM for {package_url}: {e}"
306+
error += msg + "\n"
307+
logger.error(msg)
308+
return db_package, error
300309
ancestor_pom_texts = get_ancestry(pom_text=pom_text, base_url=base_url)
301310
package = merge_ancestors(ancestor_pom_texts=ancestor_pom_texts, package=package)
302311

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from unittest.mock import patch
2+
from django.test import TestCase
3+
from minecode.collectors.maven import fetch_parent, map_maven_package
4+
from packageurl import PackageURL
5+
6+
class TestIssue197MavenMalformedPom(TestCase):
7+
def test_fetch_parent_with_malformed_pom_does_not_crash(self):
8+
with patch(
9+
"minecode.collectors.maven.get_maven_pom",
10+
side_effect=Exception("VersionRangeParseError: Unbounded range: [9"),
11+
):
12+
result = fetch_parent(pom_text="<project></project>")
13+
self.assertIsNone(result)
14+
def test_map_maven_package_with_malformed_pom_does_not_crash(self):
15+
with patch(
16+
"minecode.collectors.maven.get_pom_text",
17+
return_value="<project></project>",
18+
):
19+
with patch(
20+
"minecode.collectors.maven._parse",
21+
side_effect=Exception("VersionRangeParseError: Unbounded range: [9"),
22+
):
23+
purl = PackageURL.from_string(
24+
"pkg:maven/commons-codec/commons-codec@1.16.0"
25+
)
26+
db_package, error = map_maven_package(
27+
package_url=purl,
28+
package_content="binary",
29+
pipelines=[],
30+
)
31+
self.assertIsNone(db_package)
32+
self.assertIn("Failed to parse POM", error)

0 commit comments

Comments
 (0)