アカウント追加時にインスタンス情報の取得処理でエラーを出す問題の修正

This commit is contained in:
tateisu 2020-12-12 03:34:19 +09:00
parent 2b7c2075ff
commit e30a1519ed
3 changed files with 30 additions and 20 deletions

View File

@ -545,7 +545,8 @@ class TootApiClient(
suspend fun request(
path: String,
request_builder: Request.Builder = Request.Builder()
request_builder: Request.Builder = Request.Builder(),
withoutToken: Boolean = false,
): TootApiResult? {
val result = TootApiResult.makeWithCaption(apiHost?.pretty)
if (result.error != null) return result
@ -559,9 +560,11 @@ class TootApiClient(
request_builder.url(url)
val access_token = account?.getAccessToken()
if (access_token?.isNotEmpty() == true) {
request_builder.header("Authorization", "Bearer $access_token")
if(!withoutToken){
val access_token = account?.getAccessToken()
if (access_token?.isNotEmpty() == true) {
request_builder.header("Authorization", "Bearer $access_token")
}
}
request_builder.build()

View File

@ -17,12 +17,11 @@ open class TootApiResult(
private val reLinkURL = """<([^>]+)>;\s*rel="([^"]+)"""".asciiPattern()
private const val NO_INSTANCE = "missing instance name"
fun makeWithCaption(caption : String?) : TootApiResult {
val result = TootApiResult()
if(caption?.isEmpty() != false) {
result.error = NO_INSTANCE
log.e("makeWithCaption: missing caption!")
result.error = "missing instance name"
} else {
result.caption = caption
}

View File

@ -16,6 +16,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch
import okhttp3.Request
import java.lang.NullPointerException
import java.util.*
import java.util.regex.Pattern
import kotlin.collections.ArrayList
@ -265,6 +266,7 @@ class TootInstance(parser: TootParser, src: JsonObject) {
// 疑似アカウントの追加時に、インスタンスの検証を行う
private suspend fun TootApiClient.getInstanceInformation(): TootApiResult? {
// misskeyのインスタンス情報を読めたら、それはmisskeyのインスタンス
val r2 = getInstanceInformationMisskey() ?: return null
if (r2.jsonObject != null) return r2
@ -278,7 +280,6 @@ class TootInstance(parser: TootParser, src: JsonObject) {
class RequestInfo(
val client: TootApiClient,
val apiHost: Host,
val account: SavedAccount?,
val allowPixelfed: Boolean,
val forceUpdate: Boolean,
@ -291,9 +292,6 @@ class TootInstance(parser: TootParser, src: JsonObject) {
// インスタンス情報のキャッシュ
var cacheData: TootInstance? = null
// ホストごとに同時に1つしか実行しない、インスタンス情報更新キュー
val requestQueue = Channel<RequestInfo>(capacity = Channel.UNLIMITED)
private suspend fun getImpl(ri: RequestInfo): Pair<TootInstance?, TootApiResult?> {
var item: TootInstance?
@ -318,17 +316,22 @@ class TootInstance(parser: TootParser, src: JsonObject) {
// get new information
val result = when {
ri.account == null ->
ri.account == null ->{
ri.client.getInstanceInformation()
}
ri.account.isMisskey ->
ri.client.request(
"/api/meta",
JsonObject().apply { put("dummy", 1) }.toPostRequestBuilder()
JsonObject().apply { put("dummy", 1) }.toPostRequestBuilder(),
withoutToken = true
)
else ->
ri.client.request("/api/v1/instance")
ri.client.request(
"/api/v1/instance",
withoutToken = true
)
}
val json = result?.jsonObject ?: return Pair(null, result)
@ -363,6 +366,9 @@ class TootInstance(parser: TootParser, src: JsonObject) {
}
}
// ホストごとに同時に1つしか実行しない、インスタンス情報更新キュー
val requestQueue = Channel<RequestInfo>(capacity = Channel.UNLIMITED)
private suspend fun loop() {
while (true) {
requestQueue.receive().let { req ->
@ -408,7 +414,7 @@ class TootInstance(parser: TootParser, src: JsonObject) {
suspend fun get(
client: TootApiClient,
hostArg: Host? = client.apiHost,
hostArg: Host? = null,
account: SavedAccount? = if (hostArg == client.apiHost) client.account else null,
allowPixelfed: Boolean = false,
forceUpdate: Boolean = false
@ -417,14 +423,16 @@ class TootInstance(parser: TootParser, src: JsonObject) {
val tmpInstance = client.apiHost
val tmpAccount = client.account
try {
val host: Host = hostArg ?: client.apiHost!!
// this may write client.apiHost
if( account != null ) client.account = account
// update client.apiHost
if( hostArg != null ) client.apiHost = hostArg
client.apiHost = host
client.account = account
if( client.apiHost ==null ) throw NullPointerException("missing host to get server information.")
// ホスト名ごとに用意したオブジェクトで同期する
return RequestInfo(client, host, account, allowPixelfed, forceUpdate)
.also { host.getCacheEntry().requestQueue.send(it) }
return RequestInfo(client, account, allowPixelfed, forceUpdate)
.also { client.apiHost!!.getCacheEntry().requestQueue.send(it) }
.result.receive()
} finally {