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
/* * Copyright (C) 2015 Benjamin Fry <benjaminfry@me.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //! Record type for all cname like records. //! //! A generic struct for all {*}NAME pointer RData records, CNAME, NS, and PTR. Here is the text for //! CNAME from RFC 1035, Domain Implementation and Specification, November 1987: //! //! [RFC 1035, DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION, November 1987](https://tools.ietf.org/html/rfc1035) //! //! ```text //! 3.3.1. CNAME RDATA format //! //! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ //! / CNAME / //! / / //! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ //! //! where: //! //! CNAME A <domain-name> which specifies the canonical or primary //! name for the owner. The owner name is an alias. //! //! CNAME RRs cause no additional section processing, but name servers may //! choose to restart the query at the canonical name in certain cases. See //! the description of name server logic in [RFC-1034] for details. //! ``` use serialize::binary::*; use error::*; use rr::domain::Name; /// Read the RData from the given Decoder pub fn read(decoder: &mut BinDecoder) -> ProtoResult<Name> { Name::read(decoder) } /// [RFC 4034](https://tools.ietf.org/html/rfc4034#section-6), DNSSEC Resource Records, March 2005 /// /// This is accurate for all currently known name records. /// /// ```text /// 6.2. Canonical RR Form /// /// For the purposes of DNS security, the canonical form of an RR is the /// wire format of the RR where: /// /// ... /// /// 3. if the type of the RR is NS, MD, MF, CNAME, SOA, MB, MG, MR, PTR, /// HINFO, MINFO, MX, HINFO, RP, AFSDB, RT, SIG, PX, NXT, NAPTR, KX, /// SRV, DNAME, A6, RRSIG, or (rfc6840 removes NSEC), all uppercase /// US-ASCII letters in the DNS names contained within the RDATA are replaced /// by the corresponding lowercase US-ASCII letters; /// ``` pub fn emit(encoder: &mut BinEncoder, name_data: &Name) -> ProtoResult<()> { let is_canonical_names = encoder.is_canonical_names(); name_data.emit_with_lowercase(encoder, is_canonical_names)?; Ok(()) } #[test] pub fn test() { let rdata = Name::from_ascii("WWW.example.com.").unwrap(); let mut bytes = Vec::new(); let mut encoder: BinEncoder = BinEncoder::new(&mut bytes); assert!(emit(&mut encoder, &rdata).is_ok()); let bytes = encoder.into_bytes(); println!("bytes: {:?}", bytes); let mut decoder: BinDecoder = BinDecoder::new(bytes); let read_rdata = read(&mut decoder); assert!( read_rdata.is_ok(), format!("error decoding: {:?}", read_rdata.unwrap_err()) ); assert_eq!(rdata, read_rdata.unwrap()); }