Harden pincode lookups and retry postal http
All checks were successful
build-and-deploy / build-deploy (push) Successful in 33s
All checks were successful
build-and-deploy / build-deploy (push) Successful in 33s
This commit is contained in:
@@ -19,21 +19,33 @@ class PostalPincodeClient(
|
||||
|
||||
fun resolve(pinCode: String): PincodeLookupResult {
|
||||
return try {
|
||||
val url = UriComponentsBuilder.fromUriString(baseUrl)
|
||||
.path("/pincode/{pin}")
|
||||
.buildAndExpand(pinCode)
|
||||
.toUriString()
|
||||
val response = restTemplate.getForEntity(url, String::class.java)
|
||||
val body = response.body ?: return PincodeLookupResult(null, null, "EMPTY_BODY", "postalpincode.in")
|
||||
val resolved = parseCityState(body)
|
||||
val status = if (resolved == null) "ZERO_RESULTS" else "OK"
|
||||
PincodeLookupResult(resolved, body, status, "postalpincode.in")
|
||||
val first = fetch(baseUrl, pinCode)
|
||||
if (first.resolvedCityState != null) return first
|
||||
if (first.status == "ERROR" && baseUrl.startsWith("https://")) {
|
||||
val httpUrl = baseUrl.replaceFirst("https://", "http://")
|
||||
val second = fetch(httpUrl, pinCode)
|
||||
if (second.resolvedCityState != null) return second
|
||||
return second
|
||||
}
|
||||
first
|
||||
} catch (ex: Exception) {
|
||||
logger.warn("Postalpincode lookup failed: {}", ex.message)
|
||||
PincodeLookupResult(null, null, "ERROR", "postalpincode.in", ex.message)
|
||||
}
|
||||
}
|
||||
|
||||
private fun fetch(base: String, pinCode: String): PincodeLookupResult {
|
||||
val url = UriComponentsBuilder.fromUriString(base)
|
||||
.path("/pincode/{pin}")
|
||||
.buildAndExpand(pinCode)
|
||||
.toUriString()
|
||||
val response = restTemplate.getForEntity(url, String::class.java)
|
||||
val body = response.body ?: return PincodeLookupResult(null, null, "EMPTY_BODY", "postalpincode.in")
|
||||
val resolved = parseCityState(body)
|
||||
val status = if (resolved == null) "ZERO_RESULTS" else "OK"
|
||||
return PincodeLookupResult(resolved, body, status, "postalpincode.in")
|
||||
}
|
||||
|
||||
private fun parseCityState(body: String): String? {
|
||||
val root = objectMapper.readTree(body)
|
||||
if (!root.isArray || root.isEmpty) return null
|
||||
|
||||
Reference in New Issue
Block a user