Overview
Comment: | Add OFDNSResponse |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
da8eb2d43a26a5f6a329476000f81be8 |
User & Date: | js on 2019-09-30 22:46:28 |
Other Links: | manifest | tags |
Context
2019-10-01
| ||
00:40 | Add OFDNSRequest check-in: 6b2fb27dca user: js tags: trunk | |
2019-09-30
| ||
22:46 | Add OFDNSResponse check-in: da8eb2d43a user: js tags: trunk | |
21:27 | Don't reserve ivars for class clusters check-in: 1a9f18064e user: js tags: trunk | |
Changes
Modified src/Makefile from [aaeff450e6] to [0421509860].
︙ | ︙ | |||
133 134 135 136 137 138 139 140 141 142 143 144 145 146 | OFINICategory.m \ OFINIFile.m \ OFSettings.m \ OFString+PathAdditions.m SRCS_PLUGINS = OFPlugin.m SRCS_SOCKETS = OFDNSResolver.m \ OFDNSResourceRecord.m \ OFHTTPClient.m \ OFHTTPCookie.m \ OFHTTPCookieManager.m \ OFHTTPRequest.m \ OFHTTPResponse.m \ OFHTTPServer.m \ OFStreamSocket.m \ | > | 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | OFINICategory.m \ OFINIFile.m \ OFSettings.m \ OFString+PathAdditions.m SRCS_PLUGINS = OFPlugin.m SRCS_SOCKETS = OFDNSResolver.m \ OFDNSResourceRecord.m \ OFDNSResponse.m \ OFHTTPClient.m \ OFHTTPCookie.m \ OFHTTPCookieManager.m \ OFHTTPRequest.m \ OFHTTPResponse.m \ OFHTTPServer.m \ OFStreamSocket.m \ |
︙ | ︙ |
Modified src/OFDNSResolver.h from [7a80eed2c3] to [3d3d9eb630].
︙ | ︙ | |||
13 14 15 16 17 18 19 20 21 22 23 24 25 26 | * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #import "OFDNSResourceRecord.h" #import "OFRunLoop.h" #import "OFString.h" OF_ASSUME_NONNULL_BEGIN #define OF_DNS_RESOLVER_BUFFER_LENGTH 512 | > | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #import "OFDNSResourceRecord.h" #import "OFDNSResponse.h" #import "OFRunLoop.h" #import "OFString.h" OF_ASSUME_NONNULL_BEGIN #define OF_DNS_RESOLVER_BUFFER_LENGTH 512 |
︙ | ︙ | |||
60 61 62 63 64 65 66 | OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR, /*! The server does not have support for the requested query */ OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED, /*! The server refused the query */ OF_DNS_RESOLVER_ERROR_SERVER_REFUSED } of_dns_resolver_error_t; | < < < | < < < < < | < < | 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 | OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR, /*! The server does not have support for the requested query */ OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED, /*! The server refused the query */ OF_DNS_RESOLVER_ERROR_SERVER_REFUSED } of_dns_resolver_error_t; /*! * @protocol OFDNSResolverDelegate OFDNSResolver.h ObjFW/OFDNSResolver.h * * @brief A delegate for OFDNSResolver. */ @protocol OFDNSResolverDelegate <OFObject> @optional /*! * @brief This method is called when a DNS resolver resolved a domain name. * * @param resolver The acting resolver * @param domainName The fully qualified domain name used to resolve the host * @param response The response from the DNS server, or nil on error * @param exception An exception that happened during resolving, or nil on * success */ - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName response: (nullable OFDNSResponse *)response exception: (nullable id)exception; /*! * @brief This method is called when a DNS resolver resolved a domain name to * socket addresses. * * @param resolver The acting resolver |
︙ | ︙ |
Modified src/OFDNSResolver.m from [77dfb36f29] to [8025fe1282].
︙ | ︙ | |||
159 160 161 162 163 164 165 | @public unsigned int _expectedResponses; } - (instancetype)initWithHost: (OFString *)host delegate: (id)delegate; - (bool)parseRecords: (OFArray *)records | | < | < | | | < < | | | < < | 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 184 185 186 187 188 189 190 | @public unsigned int _expectedResponses; } - (instancetype)initWithHost: (OFString *)host delegate: (id)delegate; - (bool)parseRecords: (OFArray *)records response: (OFDNSResponse *)response recordType: (of_dns_resource_record_type_t)recordType recursion: (unsigned int)recursion result: (OFMutableArray *)result; - (void)resolveCNAME: (OFCNAMEDNSResourceRecord *)CNAME response: (OFDNSResponse *)response recordType: (of_dns_resource_record_type_t)recordType recursion: (unsigned int)recursion result: (OFMutableArray *)result; - (void)resolver: (OFDNSResolver *)resolver didResolveCNAME: (OFString *)CNAME response: (OFDNSResponse *)response context: (OFNumber *)context exception: (id)exception; - (void)done; - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName response: (OFDNSResponse *)response context: (OFNumber *)context exception: (id)exception; @end @interface OFDNSResolverResolveSocketAddressesDelegate: OFObject <OFDNSResolverDelegate> { |
︙ | ︙ | |||
655 656 657 658 659 660 661 | [array makeImmutable]; [ret makeImmutable]; return ret; } | > | < < | | | < | | | | 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 | [array makeImmutable]; [ret makeImmutable]; return ret; } static void callback(id target, SEL selector, OFDNSResolver *resolver, OFString *domainName, OFDNSResponse *response, id context, id exception) { void (*method)(id, SEL, OFDNSResolver *, OFString *, OFDNSResponse *, id, id) = (void (*)(id, SEL, OFDNSResolver *, OFString *, OFDNSResponse *, id, id))[target methodForSelector: selector]; method(target, selector, resolver, domainName, response, context, exception); } @implementation OFDNSResolverSettings - (instancetype)initWithNameServers: (OFArray *)nameServers searchDomains: (OFArray *)searchDomains timeout: (of_time_interval_t)timeout maxAttempts: (unsigned int)maxAttempts |
︙ | ︙ | |||
840 841 842 843 844 845 846 | [_resolver release]; [_domainName release]; [super dealloc]; } - (bool)parseRecords: (OFArray *)records | | < | | | | | | < | | | | < | | < | | < | 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 | [_resolver release]; [_domainName release]; [super dealloc]; } - (bool)parseRecords: (OFArray *)records response: (OFDNSResponse *)response recordType: (of_dns_resource_record_type_t)recordType recursion: (unsigned int)recursion result: (OFMutableArray *)result { bool found = false; for (OF_KINDOF(OFDNSResourceRecord *) record in records) { if ([record recordClass] != OF_DNS_RESOURCE_RECORD_CLASS_IN) continue; if ([record recordType] == recordType) { [result addObject: record]; found = true; } else if ([record recordType] == OF_DNS_RESOURCE_RECORD_TYPE_CNAME) { [self resolveCNAME: record response: response recordType: recordType recursion: recursion result: result]; found = true; } } return found; } - (void)resolveCNAME: (OFCNAMEDNSResourceRecord *)CNAME response: (OFDNSResponse *)response recordType: (of_dns_resource_record_type_t)recordType recursion: (unsigned int)recursion result: (OFMutableArray *)result { OFString *alias = CNAME.alias; bool found = false; if (recursion == 0) return; if ([self parseRecords: [response.answerRecords objectForKey: alias] response: response recordType: recordType recursion: recursion - 1 result: result]) found = true; if ([self parseRecords: [response.additionalRecords objectForKey: alias] response: response recordType: recordType recursion: recursion - 1 result: result]) found = true; if (!found) { of_run_loop_mode_t runLoopMode = |
︙ | ︙ | |||
917 918 919 920 921 922 923 | [_resolver of_asyncResolveHost: alias recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: recordType runLoopMode: runLoopMode target: self selector: @selector(resolver: | | < < < | | | | < < | | | 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 | [_resolver of_asyncResolveHost: alias recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: recordType runLoopMode: runLoopMode target: self selector: @selector(resolver: didResolveCNAME:response: context:exception:) context: recordTypeNumber]; } } - (void)resolver: (OFDNSResolver *)resolver didResolveCNAME: (OFString *)CNAME response: (OFDNSResponse *)response context: (OFNumber *)context exception: (id)exception { /* * TODO: Error handling could be improved. Ignore error if there are * responses, otherwise propagate error. */ of_dns_resource_record_type_t recordType = context.unsignedIntValue; |
︙ | ︙ | |||
957 958 959 960 961 962 963 | [self done]; return; } records = [OFMutableArray array]; | | | < | | < | 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 | [self done]; return; } records = [OFMutableArray array]; if ([self parseRecords: [response.answerRecords objectForKey: CNAME] response: response recordType: recordType recursion: CNAME_RECURSION result: records]) found = true; if ([self parseRecords: [response.additionalRecords objectForKey: CNAME] response: response recordType: recordType recursion: CNAME_RECURSION result: records]) found = true; if (!found) { if (_expectedResponses == 0) |
︙ | ︙ | |||
1042 1043 1044 1045 1046 1047 1048 | didResolveDomainName: _domainName socketAddresses: (exception == nil ? addresses : nil) exception: exception]; } - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName | | < < | 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 | didResolveDomainName: _domainName socketAddresses: (exception == nil ? addresses : nil) exception: exception]; } - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName response: (OFDNSResponse *)response context: (OFNumber *)context exception: (id)exception { /* * TODO: Error handling could be improved. Ignore error if there are * responses, otherwise propagate error. */ |
︙ | ︙ | |||
1076 1077 1078 1079 1080 1081 1082 | if (exception != nil) { if (_expectedResponses == 0) [self done]; return; } | | | < | 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 | if (exception != nil) { if (_expectedResponses == 0) [self done]; return; } [self parseRecords: [response.answerRecords objectForKey: _domainName] response: response recordType: recordType recursion: CNAME_RECURSION result: _records]; if (_expectedResponses == 0) [self done]; } |
︙ | ︙ | |||
1650 1651 1652 1653 1654 1655 1656 | runLoopMode: runLoopMode]; objc_autoreleasePoolPop(pool); } - (void)of_resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName | | < < | < < < < > < | < | < | | 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 | runLoopMode: runLoopMode]; objc_autoreleasePoolPop(pool); } - (void)of_resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName response: (OFDNSResponse *)response context: (id)delegate exception: (id)exception { if ([delegate respondsToSelector: @selector(resolver: didResolveDomainName:response:exception:)]) [delegate resolver: resolver didResolveDomainName: domainName response: response exception: exception]; } - (void)asyncResolveHost: (OFString *)host delegate: (id <OFDNSResolverDelegate>)delegate { [self of_asyncResolveHost: host recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: OF_DNS_RESOURCE_RECORD_TYPE_ALL runLoopMode: of_run_loop_mode_default target: self selector: @selector(of_resolver:didResolveDomainName: response:context:exception:) context: delegate]; } - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType delegate: (id <OFDNSResolverDelegate>)delegate { [self of_asyncResolveHost: host recordClass: recordClass recordType: recordType runLoopMode: of_run_loop_mode_default target: self selector: @selector(of_resolver:didResolveDomainName: response:context:exception:) context: delegate]; } - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType runLoopMode: (of_run_loop_mode_t)runLoopMode delegate: (id <OFDNSResolverDelegate>)delegate { [self of_asyncResolveHost: host recordClass: recordClass recordType: recordType runLoopMode: runLoopMode target: self selector: @selector(of_resolver:didResolveDomainName: response:context:exception:) context: delegate]; } - (void)of_asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType runLoopMode: (of_run_loop_mode_t)runLoopMode |
︙ | ︙ | |||
1859 1860 1861 1862 1863 1864 1865 | exception = [OFResolveHostFailedException exceptionWithHost: query->_host recordClass: query->_recordClass recordType: query->_recordType error: OF_DNS_RESOLVER_ERROR_TIMEOUT]; callback(query->_target, query->_selector, self, query->_domainName, | | > | 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 | exception = [OFResolveHostFailedException exceptionWithHost: query->_host recordClass: query->_recordClass recordType: query->_recordType error: OF_DNS_RESOLVER_ERROR_TIMEOUT]; callback(query->_target, query->_selector, self, query->_domainName, nil, query->_context, exception); } - (bool)socket: (OFUDPSocket *)sock didReceiveIntoBuffer: (void *)buffer_ length: (size_t)length sender: (const of_socket_address_t *)sender exception: (id)exception { unsigned char *buffer = buffer_; OFDictionary *answerRecords = nil, *authorityRecords = nil; OFDictionary *additionalRecords = nil; OFDNSResponse *response = nil; OFNumber *ID; OFDNSResolverQuery *query; if (exception != nil) return true; if (length < 2) |
︙ | ︙ | |||
1998 1999 2000 2001 2002 2003 2004 2005 2006 | } answerRecords = parseSection(buffer, length, &i, numAnswers); authorityRecords = parseSection(buffer, length, &i, numAuthorityRecords); additionalRecords = parseSection(buffer, length, &i, numAdditionalRecords); } @catch (id e) { callback(query->_target, query->_selector, self, | > > > > | < | | 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 | } answerRecords = parseSection(buffer, length, &i, numAnswers); authorityRecords = parseSection(buffer, length, &i, numAuthorityRecords); additionalRecords = parseSection(buffer, length, &i, numAdditionalRecords); response = [OFDNSResponse responseWithAnswerRecords: answerRecords authorityRecords: authorityRecords additionalRecords: additionalRecords]; } @catch (id e) { callback(query->_target, query->_selector, self, query->_domainName, nil, query->_context, e); return true; } callback(query->_target, query->_selector, self, query->_domainName, response, query->_context, nil); return true; } - (void)asyncResolveSocketAddressesForHost: (OFString *)host delegate: (id <OFDNSResolverDelegate>)delegate { |
︙ | ︙ | |||
2193 2194 2195 2196 2197 2198 2199 | [self of_asyncResolveHost: host recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: OF_DNS_RESOURCE_RECORD_TYPE_AAAA runLoopMode: runLoopMode target: context selector: @selector(resolver: didResolveDomainName: | < < | < < | | 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 | [self of_asyncResolveHost: host recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: OF_DNS_RESOURCE_RECORD_TYPE_AAAA runLoopMode: runLoopMode target: context selector: @selector(resolver: didResolveDomainName: response:context:exception:) context: recordTypeNumber]; } #endif if (addressFamily == OF_SOCKET_ADDRESS_FAMILY_IPV4 || addressFamily == OF_SOCKET_ADDRESS_FAMILY_ANY) [self of_asyncResolveHost: host recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: OF_DNS_RESOURCE_RECORD_TYPE_A runLoopMode: runLoopMode target: context selector: @selector(resolver: didResolveDomainName: response:context:exception:) context: [OFNumber numberWithInt: OF_DNS_RESOURCE_RECORD_TYPE_A]]; objc_autoreleasePoolPop(pool); } - (OFData *)resolveSocketAddressesForHost: (OFString *)host |
︙ | ︙ | |||
2280 2281 2282 2283 2284 2285 2286 | exception = [OFResolveHostFailedException exceptionWithHost: query->_host recordClass: query->_recordClass recordType: query->_recordType error: OF_DNS_RESOLVER_ERROR_CANCELED]; callback(query->_target, query->_selector, self, | | < | 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 | exception = [OFResolveHostFailedException exceptionWithHost: query->_host recordClass: query->_recordClass recordType: query->_recordType error: OF_DNS_RESOLVER_ERROR_CANCELED]; callback(query->_target, query->_selector, self, query->_domainName, nil, query->_context, exception); } [_queries removeAllObjects]; objc_autoreleasePoolPop(pool); } @end |
Added src/OFDNSResponse.h version [11c8212a83].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #import "OFDNSResourceRecord.h" OF_ASSUME_NONNULL_BEGIN @class OFArray OF_GENERIC(ObjectType); @class OFDictionary OF_GENERIC(KeyType, ObjectType); typedef OFDictionary OF_GENERIC(OFString *, OFArray OF_GENERIC( OF_KINDOF(OFDNSResourceRecord *)) *) *of_dns_response_records_t; /*! * @class OFDNSResponse OFDNSResponse.h ObjFW/OFDNSResponse.h * * @brief A class storing a response from @ref OFDNSResolver. */ @interface OFDNSResponse: OFObject { of_dns_response_records_t _Nullable _answerRecords; of_dns_response_records_t _Nullable _authorityRecords; of_dns_response_records_t _Nullable _additionalRecords; OF_RESERVE_IVARS(4) } /*! * @brief The answer records of the response. */ @property OF_NULLABLE_PROPERTY (nonatomic, readonly) of_dns_response_records_t answerRecords; /*! * @brief The authority records of the response. */ @property OF_NULLABLE_PROPERTY (nonatomic, readonly) of_dns_response_records_t authorityRecords; /*! * @brief The additional records of the response. */ @property OF_NULLABLE_PROPERTY (nonatomic, readonly) of_dns_response_records_t additionalRecords; /*! * @brief Creates a new, autoreleased OFDNSResponse. * * @param answerRecords The answer records of the response * @param authorityRecords The authority records of the response * @param additionalRecords The additional records of the response * @return A new, autoreleased OFDNSResponse */ + (instancetype) responseWithAnswerRecords: (nullable of_dns_response_records_t)answerRecords authorityRecords: (nullable of_dns_response_records_t) authorityRecords additionalRecords: (nullable of_dns_response_records_t) additionalRecords; /*! * @brief Initializes an already allocated OFDNSResponse. * * @param answerRecords The answer records of the response * @param authorityRecords The authority records of the response * @param additionalRecords The additional records of the response * @return An initialized OFDNSResponse */ - (instancetype) initWithAnswerRecords: (nullable of_dns_response_records_t)answerRecords authorityRecords: (nullable of_dns_response_records_t)authorityRecords additionalRecords: (nullable of_dns_response_records_t)additionalRecords OF_DESIGNATED_INITIALIZER; - (instancetype)init OF_UNAVAILABLE; @end OF_ASSUME_NONNULL_END |
Added src/OFDNSResponse.m version [5e9ff2a6f6].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #import "OFDNSResponse.h" #import "OFDictionary.h" #import "OFString.h" @implementation OFDNSResponse @synthesize answerRecords = _answerRecords; @synthesize authorityRecords = _authorityRecords; @synthesize additionalRecords = _additionalRecords; + (instancetype) responseWithAnswerRecords: (of_dns_response_records_t)answerRecords authorityRecords: (of_dns_response_records_t)authorityRecords additionalRecords: (of_dns_response_records_t)additionalRecords { return [[[self alloc] initWithAnswerRecords: answerRecords authorityRecords: authorityRecords additionalRecords: additionalRecords] autorelease]; } - (instancetype) initWithAnswerRecords: (of_dns_response_records_t)answerRecords authorityRecords: (of_dns_response_records_t)authorityRecords additionalRecords: (of_dns_response_records_t)additionalRecords { self = [super init]; @try { _answerRecords = [answerRecords copy]; _authorityRecords = [authorityRecords copy]; _additionalRecords = [additionalRecords copy]; } @catch (id e) { [self release]; @throw e; } return self; } - (instancetype)init OF_UNAVAILABLE { OF_INVALID_INIT_METHOD } - (void)dealloc { [_answerRecords release]; [_authorityRecords release]; [_additionalRecords release]; [super dealloc]; } - (bool)isEqual: (id)object { OFDNSResponse *other; if (![object isKindOfClass: [OFDNSResponse class]]) return false; other = object; if (other->_answerRecords != _answerRecords && ![other->_answerRecords isEqual: _answerRecords]) return false; if (other->_authorityRecords != _authorityRecords && ![other->_authorityRecords isEqual: _authorityRecords]) return false; if (other->_additionalRecords != _additionalRecords && ![other->_additionalRecords isEqual: _additionalRecords]) return false; return true; } - (uint32_t)hash { uint32_t hash; OF_HASH_INIT(hash); OF_HASH_ADD_HASH(hash, [_answerRecords hash]); OF_HASH_ADD_HASH(hash, [_authorityRecords hash]); OF_HASH_ADD_HASH(hash, [_additionalRecords hash]); OF_HASH_FINALIZE(hash); return hash; } - (OFString *)description { OFString *answerRecords = [_answerRecords.description stringByReplacingOccurrencesOfString: @"\n" withString: @"\n\t"]; OFString *authorityRecords = [_authorityRecords.description stringByReplacingOccurrencesOfString: @"\n" withString: @"\n\t"]; OFString *additionalRecords = [_additionalRecords.description stringByReplacingOccurrencesOfString: @"\n" withString: @"\n\t"]; return [OFString stringWithFormat: @"<OFDNSResponse:\n" @"\tAnswer records = %@\n" @"\tAuthority records = %@\n" @"\tAdditional records = %@\n" @">", answerRecords, authorityRecords, additionalRecords]; } @end |
Modified src/ObjFW.h from [9b95780617] to [3294117378].
︙ | ︙ | |||
71 72 73 74 75 76 77 | #endif #ifdef OF_HAVE_SOCKETS # import "OFStreamSocket.h" # import "OFTCPSocket.h" # import "OFUDPSocket.h" # import "OFTLSSocket.h" # import "OFKernelEventObserver.h" | | | > | 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #endif #ifdef OF_HAVE_SOCKETS # import "OFStreamSocket.h" # import "OFTCPSocket.h" # import "OFUDPSocket.h" # import "OFTLSSocket.h" # import "OFKernelEventObserver.h" # import "OFDNSResourceRecord.h" # import "OFDNSResponse.h" # import "OFDNSResolver.h" #endif #ifdef OF_HAVE_SOCKETS # ifdef OF_HAVE_THREADS # import "OFHTTPClient.h" # endif # import "OFHTTPCookie.h" # import "OFHTTPCookieManager.h" |
︙ | ︙ |
Modified utils/ofdns/OFDNS.m from [ac49749d23] to [86ae145db7].
︙ | ︙ | |||
27 28 29 30 31 32 33 | @end OF_APPLICATION_DELEGATE(OFDNS) @implementation OFDNS - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName | | < < | < < | < | 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 | @end OF_APPLICATION_DELEGATE(OFDNS) @implementation OFDNS - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName response: (OFDNSResponse *)response exception: (id)exception { if (exception != nil) { [of_stderr writeFormat: @"Failed to resolve: %@\n", exception]; [OFApplication terminateWithStatus: 1]; } [of_stdout writeFormat: @"FQDN: %@\n" @"Response: %@\n", domainName, response]; [OFApplication terminate]; } - (void)applicationDidFinishLaunching { OFArray OF_GENERIC(OFString *) *arguments = [OFApplication arguments]; |
︙ | ︙ |