okhttp
104 строки · 2.5 Кб
1/*
2* Copyright (C) 2023 Square, Inc.
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16package okhttp3.internal.idn
17
18import kotlin.math.abs
19import okio.ByteString
20
21internal sealed interface MappedRange {
22val rangeStart: Int
23
24data class Constant(
25override val rangeStart: Int,
26val type: Int,
27) : MappedRange {
28val b1: Int
29get() =
30when (type) {
31TYPE_IGNORED -> 119
32TYPE_VALID -> 120
33TYPE_DISALLOWED -> 121
34else -> error("unexpected type: $type")
35}
36}
37
38data class Inline1(
39override val rangeStart: Int,
40private val mappedTo: ByteString,
41) : MappedRange {
42val b1: Int
43get() {
44val b3bit8 = mappedTo[0] and 0x80 != 0
45return if (b3bit8) 123 else 122
46}
47
48val b2: Int
49get() = mappedTo[0] and 0x7f
50}
51
52data class Inline2(
53override val rangeStart: Int,
54private val mappedTo: ByteString,
55) : MappedRange {
56val b1: Int
57get() {
58val b2bit8 = mappedTo[0] and 0x80 != 0
59val b3bit8 = mappedTo[1] and 0x80 != 0
60return when {
61b2bit8 && b3bit8 -> 127
62b3bit8 -> 126
63b2bit8 -> 125
64else -> 124
65}
66}
67
68val b2: Int
69get() = mappedTo[0] and 0x7f
70
71val b3: Int
72get() = mappedTo[1] and 0x7f
73}
74
75data class InlineDelta(
76override val rangeStart: Int,
77val codepointDelta: Int,
78) : MappedRange {
79private val absoluteDelta = abs(codepointDelta)
80
81val b1: Int
82get() =
83when {
84codepointDelta < 0 -> 0x40 or (absoluteDelta shr 14)
85codepointDelta > 0 -> 0x50 or (absoluteDelta shr 14)
86else -> error("Unexpected codepointDelta of 0")
87}
88
89val b2: Int
90get() = absoluteDelta shr 7 and 0x7f
91
92val b3: Int
93get() = absoluteDelta and 0x7f
94
95companion object {
96const val MAX_VALUE = 0x3FFFF
97}
98}
99
100data class External(
101override val rangeStart: Int,
102val mappedTo: ByteString,
103) : MappedRange
104}
105