Skip to content

Commit

Permalink
feat: get resource with timeout (#786)
Browse files Browse the repository at this point in the history
  • Loading branch information
tangcent authored Jun 12, 2022
1 parent 52b81ca commit 7242666
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.itangcent.intellij.config.ConfigReader
import com.itangcent.intellij.config.resource.DefaultResourceResolver
import com.itangcent.intellij.config.resource.URLResource
import com.itangcent.intellij.context.ActionContext
import com.itangcent.intellij.extend.callWithTimeout
import com.itangcent.intellij.file.LocalFileRepository
import com.itangcent.intellij.logger.Logger
import com.itangcent.utils.GiteeSupport
Expand All @@ -37,15 +38,18 @@ open class CachedResourceResolver : DefaultResourceResolver() {
@Inject
private lateinit var httpSettingsHelper: HttpSettingsHelper

@Inject
private lateinit var actionContext: ActionContext

@Inject
private lateinit var logger: Logger

private val beanDAO: SqliteDataResourceHelper.ExpiredBeanDAO by lazy {
val context = ActionContext.getContext()
val sqliteDataResourceHelper = context!!.instance(SqliteDataResourceHelper::class)
val sqliteDataResourceHelper = actionContext.instance(SqliteDataResourceHelper::class)
sqliteDataResourceHelper.getExpiredBeanDAO(
(projectCacheRepository
?: localFileRepository)!!.getOrCreateFile(".url.cache.v2.1.db").path, "DB_BEAN_BINDER")
?: localFileRepository)!!.getOrCreateFile(".url.cache.v2.1.db").path, "DB_BEAN_BINDER"
)
}

override fun createUrlResource(url: String): URLResource {
Expand All @@ -65,16 +69,22 @@ open class CachedResourceResolver : DefaultResourceResolver() {
return byteArrayOf()
}
try {
valueBytes = super.inputStream?.use { it.readBytes() }
valueBytes = actionContext.callWithTimeout(timeOut().toLong()) {
super.inputStream?.use { it.readBytes() }
}
} catch (e: Exception) {
if (url.host.contains("githubusercontent.com")) {
GiteeSupport.convertUrlFromGithub(rawUrl)?.let { giteeUrl ->
if(e is SocketTimeoutException){
logger.error("failed fetch:[$url]\n" +
"Maybe you can use [$giteeUrl] instead")
}else {
logger.traceError("failed fetch:[$url]\n" +
"Maybe you can use [$giteeUrl] instead", e)
if (e is SocketTimeoutException) {
logger.error(
"failed fetch:[$url]\n" +
"Maybe you can use [$giteeUrl] instead"
)
} else {
logger.traceError(
"failed fetch:[$url]\n" +
"Maybe you can use [$giteeUrl] instead", e
)
}
return null
}
Expand Down Expand Up @@ -103,10 +113,12 @@ open class CachedResourceResolver : DefaultResourceResolver() {
get() = loadCache()?.let { String(it, Charsets.UTF_8) }

override fun onConnection(connection: URLConnection) {
val httpTimeOut = httpSettingsHelper.httpTimeOut(TimeUnit.MILLISECONDS)
val httpTimeOut = timeOut()
connection.connectTimeout = httpTimeOut
connection.readTimeout = httpTimeOut
}

private fun timeOut() = httpSettingsHelper.httpTimeOut(TimeUnit.MILLISECONDS)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
package com.itangcent.intellij.extend

import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.intellij.psi.util.PsiTreeUtil
import com.itangcent.common.concurrent.ValueHolder
import com.itangcent.common.logger.traceError
import com.itangcent.common.utils.TimeSpanUtils
import com.itangcent.common.utils.cast
import com.itangcent.intellij.context.ActionContext
import com.itangcent.intellij.context.ThreadFlag
import com.itangcent.intellij.logger.Logger
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,19 @@ import com.itangcent.intellij.extend.guice.with
import com.itangcent.mock.AdvancedContextTest
import com.itangcent.mock.SettingBinderAdaptor
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.condition.DisabledOnOs
import org.junit.jupiter.api.condition.OS
import org.mockito.Mockito
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.mockito.kotlin.times
import java.net.SocketTimeoutException
import java.io.IOException
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue

/**
* Test case of [CachedResourceResolver]
*/
@DisabledOnOs(OS.WINDOWS)
//@DisabledOnOs(OS.WINDOWS)
internal class CachedResourceResolverTest : AdvancedContextTest() {

@Inject
Expand Down Expand Up @@ -77,7 +75,7 @@ internal class CachedResourceResolverTest : AdvancedContextTest() {
}

@Test
fun testCachedResource() {
fun testCachedResourceFromGithub() {
settings.httpTimeOut = 5

try {
Expand Down Expand Up @@ -107,9 +105,14 @@ internal class CachedResourceResolverTest : AdvancedContextTest() {
assertNotNull(it)
assertEquals(content, it.use { input -> input.readString() })
}
} catch (e: SocketTimeoutException) {
} catch (e: IOException) {
logger.warn("failed connect raw.githubusercontent.com")
}
}

@Test
fun testCachedResourceFromApache() {
settings.httpTimeOut = 5

try {
//test forbidden
Expand All @@ -127,7 +130,7 @@ internal class CachedResourceResolverTest : AdvancedContextTest() {
assertNotNull(it)
assertEquals("", it.use { input -> input.readString() })
}
} catch (e: SocketTimeoutException) {
} catch (e: IOException) {
logger.warn("failed connect apache.org")
}
}
Expand Down

0 comments on commit 7242666

Please sign in to comment.