aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xmlhttprequest.rs
diff options
context:
space:
mode:
authorTim Neumann <mail@timnn.me>2016-02-16 20:57:56 +0100
committerTim Neumann <mail@timnn.me>2016-02-23 15:21:35 +0100
commit746f7dd29eb5d71b211a48b3b5a2b70d7a7f340e (patch)
treebad110f87f177e4ae2b64080fcbf49b606053723 /components/script/dom/xmlhttprequest.rs
parent3af3926d632cf913bb55e944df54e744e0b52534 (diff)
downloadservo-746f7dd29eb5d71b211a48b3b5a2b70d7a7f340e.tar.gz
servo-746f7dd29eb5d71b211a48b3b5a2b70d7a7f340e.zip
move method from ByteString to module where it was used
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r--components/script/dom/xmlhttprequest.rs66
1 files changed, 65 insertions, 1 deletions
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index 947835f11b9..45fa9e1f58f 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -413,7 +413,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
}
// FIXME(#9548): Step 3. Normalize value
// Step 4
- if !is_token(&name) || !value.is_field_value() {
+ if !is_token(&name) || !is_field_value(&value) {
return Err(Error::Syntax);
}
let name_lower = name.to_lower();
@@ -1388,3 +1388,67 @@ impl Extractable for SendParam {
}
}
}
+
+/// Returns whether `bs` is a `field-value`, as defined by
+/// [RFC 2616](http://tools.ietf.org/html/rfc2616#page-32).
+pub fn is_field_value(slice: &[u8]) -> bool {
+ // Classifications of characters necessary for the [CRLF] (SP|HT) rule
+ #[derive(PartialEq)]
+ enum PreviousCharacter {
+ Other,
+ CR,
+ LF,
+ SPHT, // SP or HT
+ }
+ let mut prev = PreviousCharacter::Other; // The previous character
+ slice.iter().all(|&x| {
+ // http://tools.ietf.org/html/rfc2616#section-2.2
+ match x {
+ 13 => { // CR
+ if prev == PreviousCharacter::Other || prev == PreviousCharacter::SPHT {
+ prev = PreviousCharacter::CR;
+ true
+ } else {
+ false
+ }
+ },
+ 10 => { // LF
+ if prev == PreviousCharacter::CR {
+ prev = PreviousCharacter::LF;
+ true
+ } else {
+ false
+ }
+ },
+ 32 => { // SP
+ if prev == PreviousCharacter::LF || prev == PreviousCharacter::SPHT {
+ prev = PreviousCharacter::SPHT;
+ true
+ } else if prev == PreviousCharacter::Other {
+ // Counts as an Other here, since it's not preceded by a CRLF
+ // SP is not a CTL, so it can be used anywhere
+ // though if used immediately after a CR the CR is invalid
+ // We don't change prev since it's already Other
+ true
+ } else {
+ false
+ }
+ },
+ 9 => { // HT
+ if prev == PreviousCharacter::LF || prev == PreviousCharacter::SPHT {
+ prev = PreviousCharacter::SPHT;
+ true
+ } else {
+ false
+ }
+ },
+ 0...31 | 127 => false, // CTLs
+ x if x > 127 => false, // non ASCII
+ _ if prev == PreviousCharacter::Other || prev == PreviousCharacter::SPHT => {
+ prev = PreviousCharacter::Other;
+ true
+ },
+ _ => false // Previous character was a CR/LF but not part of the [CRLF] (SP|HT) rule
+ }
+ })
+}