Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 1 addition & 31 deletions functions/anomali-ioc-ingest/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -1141,44 +1141,14 @@ def upload_csv_files_to_ngsiem_actual(csv_files: List[str], repository: str, log
# Log the raw response for troubleshooting
logger.info(f"NGSIEM upload response for {filename}: {response}")

# Handle 500 errors that may be successful uploads with empty responses
if response["status_code"] == 500:
error_body = response.get("body", {})
errors = error_body.get("errors", [])

# Check for JSON parsing errors that indicate successful upload
is_likely_success = False
if errors:
error_message = str(errors[0].get("message", "")).lower()
is_likely_success = any(phrase in error_message for phrase in [
"extra data: line 1 column",
"expecting value: line 1 column 1 (char 0)"
])

if is_likely_success:
logger.info(f"Upload successful for {filename} (recovered from parsing error)")
results.append({
"file": filename,
"status": "success",
"message": "File uploaded successfully"
})
else:
# Real 500 error
results.append({
"file": filename,
"status": "error",
"message": f"Upload failed: {errors}"
})
elif response["status_code"] >= 400:
# Other 4xx errors are real failures
if response["status_code"] >= 400:
error_messages = response.get("body", {}).get("errors", [])
results.append({
"file": filename,
"status": "error",
"message": f"Upload failed: {error_messages}"
})
else:
# 2xx success
results.append({
"file": filename,
"status": "success",
Expand Down
30 changes: 0 additions & 30 deletions functions/anomali-ioc-ingest/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -1006,36 +1006,6 @@ def test_process_iocs_with_existing_file_merge(self):
# Verify new IP was added
self.assertIn("5.6.7.8", rows_by_ip)

@patch('main.NGSIEM')
def test_upload_csv_files_500_error_recovery(self, mock_ngsiem_class):
"""Test upload recovery from 500 error with JSON parsing message."""
mock_ngsiem = MagicMock()
mock_ngsiem_class.return_value = mock_ngsiem
mock_logger = MagicMock()

# Mock 500 error with JSON parsing error (indicates successful upload)
mock_ngsiem.upload_file.return_value = {
"status_code": 500,
"body": {
"errors": [
{"message": "extra data: line 1 column 123 (char 122)"}
]
}
}

with tempfile.NamedTemporaryFile(suffix='.csv', delete=False) as temp_file:
temp_file.write(b"test,data\n1,2")
temp_file.flush()

try:
results = main.upload_csv_files_to_ngsiem([temp_file.name], "search-all", mock_logger)

self.assertEqual(len(results), 1)
self.assertEqual(results[0]["status"], "success")
self.assertEqual(results[0]["message"], "File uploaded successfully")
finally:
os.unlink(temp_file.name)

def test_clear_collection_data_success(self):
"""Test clear_collection_data functionality."""
mock_api_harness = MagicMock()
Expand Down
Loading