HttpUrlManager.kt 4.54 KB
Newer Older
konghaorui committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
package com.ydl.ydlnet.builder.manage

import com.ydl.ydlnet.YDLHttpUtils
import com.ydl.ydlnet.builder.factory.ApiFactory
import okhttp3.HttpUrl
import okhttp3.Interceptor
import okhttp3.Request
import java.util.*

/**
 * Created by haorui on 2019-09-02 .
 * Des: 多域名管理类
 */
class HttpUrlManager private constructor() {
    open val mRedirectInterceptor: Interceptor
    val DOMAIN = "Domain-Name"
    
    open var mDomainNameHub: MutableMap<String, String>? = null

    /**
     * 获取全局唯一的baseUrl
     *
     * @return url
     */
    val url: String?
        get() = getUrlByKey(DEFAULT_URL_KEY)

    init {
        mDomainNameHub = HashMap()
        this.mRedirectInterceptor = Interceptor { chain -> chain.proceed(processRequest(chain.request())) }
    }

    /**
     * 一次性传入urlMap
     *
     * @param urlMap map
     * @return HttpUrlManager
     */
    fun setMultipleUrl(urlMap: MutableMap<String, String>): HttpUrlManager {
        if (urlMap.isNotEmpty()){
            this.mDomainNameHub?.putAll(urlMap)
        }
        return this
    }

    /**
     * 向map中添加url
     *
     * @param urlKey   key
     * @param urlValue value
     * @return HttpUrlManager
     */
    fun addUrl(urlKey: String, urlValue: String): HttpUrlManager {
        mDomainNameHub!![urlKey] = urlValue
        return this
    }

    /**
     * 从map中删除某个url
     *
     * @param urlKey 需要删除的urlKey
     * @return HttpUrlManager
     */
    fun removeUrlByKey(urlKey: String): HttpUrlManager {
        mDomainNameHub!!.remove(urlKey)
        return this
    }

    /**
     * 针对单个baseUrl切换的时候清空老baseUrl的所有信息
     *
     * @param urlValue url
     * @return HttpUrlManager
     */
    fun setUrl(urlValue: String): HttpUrlManager {
        mDomainNameHub!![DEFAULT_URL_KEY] = urlValue
        return this
    }

    /**
     * 根据key
     *
     * @param urlKey 获取对应的url
     * @return url
     */
    fun getUrlByKey(urlKey: String): String? {
        return mDomainNameHub!![urlKey]
    }

    /**
     * 清空设置的url相关的所以信息
     * 相当于重置url
     * 动态切换生产测试环境时候调用
     *
     * @return HttpUrlManager
     */
    fun clear(): HttpUrlManager {
        mDomainNameHub!!.clear()
        ApiFactory.getInstance().clearAllApi()
        YDLHttpUtils.removeAllCookie()
        return this
    }

    companion object {

        @Volatile
        private var instance: HttpUrlManager? = null

        var DEFAULT_URL_KEY = "http_default_url_key"

        fun getInstance(): HttpUrlManager? {
            if (instance == null) {
                synchronized(HttpUrlManager::class.java) {
                    if (instance == null) {
                        instance = HttpUrlManager()
                    }
                }
            }
            return instance
        }
    }


    //========================================

    /**
     *解析Request的Header
     */
    private fun processRequest(request: Request): Request {
        var newBuilder = request.newBuilder()
        var domainName = obtainDomainNameFromHeaders(request)
        var httpUrl: HttpUrl? = null
        if (domainName.isNotEmpty()) {
            httpUrl = fetchDomain(domainName)?.let { checkUrl(it) }
            newBuilder.removeHeader(DOMAIN)
        }
        if (null != httpUrl) {
            val newUrl = parseUrl(httpUrl, request.url())
            return newBuilder.url(newUrl).build()
        }
        return newBuilder.build()
    }

    /**
     * 解析请求的Header
     */
    private fun obtainDomainNameFromHeaders(request: Request): String {
        val headers = request.headers(DOMAIN)
        if (headers == null || headers.size == 0)
            return ""
        if (headers.size > 1)
            throw IllegalArgumentException("Only one Domain-Name in the headers")
        return request.header(DOMAIN)!!
    }


    /**
     *获得Header对应的HttpUrl
     */
    fun fetchDomain(domainName: String): String? {
        return mDomainNameHub?.get(domainName)
    }

    fun parseUrl(domainUrl: HttpUrl, url: HttpUrl): HttpUrl {
        return checkUrl(url.toString().replace(this.url?:url.host(),domainUrl.toString()))
//        return url.newBuilder()
//            .scheme(domainUrl.scheme())
//            .host(domainUrl.host())
//            .port(domainUrl.port())
//            .build()
    }

    /**
     * 包装url类型String->HttpUrl
     */
    fun checkUrl(url: String): HttpUrl {
        val parseUrl = HttpUrl.parse(url)
        return parseUrl!!
    }

    

}