@@ -115,8 +115,10 @@ local function dns_lookup(dns_resolver, host, query_type, filter_type, records,
115115 end
116116 for rec in each_matching_record (packet , host , filter_type ) do
117117 local t = rec :type ()
118- if t == cqueues_dns_record .AAAA or t == cqueues_dns_record .A then
119- table.insert (records , rec )
118+ if t == cqueues_dns_record .AAAA then
119+ table.insert (records , { family = cs .AF_INET6 , host = rec :addr () })
120+ elseif t == cqueues_dns_record .A then
121+ table.insert (records , { family = cs .AF_INET , host = rec :addr () })
120122 end
121123 end
122124end
@@ -166,11 +168,17 @@ local function connect(options, timeout)
166168 }
167169 end
168170
171+ local deadline = timeout and monotime ()+ timeout
172+
169173 local host = options .host
170- if not path and not http_util .is_ip (host ) then
174+ local records
175+ if path then
176+ records = { { family = family , path = path } }
177+ elseif http_util .is_ip (host ) then
178+ records = { { family = family , host = host } }
179+ else
171180 local dns_resolver = options .dns_resolver or cqueues_dns .getpool ()
172- local deadline = timeout and monotime ()+ timeout
173- local records = {}
181+ records = {}
174182 if family == cs .AF_UNSPEC then
175183 dns_lookup (dns_resolver , host , cqueues_dns_record .AAAA , nil , records , timeout )
176184 dns_lookup (dns_resolver , host , cqueues_dns_record .A , nil , records , deadline and deadline - monotime ())
@@ -179,28 +187,45 @@ local function connect(options, timeout)
179187 elseif family == cs .AF_INET6 then
180188 dns_lookup (dns_resolver , host , cqueues_dns_record .AAAA , cqueues_dns_record .AAAA , records , timeout )
181189 end
182- local rec = records [1 ]
183- if not rec then
184- return nil , " The name does not resolve for the supplied parameters"
185- end
186- host = rec :addr ()
187190 timeout = deadline and deadline - monotime ()
188191 end
189192
190- local s , err , errno = ca . fileresult ( cs . connect {
191- family = family ;
192- host = host ;
193+ local connect_params = {
194+ family = nil ;
195+ host = nil ;
193196 port = options .port ;
194- path = path ;
197+ path = nil ;
195198 bind = bind ;
196199 sendname = false ;
197200 v6only = options .v6only ;
198201 nodelay = true ;
199- })
200- if s == nil then
201- return nil , err , errno
202+ }
203+
204+ local lasterr , lasterrno = " The name does not resolve for the supplied parameters"
205+ for _ , rec in ipairs (records ) do
206+ connect_params .family = rec .family ;
207+ connect_params .host = rec .host ;
208+ connect_params .path = rec .path ;
209+ local s
210+ s , lasterr , lasterrno = ca .fileresult (cs .connect (connect_params ))
211+ if s then
212+ local c
213+ c , lasterr , lasterrno = negotiate (s , options , timeout )
214+ if c then
215+ -- Force TCP connect to occur
216+ local ok
217+ ok , lasterr , lasterrno = c :connect (deadline and deadline - monotime ())
218+ if ok then
219+ return c
220+ end
221+ c :close ()
222+ else
223+ s :close ()
224+ end
225+ timeout = deadline and deadline - monotime ()
226+ end
202227 end
203- return negotiate ( s , options , timeout )
228+ return nil , lasterr , lasterrno
204229end
205230
206231return {
0 commit comments