mirror of
https://github.com/Orange-OpenSource/hurl.git
synced 2024-11-26 11:43:08 +03:00
Merge pull request #47 from Orange-OpenSource/feature/expect-header
Add request Expect Header explicitly
This commit is contained in:
commit
7b08c7bcfb
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -25,7 +25,7 @@ jsonpath "$.nullable" equals null
|
||||
}
|
||||
|
||||
GET http://localhost:8000/assert-json/index
|
||||
HTTP/* 200
|
||||
HTTP/1.0 200
|
||||
[Captures]
|
||||
index: body
|
||||
|
||||
|
1
integration/tests/expect.exit
Normal file
1
integration/tests/expect.exit
Normal file
@ -0,0 +1 @@
|
||||
0
|
8
integration/tests/expect.hurl
Normal file
8
integration/tests/expect.hurl
Normal file
@ -0,0 +1,8 @@
|
||||
POST http://localhost:8000/expect
|
||||
Expect: 100-continue
|
||||
```data```
|
||||
|
||||
HTTP/1.0 200
|
||||
|
||||
|
||||
|
0
integration/tests/expect.out
Normal file
0
integration/tests/expect.out
Normal file
11
integration/tests/expect.py
Normal file
11
integration/tests/expect.py
Normal file
@ -0,0 +1,11 @@
|
||||
from tests import app
|
||||
from flask import request
|
||||
|
||||
@app.route("/expect", methods=['POST'])
|
||||
def expect():
|
||||
assert request.headers['Expect'] == '100-continue'
|
||||
s = request.data.decode("utf-8")
|
||||
assert s == '''data'''
|
||||
return ''
|
||||
|
||||
|
@ -6,7 +6,7 @@ upload1: file,hello.txt;
|
||||
upload2: file,hello.html;
|
||||
upload3: file,hello.txt; text/html
|
||||
|
||||
HTTP/* 200
|
||||
HTTP/1.0 200
|
||||
|
||||
|
||||
|
||||
|
@ -6,6 +6,7 @@ from flask import request
|
||||
def multipart_form_data():
|
||||
|
||||
assert request.form['key1'] == 'value1'
|
||||
assert 'Expect' not in request.headers
|
||||
|
||||
upload1 = request.files['upload1']
|
||||
assert upload1.filename == 'hello.txt'
|
||||
|
@ -38,6 +38,7 @@ pub enum HttpError {
|
||||
SSLCertificate,
|
||||
InvalidUrl,
|
||||
Timeout,
|
||||
StatuslineIsMissing,
|
||||
Other { description: String, code: u32 },
|
||||
}
|
||||
|
||||
@ -152,7 +153,8 @@ impl Client {
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
let mut lines = vec![];
|
||||
let mut status_lines = vec![];
|
||||
let mut headers = vec![];
|
||||
let mut body = Vec::<u8>::new();
|
||||
{
|
||||
let mut transfer = self.handle.transfer();
|
||||
@ -165,7 +167,11 @@ impl Client {
|
||||
transfer
|
||||
.header_function(|h| {
|
||||
if let Some(s) = decode_header(h) {
|
||||
lines.push(s)
|
||||
if s.starts_with("HTTP/") {
|
||||
status_lines.push(s);
|
||||
} else {
|
||||
headers.push(s)
|
||||
}
|
||||
}
|
||||
true
|
||||
})
|
||||
@ -195,9 +201,11 @@ impl Client {
|
||||
}
|
||||
|
||||
let status = self.handle.response_code().unwrap();
|
||||
let first_line = lines.remove(0); // remove the status line
|
||||
let version = self.parse_response_version(first_line)?;
|
||||
let headers = self.parse_response_headers(&mut lines);
|
||||
let version = match status_lines.last() {
|
||||
None => return Err(HttpError::StatuslineIsMissing {}),
|
||||
Some(status_line) => self.parse_response_version(status_line.clone())?,
|
||||
};
|
||||
let headers = self.parse_response_headers(&headers);
|
||||
|
||||
if let Some(url) = self.get_follow_location(headers.clone()) {
|
||||
let request = Request {
|
||||
@ -289,6 +297,10 @@ impl Client {
|
||||
}
|
||||
}
|
||||
|
||||
if get_header_values(request.headers.clone(), "Expect".to_string()).is_empty() {
|
||||
list.append("Expect:").unwrap(); // remove header Expect
|
||||
}
|
||||
|
||||
// if request.form.is_empty() && request.multipart.is_empty() && request.body.is_empty() {
|
||||
// list.append("Content-Length:").unwrap();
|
||||
// }
|
||||
@ -391,9 +403,8 @@ impl Client {
|
||||
///
|
||||
/// parse headers from libcurl responses
|
||||
///
|
||||
fn parse_response_headers(&mut self, lines: &mut Vec<String>) -> Vec<Header> {
|
||||
fn parse_response_headers(&mut self, lines: &[String]) -> Vec<Header> {
|
||||
let mut headers: Vec<Header> = vec![];
|
||||
lines.pop(); // remove the blank line between headers and body
|
||||
for line in lines {
|
||||
if let Some(header) = Header::parse(line.to_string()) {
|
||||
headers.push(header);
|
||||
|
@ -110,6 +110,10 @@ pub fn run(
|
||||
HttpError::CouldNotParseResponse => RunnerError::CouldNotParseResponse,
|
||||
HttpError::SSLCertificate => RunnerError::SSLCertificate,
|
||||
HttpError::InvalidUrl => RunnerError::InvalidURL(http_request.url.clone()),
|
||||
HttpError::StatuslineIsMissing => RunnerError::HttpConnection {
|
||||
message: "status line is missing".to_string(),
|
||||
url: http_request.url.clone(),
|
||||
},
|
||||
HttpError::Other { description, .. } => RunnerError::HttpConnection {
|
||||
message: description,
|
||||
url: http_request.url.clone(),
|
||||
|
@ -427,6 +427,29 @@ fn test_post_bytes() {
|
||||
|
||||
// endregion
|
||||
|
||||
#[test]
|
||||
fn test_expect() {
|
||||
let mut client = default_client();
|
||||
let request = Request {
|
||||
method: Method::Post,
|
||||
url: "http://localhost:8000/expect".to_string(),
|
||||
headers: vec![Header {
|
||||
name: "Expect".to_string(),
|
||||
value: "100-continue".to_string(),
|
||||
}],
|
||||
querystring: vec![],
|
||||
form: vec![],
|
||||
multipart: vec![],
|
||||
cookies: vec![],
|
||||
body: b"data".to_vec(),
|
||||
content_type: None,
|
||||
};
|
||||
let response = client.execute(&request, 0).unwrap();
|
||||
assert_eq!(response.status, 200);
|
||||
assert_eq!(response.version, Version::Http10);
|
||||
assert!(response.body.is_empty());
|
||||
}
|
||||
|
||||
// region error
|
||||
|
||||
#[test]
|
||||
|
Loading…
Reference in New Issue
Block a user