mirror of
https://github.com/Orange-OpenSource/hurl.git
synced 2024-12-26 12:32:06 +03:00
Merge pull request #229 from Orange-OpenSource/feature/add-hex-body
Add hex body
This commit is contained in:
commit
97c7aee595
@ -1 +1 @@
|
|||||||
{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/assert-base64"},"response":{"version":"HTTP/1.0","status":200,"body":{"type":"base64","value":"bGluZTEKbGluZTINCmxpbmUzCg=="}}}]}
|
{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/assert-base64"},"response":{"version":"HTTP/1.0","status":200,"body":{"encoding":"base64","value":"bGluZTEKbGluZTINCmxpbmUzCg=="}}}]}
|
@ -2,6 +2,6 @@ error: Assert Body Value
|
|||||||
--> tests/error_assert_base64.hurl:12:8
|
--> tests/error_assert_base64.hurl:12:8
|
||||||
|
|
|
|
||||||
12 | base64,bGluZTEKbGluZTIKbGluZTMK;
|
12 | base64,bGluZTEKbGluZTIKbGluZTMK;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ actual value is <Bytes([6c, 69, 6e, 65, 31, a, 6c, 69, 6e, 65, 32, d, a, 6c, 69, 6e, 65, 33, a])>
|
| ^^^^^^^^^^^^^^^^^^^^^^^^ actual value is <hex, 6c696e65310a6c696e65320d0a6c696e65330a;>
|
||||||
|
|
|
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/assert-base64"},"response":{"version":"HTTP/1.0","status":200,"body":{"type":"base64","value":"bGluZTEKbGluZTIKbGluZTMK"}}}]}
|
{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/assert-base64"},"response":{"version":"HTTP/1.0","status":200,"body":{"encoding":"base64","value":"bGluZTEKbGluZTIKbGluZTMK"}}}]}
|
@ -2,6 +2,6 @@ error: Assert Body Value
|
|||||||
--> tests/error_assert_file.hurl:8:1
|
--> tests/error_assert_file.hurl:8:1
|
||||||
|
|
|
|
||||||
8 | file,data.txt;
|
8 | file,data.txt;
|
||||||
| ^ actual value is <Bytes([48, 65, 6c, 6c, 6f])>
|
| ^ actual value is <hex, 48656c6c6f;>
|
||||||
|
|
|
|
||||||
|
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
curl 'http://localhost:8000/hello'
|
curl 'http://localhost:8000/hello'
|
||||||
curl 'http://localhost:8000/hello'
|
curl 'http://localhost:8000/hello'
|
||||||
|
curl 'http://localhost:8000/hello'
|
||||||
|
curl 'http://localhost:8000/hello'
|
@ -1 +1 @@
|
|||||||
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/hello</span></span></div><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span><span class="line">```Hello World!```</span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/hello</span></span></div><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span><span class="line"><span>file, data.txt;</span></span></div></div></div>
|
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/hello</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span><span class="line">```Hello World!```</span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/hello</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span><span class="line"><span>file, data.txt;</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/hello</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span><span class="line"><span>hex, 48656c6c6f20576f726c6421;</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/hello</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span><span class="line"><span>base64, SGVsbG8gV29ybGQh;</span></span></div></div></div>
|
@ -1,10 +1,15 @@
|
|||||||
GET http://localhost:8000/hello
|
GET http://localhost:8000/hello
|
||||||
|
|
||||||
HTTP/1.0 200
|
HTTP/1.0 200
|
||||||
```Hello World!```
|
```Hello World!```
|
||||||
|
|
||||||
|
|
||||||
GET http://localhost:8000/hello
|
GET http://localhost:8000/hello
|
||||||
|
|
||||||
HTTP/1.0 200
|
HTTP/1.0 200
|
||||||
file, data.txt;
|
file, data.txt;
|
||||||
|
|
||||||
|
GET http://localhost:8000/hello
|
||||||
|
HTTP/1.0 200
|
||||||
|
hex, 48656c6c6f20576f726c6421;
|
||||||
|
|
||||||
|
GET http://localhost:8000/hello
|
||||||
|
HTTP/1.0 200
|
||||||
|
base64, SGVsbG8gV29ybGQh;
|
||||||
|
@ -1 +1 @@
|
|||||||
{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/hello"},"response":{"version":"HTTP/1.0","status":200,"body":{"type":"raw-string","value":"Hello World!"}}},{"request":{"method":"GET","url":"http://localhost:8000/hello"},"response":{"version":"HTTP/1.0","status":200,"body":{"type":"file","filename":"data.txt"}}}]}
|
{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/hello"},"response":{"version":"HTTP/1.0","status":200,"body":{"type":"raw-string","value":"Hello World!"}}},{"request":{"method":"GET","url":"http://localhost:8000/hello"},"response":{"version":"HTTP/1.0","status":200,"body":{"type":"file","filename":"data.txt"}}},{"request":{"method":"GET","url":"http://localhost:8000/hello"},"response":{"version":"HTTP/1.0","status":200,"body":{"encoding":"base64","value":"SGVsbG8gV29ybGQh"}}},{"request":{"method":"GET","url":"http://localhost:8000/hello"},"response":{"version":"HTTP/1.0","status":200,"body":{"encoding":"base64","value":"SGVsbG8gV29ybGQh"}}}]}
|
@ -1 +1 @@
|
|||||||
{"entries":[{"request":{"method":"POST","url":"http://localhost:8000/post-base64","body":{"type":"base64","value":"SGVsbG8gV29ybGQh"}},"response":{"version":"HTTP/1.0","status":200}}]}
|
{"entries":[{"request":{"method":"POST","url":"http://localhost:8000/post-base64","body":{"encoding":"base64","value":"SGVsbG8gV29ybGQh"}},"response":{"version":"HTTP/1.0","status":200}}]}
|
@ -1 +1 @@
|
|||||||
{"entries":[{"request":{"method":"POST","url":"http://localhost:8000/post-bytes","headers":[{"name":"Content-Type","value":"application/octet-stream"}],"body":{"type":"base64","value":"AQID"}},"response":{"version":"HTTP/1.0","status":200}}]}
|
{"entries":[{"request":{"method":"POST","url":"http://localhost:8000/post-bytes","headers":[{"name":"Content-Type","value":"application/octet-stream"}],"body":{"encoding":"base64","value":"AQID"}},"response":{"version":"HTTP/1.0","status":200}}]}
|
@ -52,10 +52,8 @@ pub fn eval_bytes(
|
|||||||
Ok(http::Body::Text(value))
|
Ok(http::Body::Text(value))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Body:: Binary
|
|
||||||
Bytes::Base64(Base64 { value, .. }) => Ok(http::Body::Binary(value)),
|
Bytes::Base64(Base64 { value, .. }) => Ok(http::Body::Binary(value)),
|
||||||
|
Bytes::Hex(Hex { value, .. }) => Ok(http::Body::Binary(value)),
|
||||||
// Body::File
|
|
||||||
Bytes::File(File { filename, .. }) => {
|
Bytes::File(File { filename, .. }) => {
|
||||||
let f = filename.value.as_str();
|
let f = filename.value.as_str();
|
||||||
let path = Path::new(f);
|
let path = Path::new(f);
|
||||||
|
@ -188,6 +188,19 @@ pub fn eval_asserts(
|
|||||||
end: space1.source_info.start,
|
end: space1.source_info.start,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
Bytes::Hex(Hex {
|
||||||
|
value,
|
||||||
|
space0,
|
||||||
|
space1,
|
||||||
|
..
|
||||||
|
}) => asserts.push(AssertResult::Body {
|
||||||
|
actual: Ok(Value::Bytes(http_response.body.clone())),
|
||||||
|
expected: Ok(Value::Bytes(value)),
|
||||||
|
source_info: SourceInfo {
|
||||||
|
start: space0.source_info.end,
|
||||||
|
end: space1.source_info.start,
|
||||||
|
},
|
||||||
|
}),
|
||||||
Bytes::File { .. } => {
|
Bytes::File { .. } => {
|
||||||
let expected = match eval_body(body.clone(), variables, context_dir) {
|
let expected = match eval_body(body.clone(), variables, context_dir) {
|
||||||
Ok(body) => Ok(Value::Bytes(body.bytes())),
|
Ok(body) => Ok(Value::Bytes(body.bytes())),
|
||||||
|
@ -54,7 +54,7 @@ impl fmt::Display for Value {
|
|||||||
}
|
}
|
||||||
Value::Object(_) => "Object()".to_string(),
|
Value::Object(_) => "Object()".to_string(),
|
||||||
Value::Nodeset(x) => format!("Nodeset{:?}", x),
|
Value::Nodeset(x) => format!("Nodeset{:?}", x),
|
||||||
Value::Bytes(x) => format!("Bytes({:x?})", x),
|
Value::Bytes(v) => format!("hex, {};", hex::encode(v)),
|
||||||
Value::Null => "null".to_string(),
|
Value::Null => "null".to_string(),
|
||||||
Value::Unit => "Unit".to_string(),
|
Value::Unit => "Unit".to_string(),
|
||||||
};
|
};
|
||||||
|
@ -570,6 +570,7 @@ pub enum Bytes {
|
|||||||
RawString(RawString),
|
RawString(RawString),
|
||||||
Base64(Base64),
|
Base64(Base64),
|
||||||
File(File),
|
File(File),
|
||||||
|
Hex(Hex),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
|
@ -664,6 +664,9 @@ impl Htmlable for Bytes {
|
|||||||
Bytes::Base64(value) => {
|
Bytes::Base64(value) => {
|
||||||
buffer.push_str(value.to_html().as_str());
|
buffer.push_str(value.to_html().as_str());
|
||||||
}
|
}
|
||||||
|
Bytes::Hex(value) => {
|
||||||
|
buffer.push_str(value.to_html().as_str());
|
||||||
|
}
|
||||||
Bytes::File(value) => {
|
Bytes::File(value) => {
|
||||||
buffer.push_str(value.to_html().as_str());
|
buffer.push_str(value.to_html().as_str());
|
||||||
}
|
}
|
||||||
@ -763,6 +766,18 @@ impl Htmlable for Base64 {
|
|||||||
buffer
|
buffer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
impl Htmlable for Hex {
|
||||||
|
fn to_html(&self) -> String {
|
||||||
|
let mut buffer = String::from("<span>");
|
||||||
|
buffer.push_str("hex,");
|
||||||
|
buffer.push_str(self.space0.to_html().as_str());
|
||||||
|
buffer.push_str(self.encoded.as_str());
|
||||||
|
buffer.push_str(self.space1.to_html().as_str());
|
||||||
|
buffer.push(';');
|
||||||
|
buffer.push_str("</span>");
|
||||||
|
buffer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Htmlable for EncodedString {
|
impl Htmlable for EncodedString {
|
||||||
fn to_html(&self) -> String {
|
fn to_html(&self) -> String {
|
||||||
|
@ -32,6 +32,7 @@ pub fn bytes(reader: &mut Reader) -> ParseResult<'static, Bytes> {
|
|||||||
json_bytes,
|
json_bytes,
|
||||||
xml_bytes,
|
xml_bytes,
|
||||||
base64_bytes,
|
base64_bytes,
|
||||||
|
hex_bytes,
|
||||||
file_bytes,
|
file_bytes,
|
||||||
],
|
],
|
||||||
reader,
|
reader,
|
||||||
@ -63,6 +64,10 @@ fn base64_bytes(reader: &mut Reader) -> ParseResult<'static, Bytes> {
|
|||||||
base64(reader).map(Bytes::Base64)
|
base64(reader).map(Bytes::Base64)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn hex_bytes(reader: &mut Reader) -> ParseResult<'static, Bytes> {
|
||||||
|
hex(reader).map(Bytes::Hex)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
|
@ -142,6 +142,7 @@ impl ToJson for Bytes {
|
|||||||
fn to_json(&self) -> JValue {
|
fn to_json(&self) -> JValue {
|
||||||
match self {
|
match self {
|
||||||
Bytes::Base64(value) => value.to_json(),
|
Bytes::Base64(value) => value.to_json(),
|
||||||
|
Bytes::Hex(value) => value.to_json(),
|
||||||
Bytes::File(value) => value.to_json(),
|
Bytes::File(value) => value.to_json(),
|
||||||
Bytes::Json { value } => JValue::Object(vec![
|
Bytes::Json { value } => JValue::Object(vec![
|
||||||
("type".to_string(), JValue::String("json".to_string())),
|
("type".to_string(), JValue::String("json".to_string())),
|
||||||
@ -162,8 +163,22 @@ impl ToJson for Bytes {
|
|||||||
impl ToJson for Base64 {
|
impl ToJson for Base64 {
|
||||||
fn to_json(&self) -> JValue {
|
fn to_json(&self) -> JValue {
|
||||||
JValue::Object(vec![
|
JValue::Object(vec![
|
||||||
("type".to_string(), JValue::String("base64".to_string())),
|
("encoding".to_string(), JValue::String("base64".to_string())),
|
||||||
("value".to_string(), JValue::String(self.encoded.clone())),
|
(
|
||||||
|
"value".to_string(),
|
||||||
|
JValue::String(base64::encode(&self.value)),
|
||||||
|
),
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl ToJson for Hex {
|
||||||
|
fn to_json(&self) -> JValue {
|
||||||
|
JValue::Object(vec![
|
||||||
|
("encoding".to_string(), JValue::String("base64".to_string())),
|
||||||
|
(
|
||||||
|
"value".to_string(),
|
||||||
|
JValue::String(base64::encode(&self.value)),
|
||||||
|
),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,6 +198,9 @@ impl Tokenizable for Bytes {
|
|||||||
Bytes::Base64(value) => {
|
Bytes::Base64(value) => {
|
||||||
tokens.append(&mut value.tokenize());
|
tokens.append(&mut value.tokenize());
|
||||||
}
|
}
|
||||||
|
Bytes::Hex(value) => {
|
||||||
|
tokens.append(&mut value.tokenize());
|
||||||
|
}
|
||||||
Bytes::File(value) => {
|
Bytes::File(value) => {
|
||||||
tokens.append(&mut value.tokenize());
|
tokens.append(&mut value.tokenize());
|
||||||
}
|
}
|
||||||
@ -282,6 +285,17 @@ impl Tokenizable for Base64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Tokenizable for Hex {
|
||||||
|
fn tokenize(&self) -> Vec<Token> {
|
||||||
|
let mut tokens: Vec<Token> = vec![Token::Keyword(String::from("hex,"))];
|
||||||
|
add_tokens(&mut tokens, self.space0.tokenize());
|
||||||
|
tokens.push(Token::String(self.encoded.to_string()));
|
||||||
|
add_tokens(&mut tokens, self.space1.tokenize());
|
||||||
|
tokens.push(Token::Keyword(String::from(";")));
|
||||||
|
tokens
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Tokenizable for File {
|
impl Tokenizable for File {
|
||||||
fn tokenize(&self) -> Vec<Token> {
|
fn tokenize(&self) -> Vec<Token> {
|
||||||
let mut tokens: Vec<Token> = vec![Token::Keyword(String::from("file,"))];
|
let mut tokens: Vec<Token> = vec![Token::Keyword(String::from("file,"))];
|
||||||
|
@ -560,6 +560,7 @@ impl Lintable<Bytes> for Bytes {
|
|||||||
match self {
|
match self {
|
||||||
Bytes::File(value) => Bytes::File(value.lint()),
|
Bytes::File(value) => Bytes::File(value.lint()),
|
||||||
Bytes::Base64(value) => Bytes::Base64(value.lint()),
|
Bytes::Base64(value) => Bytes::Base64(value.lint()),
|
||||||
|
Bytes::Hex(value) => Bytes::Hex(value.lint()),
|
||||||
Bytes::Json { value } => Bytes::Json {
|
Bytes::Json { value } => Bytes::Json {
|
||||||
value: value.clone(),
|
value: value.clone(),
|
||||||
},
|
},
|
||||||
@ -586,6 +587,21 @@ impl Lintable<Base64> for Base64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Lintable<Hex> for Hex {
|
||||||
|
fn errors(&self) -> Vec<Error> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn lint(&self) -> Hex {
|
||||||
|
Hex {
|
||||||
|
space0: one_whitespace(),
|
||||||
|
value: self.value.clone(),
|
||||||
|
encoded: self.encoded.clone(),
|
||||||
|
space1: empty_whitespace(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Lintable<File> for File {
|
impl Lintable<File> for File {
|
||||||
fn errors(&self) -> Vec<Error> {
|
fn errors(&self) -> Vec<Error> {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
@ -688,20 +704,6 @@ fn one_whitespace() -> Whitespace {
|
|||||||
source_info: SourceInfo::init(0, 0, 0, 0),
|
source_info: SourceInfo::init(0, 0, 0, 0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl Lintable<Hex> for Hex {
|
|
||||||
fn errors(&self) -> Vec<Error> {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn lint(&self) -> Hex {
|
|
||||||
Hex {
|
|
||||||
space0: one_whitespace(),
|
|
||||||
value: self.value.clone(),
|
|
||||||
encoded: self.encoded.clone(),
|
|
||||||
space1: empty_whitespace(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Lintable<LineTerminator> for LineTerminator {
|
impl Lintable<LineTerminator> for LineTerminator {
|
||||||
fn errors(&self) -> Vec<Error> {
|
fn errors(&self) -> Vec<Error> {
|
||||||
|
Loading…
Reference in New Issue
Block a user