pycares
pycares copied to clipboard
CNAME answers to A request
I think that it is possible for a server to answer an A request with a CNAME response, but it seems that pycares, although in both cases using the c-ares ares_parse_a_reply method, forces the result of an A query to be a list of IPs
https://github.com/saghul/pycares/blob/4e6e36f839255ebef05e0682b98cbee1533805ce/src/pycares/init.py#L168
This seems to work
if query_type == _lib.T_A:
host = _ffi.new("struct hostent **")
addrttls = _ffi.new("struct ares_addrttl[]", PYCARES_ADDRTTL_SIZE)
naddrttls = _ffi.new("int*", PYCARES_ADDRTTL_SIZE)
parse_status = _lib.ares_parse_a_reply(abuf, alen, host, addrttls, naddrttls)
if parse_status != _lib.ARES_SUCCESS:
result = None
status = parse_status
else:
if host[0].h_aliases[0] != _ffi.NULL:
result = ares_query_cname_result(host[0])
_lib.ares_free_hostent(host[0])
else:
result = [ares_query_a_result(addrttls[i]) for i in range(naddrttls[0])]
status = None
Nice! Is there a publicly available record we can use to test? If so, mind making a PR?
Well I guess we'd have to update this https://github.com/saghul/pycares/blob/master/tests/tests.py#L186 but I'm not exactly sure how we are supposed to build the response for each case?
Right. Up until this point I've used publicly available records instead of synthetic ones.
I'm not sure how we should go about generating the synthetic one, perhaps creating a fake server ?
Not sure, I suppose it might be tricky to test on Windows, that's why I relied on existing DNS records, though this is not ideal.