1
1
defmodule Mint.Core.Util do
2
2
@ moduledoc false
3
3
4
+ alias Mint.Types
5
+
4
6
@ unallowed_trailer_headers MapSet . new ( [
5
7
"content-encoding" ,
6
8
"content-length" ,
@@ -46,6 +48,7 @@ defmodule Mint.Core.Util do
46
48
"warning"
47
49
] )
48
50
51
+ @ spec hostname ( keyword ( ) , String . t ( ) ) :: String . t ( )
49
52
def hostname ( opts , address ) when is_list ( opts ) do
50
53
case Keyword . fetch ( opts , :hostname ) do
51
54
{ :ok , hostname } ->
@@ -59,6 +62,7 @@ defmodule Mint.Core.Util do
59
62
end
60
63
end
61
64
65
+ @ spec inet_opts ( :gen_tcp | :ssl , :gen_tcp . socket ( ) | :ssl . sslsocket ( ) ) :: :ok | { :error , term ( ) }
62
66
def inet_opts ( transport , socket ) do
63
67
with { :ok , opts } <- transport . getopts ( socket , [ :sndbuf , :recbuf , :buffer ] ) ,
64
68
buffer = calculate_buffer ( opts ) ,
@@ -67,6 +71,7 @@ defmodule Mint.Core.Util do
67
71
end
68
72
end
69
73
74
+ @ spec scheme_to_transport ( atom ( ) ) :: module ( )
70
75
def scheme_to_transport ( :http ) , do: Mint.Core.Transport.TCP
71
76
def scheme_to_transport ( :https ) , do: Mint.Core.Transport.SSL
72
77
def scheme_to_transport ( module ) when is_atom ( module ) , do: module
@@ -78,6 +83,7 @@ defmodule Mint.Core.Util do
78
83
end
79
84
80
85
# Adds a header to the list of headers unless it's nil or it's already there.
86
+ @ spec put_new_header ( Types . headers ( ) , String . t ( ) , String . t ( ) | nil ) :: Types . headers ( )
81
87
def put_new_header ( headers , name , value )
82
88
83
89
def put_new_header ( headers , _name , nil ) do
@@ -92,6 +98,7 @@ defmodule Mint.Core.Util do
92
98
end
93
99
end
94
100
101
+ @ spec put_new_header_lazy ( Types . headers ( ) , String . t ( ) , ( -> String . t ( ) ) ) :: Types . headers ( )
95
102
def put_new_header_lazy ( headers , name , fun ) do
96
103
if List . keymember? ( headers , name , 0 ) do
97
104
headers
@@ -102,22 +109,28 @@ defmodule Mint.Core.Util do
102
109
103
110
# Lowercases an ASCII string more efficiently than
104
111
# String.downcase/1.
105
- def downcase_ascii ( string ) ,
106
- do: for ( << char <- string >> , do: << downcase_ascii_char ( char ) >> , into: "" )
112
+ @ spec downcase_ascii ( String . t ( ) ) :: String . t ( )
113
+ def downcase_ascii ( string ) do
114
+ for << char <- string >> , do: << downcase_ascii_char ( char ) >> , into: ""
115
+ end
107
116
117
+ @ spec downcase_ascii_char ( byte ( ) ) :: byte ( )
108
118
def downcase_ascii_char ( char ) when char in ?A .. ?Z , do: char + 32
109
119
def downcase_ascii_char ( char ) when char in 0 .. 127 , do: char
110
120
111
121
# If the buffer is empty, reusing the incoming data saves
112
122
# a potentially large allocation of memory.
113
123
# This should be fixed in a subsequent OTP release.
124
+ @ spec maybe_concat ( binary ( ) , binary ( ) ) :: binary ( )
114
125
def maybe_concat ( << >> , data ) , do: data
115
126
def maybe_concat ( buffer , data ) when is_binary ( buffer ) , do: buffer <> data
116
127
128
+ @ spec find_unallowed_trailer_header ( Types . headers ( ) ) :: { String . t ( ) , String . t ( ) } | nil
117
129
def find_unallowed_trailer_header ( headers ) do
118
130
Enum . find ( headers , fn { name , _value } -> name in @ unallowed_trailer_headers end )
119
131
end
120
132
133
+ @ spec remove_unallowed_trailer_headers ( Types . headers ( ) ) :: Types . headers ( )
121
134
def remove_unallowed_trailer_headers ( headers ) do
122
135
Enum . reject ( headers , fn { name , _value } -> name in @ unallowed_trailer_headers end )
123
136
end
0 commit comments