アカウント追加時にインスタンス情報の取得処理でエラーを出す問題の修正
This commit is contained in:
parent
2b7c2075ff
commit
e30a1519ed
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue