@@ -187,11 +187,11 @@ tasks.register("dropStagingRepositories") {
187187
188188data class StagingRepository (val key : String , val state : String , val portalDeploymentId : String? )
189189
190- fun createHttpClient (): CloseableHttpClient = HttpClients .custom()
190+ fun createHttpClient (socketTimeoutMs : Int = 60000 ): CloseableHttpClient = HttpClients .custom()
191191 .setDefaultRequestConfig(
192192 RequestConfig .custom()
193193 .setConnectTimeout(30000 )
194- .setSocketTimeout(60000 )
194+ .setSocketTimeout(socketTimeoutMs )
195195 .build()
196196 )
197197 .build()
@@ -231,10 +231,19 @@ fun parseRepositoriesResponse(jsonResponse: String): List<StagingRepository> {
231231
232232fun uploadRepositoriesToPortal (repositories : List <StagingRepository >) {
233233 println (" Starting upload of ${repositories.size} repositories to Central Portal..." )
234+ val failedRepos = mutableListOf<String >()
234235 repositories.forEachIndexed { index, repo ->
235236 println (" Uploading repository ${index + 1 } /${repositories.size} : ${repo.key} " )
236- uploadRepositoryToPortal(repo.key)
237- println (" Completed upload of repository ${index + 1 } /${repositories.size} : ${repo.key} " )
237+ try {
238+ uploadRepositoryToPortal(repo.key)
239+ println (" Completed upload of repository ${index + 1 } /${repositories.size} : ${repo.key} " )
240+ } catch (e: Exception ) {
241+ println (" Failed to upload repository ${index + 1 } /${repositories.size} : ${repo.key} - ${e.message} " )
242+ failedRepos.add(repo.key)
243+ }
244+ }
245+ if (failedRepos.isNotEmpty()) {
246+ throw RuntimeException (" Failed to upload ${failedRepos.size} /${repositories.size} repositories: $failedRepos " )
238247 }
239248 println (" Completed upload of all ${repositories.size} repositories to Central Portal" )
240249}
@@ -245,8 +254,9 @@ fun uploadRepositoryToPortal(repositoryKey: String, maxRetries: Int = 3) {
245254 println (" Upload URL: $uploadUrl " )
246255
247256 var lastException: Exception ? = null
257+ var hadTimeout = false
248258 repeat(maxRetries) { attempt ->
249- createHttpClient().use { client ->
259+ createHttpClient(socketTimeoutMs = 180_000 ).use { client ->
250260 try {
251261 val httpPost = HttpPost (uploadUrl).apply {
252262 setHeader(" Authorization" , authHeader())
@@ -260,16 +270,22 @@ fun uploadRepositoryToPortal(repositoryKey: String, maxRetries: Int = 3) {
260270 println (" Received response with status: $statusCode " )
261271
262272 val responseBody = EntityUtils .toString(response.entity)
263- println (" Response body length : ${ responseBody.length} " )
273+ println (" Response body: $responseBody " )
264274
265275 if (statusCode == 200 || statusCode == 201 ) {
266276 println (" Successfully uploaded repository $repositoryKey to Central Portal" )
267- println (" Response: $responseBody " )
277+ return
278+ } else if (statusCode == 400 && hadTimeout) {
279+ println (" Got 400 after a previous timeout for $repositoryKey — the timed-out request likely succeeded. Treating as success." )
268280 return
269281 } else {
270282 lastException = RuntimeException (" HTTP $statusCode - $responseBody " )
271283 println (" Upload attempt ${attempt + 1 } /$maxRetries failed for $repositoryKey : HTTP $statusCode " )
272284 }
285+ } catch (e: java.net.SocketTimeoutException ) {
286+ hadTimeout = true
287+ lastException = e
288+ println (" Upload attempt ${attempt + 1 } /$maxRetries timed out for $repositoryKey : ${e.message} " )
273289 } catch (e: Exception ) {
274290 lastException = e
275291 println (" Upload attempt ${attempt + 1 } /$maxRetries failed for $repositoryKey : ${e.message} " )
0 commit comments