"""Challenge 6: Filter Failed API Requests
Return records whose status is an HTTP error (>= 400).
Records with a missing/invalid status are skipped.
"""
def filter_failed_requests(requests):
failed = []
for req in requests:
try:
status = int(req.get("status"))
except (TypeError, ValueError):
continue
if status >= 400:
failed.append(req)
return failed
if __name__ == "__main__":
test_data = [
{"url": "/users", "status": 200},
{"url": "/login", "status": 401},
{"url": "/orders", "status": 500},
{"url": "/health", "status": 399},
{"url": "/broken"}, # missing status
]
result = filter_failed_requests(test_data)
print(result)
assert [r["url"] for r in result] == ["/login", "/orders"]
assert filter_failed_requests([]) == []
print("Challenge 6 OK")
IiIiQ2hhbGxlbmdlIDY6IEZpbHRlciBGYWlsZWQgQVBJIFJlcXVlc3RzClJldHVybiByZWNvcmRzIHdob3NlIHN0YXR1cyBpcyBhbiBIVFRQIGVycm9yICg+PSA0MDApLgpSZWNvcmRzIHdpdGggYSBtaXNzaW5nL2ludmFsaWQgc3RhdHVzIGFyZSBza2lwcGVkLgoiIiIKCmRlZiBmaWx0ZXJfZmFpbGVkX3JlcXVlc3RzKHJlcXVlc3RzKToKCWZhaWxlZCA9IFtdCglmb3IgcmVxIGluIHJlcXVlc3RzOgoJCXRyeToKCQkJc3RhdHVzID0gaW50KHJlcS5nZXQoInN0YXR1cyIpKQoJCWV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKCQkJY29udGludWUKCQlpZiBzdGF0dXMgPj0gNDAwOgoJCQlmYWlsZWQuYXBwZW5kKHJlcSkKCXJldHVybiBmYWlsZWQKCQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRlc3RfZGF0YSA9IFsKICAgICAgICB7InVybCI6ICIvdXNlcnMiLCAic3RhdHVzIjogMjAwfSwKICAgICAgICB7InVybCI6ICIvbG9naW4iLCAic3RhdHVzIjogNDAxfSwKICAgICAgICB7InVybCI6ICIvb3JkZXJzIiwgInN0YXR1cyI6IDUwMH0sCiAgICAgICAgeyJ1cmwiOiAiL2hlYWx0aCIsICJzdGF0dXMiOiAzOTl9LAogICAgICAgIHsidXJsIjogIi9icm9rZW4ifSwgICAgICAgICAgICAgICAgICMgbWlzc2luZyBzdGF0dXMKICAgIF0KICAgIHJlc3VsdCA9IGZpbHRlcl9mYWlsZWRfcmVxdWVzdHModGVzdF9kYXRhKQogICAgcHJpbnQocmVzdWx0KQogICAgYXNzZXJ0IFtyWyJ1cmwiXSBmb3IgciBpbiByZXN1bHRdID09IFsiL2xvZ2luIiwgIi9vcmRlcnMiXQogICAgYXNzZXJ0IGZpbHRlcl9mYWlsZWRfcmVxdWVzdHMoW10pID09IFtdCiAgICBwcmludCgiQ2hhbGxlbmdlIDYgT0siKQ==