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
use mime::Mime; use header::QualityItem; header! { /// `Accept` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.3.2) /// /// The `Accept` header field can be used by user agents to specify /// response media types that are acceptable. Accept header fields can /// be used to indicate that the request is specifically limited to a /// small set of desired types, as in the case of a request for an /// in-line image /// /// # ABNF /// ```plain /// Accept = #( media-range [ accept-params ] ) /// /// media-range = ( "*/*" /// / ( type "/" "*" ) /// / ( type "/" subtype ) /// ) *( OWS ";" OWS parameter ) /// accept-params = weight *( accept-ext ) /// accept-ext = OWS ";" OWS token [ "=" ( token / quoted-string ) ] /// ``` /// /// # Example values /// * `audio/*; q=0.2, audio/basic` (`*` value won't parse correctly) /// * `text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c` /// /// # Examples /// ``` /// use hyper::header::{Headers, Accept, qitem}; /// use hyper::mime::{Mime, TopLevel, SubLevel}; /// /// let mut headers = Headers::new(); /// /// headers.set( /// Accept(vec![ /// qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])), /// ]) /// ); /// ``` /// ``` /// use hyper::header::{Headers, Accept, qitem}; /// use hyper::mime::{Mime, TopLevel, SubLevel, Attr, Value}; /// /// let mut headers = Headers::new(); /// headers.set( /// Accept(vec![ /// qitem(Mime(TopLevel::Application, SubLevel::Json, /// vec![(Attr::Charset, Value::Utf8)])), /// ]) /// ); /// ``` /// ``` /// use hyper::header::{Headers, Accept, QualityItem, Quality, qitem}; /// use hyper::mime::{Mime, TopLevel, SubLevel}; /// /// let mut headers = Headers::new(); /// /// headers.set( /// Accept(vec![ /// qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])), /// qitem(Mime(TopLevel::Application, /// SubLevel::Ext("xhtml+xml".to_owned()), vec![])), /// QualityItem::new(Mime(TopLevel::Application, SubLevel::Xml, vec![]), /// Quality(900)), /// qitem(Mime(TopLevel::Image, /// SubLevel::Ext("webp".to_owned()), vec![])), /// QualityItem::new(Mime(TopLevel::Star, SubLevel::Star, vec![]), /// Quality(800)) /// ]) /// ); /// ``` /// /// # Notes /// * Using always Mime types to represent `media-range` differs from the ABNF. /// * **FIXME**: `accept-ext` is not supported. (Accept, "Accept") => (QualityItem<Mime>)+ test_accept { // Tests from the RFC // FIXME: Test fails, first value containing a "*" fails to parse // test_header!( // test1, // vec![b"audio/*; q=0.2, audio/basic"], // Some(HeaderField(vec![ // QualityItem::new(Mime(TopLevel::Audio, SubLevel::Star, vec![]), Quality(200)), // qitem(Mime(TopLevel::Audio, SubLevel::Ext("basic".to_owned()), vec![])), // ]))); test_header!( test2, vec![b"text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c"], Some(HeaderField(vec![ QualityItem::new(Mime(TopLevel::Text, SubLevel::Plain, vec![]), Quality(500)), qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])), QualityItem::new( Mime(TopLevel::Text, SubLevel::Ext("x-dvi".to_owned()), vec![]), Quality(800)), qitem(Mime(TopLevel::Text, SubLevel::Ext("x-c".to_owned()), vec![])), ]))); // Custom tests test_header!( test3, vec![b"text/plain; charset=utf-8"], Some(Accept(vec![ qitem(Mime(TopLevel::Text, SubLevel::Plain, vec![(Attr::Charset, Value::Utf8)])), ]))); test_header!( test4, vec![b"text/plain; charset=utf-8; q=0.5"], Some(Accept(vec![ QualityItem::new(Mime(TopLevel::Text, SubLevel::Plain, vec![(Attr::Charset, Value::Utf8)]), Quality(500)), ]))); } } bench_header!(bench, Accept, { vec![b"text/plain; q=0.5, text/html".to_vec()] });