Skip to content

Commit a78d650

Browse files
author
Your Name
committed
Enhance error handling in GitHubClient: improve JSON response parsing, handle non-JSON error responses, and implement retry logic for repository creation with minimal parameters.
1 parent b3f3a43 commit a78d650

File tree

1 file changed

+47
-20
lines changed

1 file changed

+47
-20
lines changed

template_automation/github_client.py

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,26 @@ def _request(self, method: str, url: str, **kwargs) -> Dict[str, Any]:
126126

127127
# Return JSON data for non-empty responses
128128
if response.text:
129-
return response.json()
129+
try:
130+
return response.json()
131+
except json.JSONDecodeError:
132+
logger.warning(f"Received non-JSON response: {response.text}")
133+
return {"raw_content": response.text}
130134
return {}
131135
except requests.exceptions.RequestException as e:
132136
if hasattr(e, 'response') and e.response is not None:
133137
try:
134-
error_body = e.response.json()
135-
logger.error(f"GitHub API error details: {json.dumps(error_body)}")
136-
except (ValueError, json.JSONDecodeError):
137-
logger.error(f"GitHub API error: {e.response.text}")
138+
# Try to parse JSON, but handle case where response is not JSON
139+
if e.response.text.strip():
140+
try:
141+
error_body = e.response.json()
142+
logger.error(f"GitHub API error details: {json.dumps(error_body)}")
143+
except json.JSONDecodeError:
144+
logger.error(f"GitHub API returned non-JSON error: {e.response.text}")
145+
else:
146+
logger.error(f"GitHub API returned empty error response with status code: {e.response.status_code}")
147+
except (ValueError, AttributeError):
148+
logger.error(f"GitHub API error: Unable to parse response")
138149
logger.error(f"Request failed: {str(e)}")
139150
raise
140151

@@ -174,25 +185,41 @@ def get_repository(
174185
# Try with minimal parameters first
175186
repo = self._request("POST", url, json={
176187
"name": repo_name,
177-
"private": False,
188+
"private": True,
178189
"auto_init": True
179190
})
180191
except requests.exceptions.HTTPError as create_error:
181-
# Log detailed error information for 422 errors
182-
if create_error.response.status_code == 422:
183-
error_response = create_error.response.json()
184-
logger.error(f"GitHub API error details: {json.dumps(error_response)}")
185-
# Try again with even more minimal parameters if it's a schema validation issue
186-
if "message" in error_response and "Validation Failed" in error_response.get("message", ""):
187-
logger.info("Retrying repository creation with minimal parameters")
188-
repo = self._request("POST", url, json={
189-
"name": repo_name,
190-
"private": True
191-
})
192+
# Safe handling of response parsing
193+
error_message = str(create_error)
194+
try:
195+
if create_error.response.text.strip():
196+
try:
197+
error_response = create_error.response.json()
198+
logger.error(f"GitHub API error details: {json.dumps(error_response)}")
199+
# Check for validation errors
200+
if "message" in error_response and "Validation Failed" in error_response.get("message", ""):
201+
logger.info("Retrying repository creation with minimal parameters")
202+
repo = self._request("POST", url, json={
203+
"name": repo_name,
204+
"private": True
205+
})
206+
else:
207+
raise create_error
208+
except json.JSONDecodeError:
209+
# Handle non-JSON responses
210+
logger.error(f"GitHub API returned non-JSON error response: {create_error.response.text}")
211+
# Try with most minimal parameters as a fallback
212+
logger.info("Retrying repository creation with minimal parameters due to non-JSON error")
213+
repo = self._request("POST", url, json={
214+
"name": repo_name,
215+
"private": True
216+
})
192217
else:
193-
raise
194-
else:
195-
raise
218+
logger.error(f"Empty error response with status code: {create_error.response.status_code}")
219+
raise create_error
220+
except (AttributeError, ValueError) as parse_error:
221+
logger.error(f"Error parsing response: {str(parse_error)}")
222+
raise create_error
196223

197224
# Wait for repository initialization
198225
max_retries = 10

0 commit comments

Comments
 (0)