Skip to content

Instantly share code, notes, and snippets.

@FilipeLipan
Created November 7, 2018 11:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FilipeLipan/c3e77f2f786bd60c1f3f7f06d11c05a0 to your computer and use it in GitHub Desktop.
Save FilipeLipan/c3e77f2f786bd60c1f3f7f06d11c05a0 to your computer and use it in GitHub Desktop.
retrofit token interceptor
private inner class HttpInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): okhttp3.Response {
var request = chain.request()
val builder = request.newBuilder()
request = builder.build()
val response = chain.proceed(request)
if (response.code() == 498 || response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
synchronized(httpClient) {
val code = refreshToken() / 100
if (code != 2) {
if (code == 4){ logout() }
return response
}
setAuthHeader(builder, preferences.retrieveSocialToken())
request = builder.build()
return chain.proceed(request)
}
}
return response
}
private fun setAuthHeader(builder: Request.Builder, token: String?) {
if (token != null) {builder.header(TOKEN, token)}
}
@Synchronized private fun refreshToken(): Int {
try {
val request = LoginRenewRequest(
email = preferences.retrieveUserEmail(),
key = preferences.retrieveSocialKey()
)
val call = api.authenticate(request)
val refresh = call.execute()
if (refresh.isSuccessful) {
preferences.storeSocialToken(refresh.body()?.token?:"")
} else {
Log.e(RestClient::class.java.simpleName, "refresh token call failed!")
logout()
}
return refresh.code()
} catch (e: IOException) {
e.printStackTrace()
} catch (e: StackOverflowError) {
e.printStackTrace()
}
return HttpsURLConnection.HTTP_BAD_REQUEST
}
private fun logout(): Int {
preferences.logout()
return 0
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment