Merge pull request #196 from Orange-OpenSource/feature/improve-hurl-report

Improve HTML report
This commit is contained in:
Fabrice Reix 2021-06-10 20:25:34 +02:00 committed by GitHub
commit f3a8aa7c49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
98 changed files with 5638 additions and 363 deletions

1
Cargo.lock generated
View File

@ -356,6 +356,7 @@ name = "hurl_core"
version = "1.3.0"
dependencies = [
"float-cmp",
"regex",
"sxd-document",
]

File diff suppressed because one or more lines are too long

View File

@ -6,11 +6,18 @@ thead {
font-weight: bolder;
}
.success {
td {
padding: 3px 5px;
}
.summary {
padding: 10px;
}
.success, .success a {
color: green;
}
.failure {
.failure, .failure a {
color: red;
}

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="comment"># Test body response with line ending LF and CRLF.</span></span><span class="line"><span class="comment"># We receive the text body "line1\nline2\r\nline3\n"</span></span><span class="line"><span class="comment">#</span></span><span class="line"><span class="comment"># $ printf "line1\nline2\r\nline3\n" | base64</span></span><span class="line"><span class="comment"># bGluZTEKbGluZTINCmxpbmUzCg==</span></span><span class="line"></span><span class="line"></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/assert-base64</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">base64,bGluZTEKbGluZTINCmxpbmUzCg==;</span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/assert-header</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 class="string">Content-Type</span><span>:</span> <span class="string">text/html; charset=utf-8</span></span><span class="line"><span class="string">Set-Cookie</span><span>:</span> <span class="string">cookie1=value1; Path=/</span></span><span class="line"><span class="string">Set-Cookie</span><span>:</span> <span class="string">cookie2=value2; Path=/</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">header</span> <span class="string">"Custom"</span> not <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">header</span> <span class="string">"Content-Type"</span> <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">header</span> <span class="string">"Header1"</span> <span class="predicate-type">equals</span> <span class="string">"value1"</span></span><span class="line"><span class="query-type">header</span> <span class="string">"ETag"</span> <span class="predicate-type">equals</span> <span class="string">""33a64df551425fcc55e4d42a148795d9f25f89d4""</span></span><span class="line"><span class="query-type">header</span> <span class="string">"Set-Cookie"</span> <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">header</span> <span class="string">"Set-Cookie"</span> <span class="predicate-type">equals</span> <span class="number">3</span></span><span class="line"><span class="query-type">header</span> <span class="string">"Set-Cookie"</span> <span class="predicate-type">includes</span> <span class="string">"cookie1=value1; Path=/"</span></span><span class="line"><span class="query-type">header</span> <span class="string">"Set-Cookie"</span> not <span class="predicate-type">includes</span> <span class="string">"cookie4=value4; Path=/"</span></span></div></div></div>
</body></html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/assert-match</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.date1"</span> <span class="predicate-type">matches</span> <span class="string">"\d{4}-\d{2}-\d{2}"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.date2"</span> <span class="predicate-type">matches</span> <span class="string">"\d{4}-\d{2}-\d{2}"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.date1"</span> <span class="predicate-type">matches</span> <span class="string">"^\d{4}-\d{2}-\d{2}$"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.date2"</span> not <span class="predicate-type">matches</span> <span class="string">"^\d{4}-\d{2}-\d{2}$"</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/assert-regex</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">regex</span> <span class="string">"Hello ([0-9]+)!"</span> not <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">regex</span> <span class="string">"Hello ([a-zA-Z]+)!"</span> <span class="predicate-type">equals</span> <span class="string">"World"</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/assert-status-code</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">201</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="comment"># simply check that the status code is not 200</span></span><span class="line"><span class="comment"># do not run implicit assert of http response version and code</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/assert-status-code</span></span></div><div class="response"><span class="line"><span class="version">HTTP/*</span> <span class="status">*</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">status</span> not <span class="predicate-type">equals</span> <span class="number">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"></span><span class="line"><span class="comment"># simply check that the status code is OK</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/assert-status-code</span></span></div><div class="response"><span class="line"><span class="version">HTTP/*</span> <span class="status">*</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">greaterThanOrEquals</span> <span class="number">200</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">lessThan</span> <span class="number">300</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/assert-xpath</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">xpath</span> <span class="string">"normalize-space(//data)"</span> <span class="predicate-type">equals</span> <span class="string">"café"</span></span><span class="line"><span class="query-type">xpath</span> <span class="string">"normalize-space(//data)"</span> <span class="predicate-type">equals</span> <span class="string">"café"</span></span><span class="line"><span class="query-type">xpath</span> <span class="string">"//toto"</span> not <span class="predicate-type">exists</span></span><span class="line"></span><span class="line">&amp;lt;data&amp;gt;café&amp;lt;/data&amp;gt;</div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/basic-authentication</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">```You are authenticated```</span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/utf8_bom</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><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/bytes</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 class="string">Content-Type</span><span>:</span> <span class="string">application/octet-stream</span></span><span class="line section-header">[Asserts]</span></span></div></div><span class="line"><span class="comment">#TODO create a bytes query to get e byte array</span></span><span class="line"><span class="comment">#body countEquals 1</span></span><span class="line"></span><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/capture-and-assert</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 section-header">[Captures]</span></span><span class="line">content_type<span>:</span> <span class="query-type">header</span> <span class="string">"content-type"</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">header</span> <span class="string">"content-type"</span> <span class="predicate-type">equals</span> <span class="string">"{{content_type}}"</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/captures</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 section-header">[Captures]</span></span><span class="line">param1<span>:</span> <span class="query-type">header</span> <span class="string">"header1"</span></span><span class="line">param2<span>:</span> <span class="query-type">header</span> <span class="string">"header2"</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"param1"</span> <span class="predicate-type">equals</span> <span class="string">"value1"</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"param2"</span> <span class="predicate-type">equals</span> <span class="string">"Bob"</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/captures-check</span></span></div><span class="line section-header">[QueryStringParams]</span></span><span class="line"><span class="string">param1</span><span>:</span> <span class="string">{{param1}}</span></span><span class="line"><span class="string">param2</span><span>:</span> <span class="string">{{param2}}</span></span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></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/captures-json</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 section-header">[Captures]</span></span><span class="line">an_object<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$['an_object']"</span></span><span class="line">a_list<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$['a_list']"</span></span><span class="line">a_null<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$['a_null']"</span></span><span class="line">an_integer<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$['an_integer']"</span></span><span class="line">a_float<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$['a_float']"</span></span><span class="line">a_bool<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$['a_bool']"</span></span><span class="line">a_string<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$['a_string']"</span></span><span class="line">all<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$"</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"a_null"</span> <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"undefined"</span> not <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"a_null"</span> <span class="predicate-type">equals</span> <span class="expr">{{a_null}}</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"an_integer"</span> <span class="predicate-type">equals</span> <span class="expr">{{an_integer}}</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"a_float"</span> <span class="predicate-type">equals</span> <span class="expr">{{a_float}}</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"a_bool"</span> <span class="predicate-type">equals</span> <span class="expr">{{a_bool}}</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"a_string"</span> <span class="predicate-type">equals</span> <span class="expr">{{a_string}}</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"a_list"</span> <span class="predicate-type">equals</span> <span class="expr">{{a_list}}</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="comment"># -- COMPRESSED HAS NO EFFECT ON NON-COMPRESSED</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/compressed/none</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 class="string">Content-Length</span><span>:</span> <span class="string">12</span></span><span class="line"><span class="string">Content-Type</span><span>:</span> <span class="string">text/html; charset=utf-8</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/compressed/gzip</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 class="string">Content-Length</span><span>:</span> <span class="string">32</span></span><span class="line"><span class="string">Content-Encoding</span><span>:</span> <span class="string">gzip</span></span><span class="line"><span class="string">Content-Type</span><span>:</span> <span class="string">text/html; charset=utf-8</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/compressed/zlib</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 class="string">Content-Length</span><span>:</span> <span class="string">20</span></span><span class="line"><span class="string">Content-Encoding</span><span>:</span> <span class="string">deflate</span></span><span class="line"><span class="string">Content-Type</span><span>:</span> <span class="string">text/html; charset=utf-8</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/compressed/brotli</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 class="string">Content-Length</span><span>:</span> <span class="string">17</span></span><span class="line"><span class="string">Content-Encoding</span><span>:</span> <span class="string">br</span></span><span class="line"><span class="string">Content-Type</span><span>:</span> <span class="string">text/html; charset=utf-8</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/compressed/brotli_identity</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 class="string">Content-Length</span><span>:</span> <span class="string">17</span></span><span class="line"><span class="string">Content-Encoding</span><span>:</span> <span class="string">br, identity</span></span><span class="line"><span class="string">Content-Type</span><span>:</span> <span class="string">text/html; charset=utf-8</span></span><span class="line">```Hello World!```</span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/cookie_file</span></span></div><div class="response"><span class="line"><span class="version">HTTP/*</span> <span class="status">200</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="comment">#</span></span><span class="line"><span class="comment"># experimental feature</span></span><span class="line"><span class="comment"># manage cookie store</span></span><span class="line"><span class="comment">#</span></span><span class="line"></span><span class="line"><span class="comment"># @cookie_storage_set: localhost FALSE / FALSE 0 cookie1 valueA</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/cookie-storage/assert-that-cookie1-is-valueA</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="comment"># @cookie_storage_clear</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/cookie-storage/assert-that-cookie1-is-not-in-session</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">DELETE</span> <span class="url">http://localhost:8000/delete</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/encoding/utf8</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 class="string">Content-Type</span><span>:</span> <span class="string">text/html; charset=utf-8</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">equals</span> <span class="string">"café"</span></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/encoding/latin1</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 class="string">Content-Type</span><span>:</span> <span class="string">text/html; charset=ISO-8859-1</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">equals</span> <span class="string">"café"</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="comment"># Test body response with line ending LF and CRLF.</span></span><span class="line"><span class="comment"># We receive the text body "line1\nline2\r\nline3\n"</span></span><span class="line"><span class="comment"># and not "line1\nline2\nline3\n"</span></span><span class="line"></span><span class="line"><span class="comment">#</span></span><span class="line"><span class="comment"># $ printf "line1\nline2\nline3\n" | base64</span></span><span class="line"><span class="comment"># bGluZTEKbGluZTIKbGluZTMK</span></span><span class="line"></span><span class="line"></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/assert-base64</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">base64,bGluZTEKbGluZTIKbGluZTMK;</span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="comment"># Return an unsupported content encoding</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/error/content-encoding</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>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-decompress</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><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="comment"># Test body response with file assertion.</span></span><span class="line"><span class="comment"># We receive the body "Hello" and not "Hello World!"</span></span><span class="line"></span><span class="line"></span><span class="line"></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/error-assert-file</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">files,data.txt;</span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-header-not-found</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 class="string">Custom</span><span>:</span> <span class="string">???</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-header-value</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 class="string">Content-Type</span><span>:</span> <span class="string">???</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/error-assert-header-value</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 class="string">Content-Type</span><span>:</span> <span class="string">???</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert/http-version</span></span></div><div class="response"><span class="line"><span class="version">HTTP/2</span> <span class="status">200</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-invalid-predicate-type</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">header</span> <span class="string">"content-type"</span> <span class="predicate-type">equals</span> <span class="number">1</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert/match-utf8</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">matches</span> <span class="string">".*"</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-query-cookie</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><span class="line section-header">[Asserts]</span></span><span class="line"></span><span class="line"><span class="query-type">cookie</span> <span class="string">"cookie1[Secure]"</span> not <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">cookie</span> <span class="string">"cookie1[Secure]"</span> <span class="predicate-type">equals</span> <span class="boolean">false</span></span><span class="line"><span class="query-type">cookie</span> <span class="string">"cookie1[Secure]"</span> not <span class="predicate-type">equals</span> <span class="boolean">true</span></span><span class="line"></span><span class="line"><span class="query-type">cookie</span> <span class="string">"cookie2[Secure]"</span> <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">cookie</span> <span class="string">"cookie2[Secure]"</span> <span class="predicate-type">equals</span> <span class="boolean">true</span></span><span class="line"><span class="query-type">cookie</span> <span class="string">"cookie2[Secure]"</span> not <span class="predicate-type">equals</span> <span class="boolean">true</span></span></div></div><span class="line"></span><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-query-invalid-regex</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">regex</span> <span class="string">"[x"</span> <span class="predicate-type">exists</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/utf8</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">xpath</span> <span class="string">"//"</span> <span class="predicate-type">equals</span> <span class="number">1</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/not_found</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-template-variable-not-found</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">header</span> <span class="string">"content-type"</span> <span class="predicate-type">equals</span> <span class="string">"{{content_type}}"</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-value</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">header</span> <span class="string">"content-type"</span> <span class="predicate-type">equals</span> <span class="string">"XXX"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.id"</span> <span class="predicate-type">equals</span> <span class="string">"000001"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.values"</span> <span class="predicate-type">includes</span> <span class="number">100</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.values"</span> not <span class="predicate-type">contains</span> <span class="string">"Hello"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.count"</span> <span class="predicate-type">greaterThan</span> <span class="number">5</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.count"</span> <span class="predicate-type">isFloat</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-variable</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 section-header">[Captures]</span></span><span class="line">status<span>:</span> <span class="query-type">status</span></span><span class="line">length<span>:</span> <span class="query-type">header</span> <span class="string">"content-length"</span></span><span class="line">type<span>:</span> <span class="query-type">header</span> <span class="string">"content-type"</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"toto"</span> <span class="predicate-type">equals</span> <span class="string">"tata"</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"status"</span> <span class="predicate-type">equals</span> <span class="expr">{{unknown}}</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"status"</span> <span class="predicate-type">equals</span> <span class="expr">{{type}}</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"status"</span> <span class="predicate-type">equals</span> <span class="expr">{{length}}</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-assert-xpath</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">xpath</span> <span class="string">"strong(//head/title)"</span> <span class="predicate-type">equals</span> <span class="string">"Welcome to Quiz!"</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">unused</span></span></div><span class="line">{<span class="line"> "success": {{success}}</span><span class="line">}</span></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">GET</span> <span class="url">http://10.0.0.0</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/error-file-read-access</span></span></div><span class="line">files,does_not_exist;</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.1</span> <span class="status">200</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">GET</span> <span class="url">http://unknown</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-invalid-jsonpath</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">""</span> <span class="predicate-type">equals</span> <span class="boolean">false</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">GET</span> <span class="url">???</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-invalid-xml</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">xpath</span> <span class="string">"xx"</span> <span class="predicate-type">equals</span> <span class="number">1</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/redirect/7</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/unused</span></span></div><span class="line section-header">[MultipartFormData]</span></span><span class="line"><span class="string">key1</span><span>:</span> <span class="string">value1</span></span><span class="line"><span class="string"><span class="string">upload1</span></span>: file,<span class="string">unknown</span>;</span></div><span class="line"></span><span class="line"></span><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/predicate/error/type</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.status"</span> <span class="predicate-type">equals</span> <span class="string">"true"</span></span><span class="line"><span class="comment">#jsonpath "$.count" equals "0"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.count"</span> <span class="predicate-type">equals</span> <span class="number">0</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.message"</span> <span class="predicate-type">equals</span> <span class="number">0</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.empty"</span> <span class="predicate-type">equals</span> <span class="number">0</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.number"</span> <span class="predicate-type">equals</span> <span class="number">1.1</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.message"</span> <span class="predicate-type">startsWith</span> <span class="string">"hi"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.message"</span> <span class="predicate-type">contains</span> <span class="string">"hi"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.message"</span> <span class="predicate-type">matches</span> <span class="string">"hi"</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.message"</span> <span class="predicate-type">equals</span> <span class="number">1</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.toto"</span> <span class="predicate-type">exists</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.message"</span> not <span class="predicate-type">exists</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-query-header-not-found</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 class="string">Custom</span><span>:</span> <span class="string">XXX</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-query-invalid-json</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.errors"</span> <span class="predicate-type">equals</span> <span class="number">2</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/error-query-invalid-utf8</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.errors"</span> <span class="predicate-type">equals</span> <span class="number">2</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">GET</span> <span class="url">{{url}}</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/get-list</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 section-header">[Captures]</span></span><span class="line">list<span>:</span> <span class="query-type">jsonpath</span> <span class="string">"$.values"</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/undefined</span></span></div><span class="line section-header">[QueryStringParams]</span></span><span class="line"><span class="string">param1</span><span>:</span> <span class="string">{{list}}</span></span><div class="response"><span class="line"><span class="version">HTTP/1.1</span> <span class="status">200</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/timeout</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/expect</span></span></div><span class="line"><span class="string">Expect</span><span>:</span> <span class="string">100-continue</span></span><span class="line">```data```</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/follow-redirect</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">```Followed redirect!```</span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/form-params</span></span></div><span class="line section-header">[FormParams]</span></span><span class="line"><span class="string">param1</span><span>:</span> <span class="string">value1</span></span><span class="line"><span class="string">param2</span><span>:</span><span class="string"></span></span><span class="line"><span class="string">param3</span><span>:</span> <span class="string">a=b</span></span><span class="line"><span class="string">param4</span><span>:</span> <span class="string">a%3db</span></span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="comment"># same version as raw</span></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/form-params</span></span></div><span class="line"><span class="string">Content-Type</span><span>:</span> <span class="string">application/x-www-form-urlencoded</span></span><span class="line">```param1=value1&amp;param2=&amp;param3=a%3db&amp;param4=a%253db```</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/default-headers</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</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/default-headers</span></span></div><span class="line"><span class="string">User-Agent</span><span>:</span> <span class="string">hurl/1.0</span></span><span class="line"><span class="string">Host</span><span>:</span> <span class="string">localhost:8000</span> <span class="comment"># comment</span></span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></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/default-headers</span></span></div><span class="line"><span class="string">User-Agent</span><span>:</span> <span class="string">hurl/1.0</span></span><span class="line"><span class="string">Host</span><span>:</span> <span class="string">localhost:8000</span> <span class="comment"># comment</span></span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</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/custom-headers</span></span></div><span class="line"><span class="string">Fruit</span><span>:</span> <span class="string">Raspberry</span></span><span class="line"><span class="string">Fruit</span><span>:</span> <span class="string">Apple</span></span><span class="line"><span class="string">Fruit</span><span>:</span> <span class="string">Banana</span></span><span class="line"><span class="string">Fruit</span><span>:</span> <span class="string">Grape</span></span><span class="line"><span class="string">Color</span><span>:</span> <span class="string">Green</span></span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</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/custom-headers-utf8</span></span></div><span class="line"><span class="string">Beverage</span><span>:</span> <span class="string">café</span> <span class="comment"># send the utf8 string - expected to be decoded as ascii in the server side</span></span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</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/custom-headers-quote</span></span></div><span class="line"><span class="string">Header1</span><span>:</span> <span class="string">'</span></span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</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/response-headers</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 class="string">Beverage</span><span>:</span> <span class="string">cafe</span> <span class="comment"># TBC send utf8</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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">files, data.txt;</span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/include</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```</span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/large</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 class="string">Content-Type</span><span>:</span> <span class="string">application/octet-stream</span></span><span class="line"><span class="string">Content-Length</span><span>:</span> <span class="string">536870912</span></span><span class="line"></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">duration</span> <span class="predicate-type">lessThanOrEquals</span> <span class="number">10000</span></span></div></div><span class="line"></span><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/multipart-form-data</span></span></div><span class="line section-header">[MultipartFormData]</span></span><span class="line"><span class="string">key1</span><span>:</span> <span class="string">value1</span></span><span class="line"><span class="string"><span class="string">upload1</span></span>: file,<span class="string">data.txt</span>;</span><span class="line"><span class="string"><span class="string">upload2</span></span>: file,<span class="string">data.html</span>;</span><span class="line"><span class="string"><span class="string">upload3</span></span>: file,<span class="string">data.txt</span>; <span class="string">text/html</span></span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><span class="line"><span class="comment"># all the entries</span></span><span class="line"><span class="comment"># have been commented</span></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/output/endpoint1</span></span></div><span class="line">{ "user": "bob" }<div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></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/output/endpoint2</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="comment"># Sample from https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH</span></span><span class="line"><span class="method">PATCH</span> <span class="url">http://localhost:8000/patch/file.txt</span></span></div><span class="line"><span class="string">Host</span><span>:</span> <span class="string">www.example.com</span></span><span class="line"><span class="string">Content-Type</span><span>:</span> <span class="string">application/example</span></span><span class="line"><span class="string">If-Match</span><span>:</span> <span class="string">"e0023aa4e"</span></span><div class="response"><span class="line"></span><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">204</span></span><span class="line"><span class="string">Content-Location</span><span>:</span> <span class="string">/file.txt</span></span><span class="line"><span class="string">ETag</span><span>:</span> <span class="string">"e0023aa4f"</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-base64</span></span></div><span class="line">base64, SGVsbG8gV29ybGQh;</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-bytes</span></span></div><span class="line"><span class="string">Content-Type</span><span>:</span> <span class="string">application/octet-stream</span></span><span class="line">base64, AQID;</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-file</span></span></div><span class="line">files,data.bin;</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-json</span></span></div><span class="line"></span><span class="line">{<span class="line"> "name": "Bob",</span><span class="line"> "password": "secret",</span><span class="line"> "age": 30,</span><span class="line"> "strict": true</span><span class="line">}</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-json-array</span></span></div><span class="line">[1,2,3]<div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-json-string</span></span></div><span class="line">"Hello"<div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-json-number</span></span></div><span class="line">100<div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-json-numbers</span></span></div><span class="line">{<span class="line"> "natural": 100,</span><span class="line"> "negative": -1,</span><span class="line"> "float": "3.333333333333333",</span><span class="line"> "exponent": 100e100</span><span class="line">}</span><div class="response"><span class="line"></span><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-json-boolean</span></span></div><span class="line">true<div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="comment">#</span></span><span class="line"><span class="comment"># Use variable in your input json</span></span><span class="line"><span class="comment">#</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/get-name</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 section-header">[Captures]</span></span><span class="line">name<span>:</span> <span class="query-type">status</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-json</span></span></div><span class="line"></span><span class="line">{<span class="line"> "name": "{{name}}",</span><span class="line"> "password": "secret",</span><span class="line"> "age": {{age}},</span><span class="line"> "strict": {{strict}}</span><span class="line">}</span></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-multilines</span></span></div><span class="line">```</span><span class="line">name,age</span><span class="line">bob,10</span><span class="line">bill,22</span><span class="line">```</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></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/get-bob-age</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 section-header">[Captures]</span></span><span class="line">bob_age<span>:</span> <span class="query-type">status</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-multilines</span></span></div><span class="line">```</span><span class="line">name,age</span><span class="line">bob,{{bob_age}}</span><span class="line">bill,22</span><span class="line">```</span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-xml</span></span></div><span class="line">&amp;lt;?xml version="1.0"?&amp;gt;<span class="line">&amp;lt;drink&amp;gt;café&amp;lt;/drink&amp;gt;</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"></span><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/post-xml-no-prolog</span></span></div><span class="line">&amp;lt;drink&amp;gt;café&amp;lt;/drink&amp;gt;<div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/predicates-string</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">equals</span> <span class="string">"Hello World!"</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">startsWith</span> <span class="string">"Hello"</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">contains</span> <span class="string">"llo"</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">matches</span> <span class="string">"Hello [a-zA-Z]+!"</span></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/predicates-string-empty</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">equals</span> <span class="string">""</span></span><span class="line"><span class="query-type">status</span> <span class="predicate-type">exists</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="comment"># Go through proxy</span></span><span class="line"><span class="comment"># The proxy adds header "From-Proxy:Hello" for both request and response</span></span><span class="line"><span class="comment"># mitmproxy -p 8888 --setheader ":~q:From-Proxy:Hello" --setheader ":~s:From-Proxy:Hello"</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/proxy</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 class="string">From-Proxy</span><span>:</span> <span class="string">Hello</span></span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">PUT</span> <span class="url">http://localhost:8000/put</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/querystring-params</span></span></div><span class="line section-header">[QueryStringParams]</span></span><span class="line"><span class="string">param1</span><span>:</span> <span class="string">value1</span></span><span class="line"><span class="string">param2</span><span>:</span><span class="string"></span></span><span class="line"><span class="string">param3</span><span>:</span> <span class="string">a=b</span></span><span class="line"><span class="string">param4</span><span>:</span> <span class="string">1,2,3</span></span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"></span><span class="line"><span class="comment"># same version as raw</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/querystring-params?param1=value1&amp;param2=&amp;param3=a%3db&amp;param4=1,2,3</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></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"></span><span class="line"><span class="comment"># combine version</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/querystring-params?param1=value1</span></span></div><span class="line section-header">[QueryStringParams]</span></span><span class="line"><span class="string">param2</span><span>:</span><span class="string"></span></span><span class="line"><span class="string">param3</span><span>:</span> <span class="string">a=b</span></span><span class="line"><span class="string">param4</span><span>:</span> <span class="string">1,2,3</span></span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><div class="hurl-entry"><div class="request"><span class="line"></span><span class="line"></span><span class="line"><span class="comment"># encoding slash</span></span><span class="line"><span class="method">GET</span> <span class="url">http://localhost:8000/querystring-params-encoded?value1=/&amp;value2=%2F</span></span></div><span class="line section-header">[QueryStringParams]</span></span><span class="line"><span class="string">value3</span><span>:</span><span class="string">/</span></span><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/redirect</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">302</span></span><span class="line"><span class="string">Location</span><span>:</span> <span class="string">http://localhost:8000/redirected</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/redirected</span></span></div><div class="response"><span class="line"><span class="version">HTTP/1.0</span> <span class="status">200</span></span></div></div><span class="line"></span><span class="line"></span><span class="line"></span><span class="line"></span><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">GET</span> <span class="url">http://bob:secret@localhost:8000/basic-authentication</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">```You are authenticated```</span></div></div><span class="line"></span><span class="line"></span></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<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/utf8</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 section-header">[Asserts]</span></span><span class="line"><span class="query-type">xpath</span> <span class="string">"normalize-space(//data)"</span> <span class="predicate-type">equals</span> <span class="string">"café"</span></span><span class="line"><span class="query-type">xpath</span> <span class="string">"normalize-space(//data)"</span> <span class="predicate-type">equals</span> <span class="string">"café"</span></span></div></div></div>
</body></html>

View File

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html><head><title>Hurl File</title><style>
body {
counter-reset: line;
font-family: monospace;
}
span.line {
display: block;
line-height: 1.2rem;
}
span.line:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 1em;
margin-right: .5em;
color: #888;
width: 2.5em;
text-align: right;
}
.method {
color: black;
}
.url {
color: darkblue;
}
.version {
color: black;
}
.status {
color: blue;
}
.section-header {
color: darkmagenta;
}
.query-type {
color: teal;
}
.predicate-type {
color: darkblue;
}
.string {
color: darkgreen;
}
.comment {
color: dimgray;
}
</style></head><body>
<div class="hurl-file"><div class="hurl-entry"><div class="request"><span class="line"><span class="method">POST</span> <span class="url">http://localhost:8000/variables</span></span></div><span class="line">{<span class="line"> "name": "{{name}}",</span><span class="line"> "age": {{age}},</span><span class="line"> "height": {{height}},</span><span class="line"> "female": {{female}},</span><span class="line"> "id": "{{id}}",</span><span class="line"> "a_null": {{a_null}}</span><span class="line">}</span><div class="response"><span class="line"></span><span class="line"><span class="version">HTTP/*</span> <span class="status">200</span></span><span class="line section-header">[Asserts]</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"name"</span> <span class="predicate-type">equals</span> <span class="string">"Jennifer"</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"female"</span> <span class="predicate-type">equals</span> <span class="boolean">true</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"age"</span> <span class="predicate-type">equals</span> <span class="number">30</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"height"</span> <span class="predicate-type">equals</span> <span class="number">1.70</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"a_null"</span> <span class="predicate-type">equals</span> <span class="null">null</span></span><span class="line"><span class="query-type">variable</span> <span class="string">"id"</span> <span class="predicate-type">equals</span> <span class="string">"123"</span></span></div></div></div>
</body></html>

File diff suppressed because it is too large Load Diff

View File

@ -30,7 +30,19 @@ fn strip_bom(bytes: &mut Vec<u8>) {
/// Similar to the standard read_to_string()
/// But remove any existing BOM
/// Support also input stream when filename = '-'
pub fn read_to_string(filename: &str) -> Result<String, CliError> {
if filename == "-" {
let mut contents = String::new();
return if let Err(e) = std::io::stdin().read_to_string(&mut contents) {
Err(CliError {
message: format!("Input stream can not be read - {}", e.to_string()),
})
} else {
return Ok(contents);
};
}
let mut f = match File::open(&filename) {
Ok(f) => f,
Err(e) => {

View File

@ -21,7 +21,7 @@
extern crate float_cmp;
pub mod cli;
pub mod html;
pub mod http;
pub mod jsonpath;
pub mod report;
pub mod runner;

View File

@ -19,20 +19,19 @@
use std::collections::HashMap;
use std::env;
use std::io::prelude::*;
use std::io::{self, BufReader, Read};
use std::io::{self, BufReader};
use std::path::{Path, PathBuf};
use std::time::Duration;
use atty::Stream;
use chrono::{DateTime, Local};
use clap::{AppSettings, ArgMatches};
use hurl::cli;
use hurl::cli::interactive;
use hurl::cli::CliError;
use hurl::html;
use hurl::http;
use hurl::http::ClientOptions;
use hurl::report;
use hurl::runner;
use hurl::runner::{HurlResult, RunnerOptions, Value};
use hurl_core::ast::{Pos, SourceInfo};
@ -65,6 +64,13 @@ pub fn init_colored() {
colored::control::set_override(true);
}
const EXIT_OK: i32 = 0;
const EXIT_ERROR_COMMANDLINE: i32 = 1;
const EXIT_ERROR_PARSING: i32 = 2;
const EXIT_ERROR_RUNTIME: i32 = 3;
const EXIT_ERROR_ASSERT: i32 = 4;
const EXIT_ERROR_UNDEFINED: i32 = 127;
#[cfg(target_family = "windows")]
pub fn init_colored() {
colored::control::set_override(true);
@ -99,7 +105,7 @@ fn execute(
match parser::parse_hurl_file(contents.as_str()) {
Err(e) => {
log_parser_error(&e, false);
std::process::exit(2);
std::process::exit(EXIT_ERROR_PARSING);
}
Ok(hurl_file) => {
log_verbose(format!("fail fast: {}", cli_options.fail_fast).as_str());
@ -517,7 +523,7 @@ pub fn unwrap_or_exit<T>(
Ok(v) => v,
Err(e) => {
log_error_message(false, e.message.as_str());
std::process::exit(127);
std::process::exit(EXIT_ERROR_UNDEFINED);
}
}
}
@ -608,7 +614,7 @@ fn main() {
panic!("panic during printing help");
}
println!();
std::process::exit(1);
std::process::exit(EXIT_ERROR_COMMANDLINE);
} else if filenames.is_empty() {
filenames.push("-");
}
@ -637,27 +643,12 @@ fn main() {
}
};
for filename in filenames {
let contents = if filename == "-" {
let mut contents = String::new();
if let Err(e) = io::stdin().read_to_string(&mut contents) {
log_error_message(
false,
format!("Input stream can not be read - {}", e.to_string()).as_str(),
);
std::process::exit(2);
}
contents
} else {
match cli::read_to_string(&filename) {
Ok(s) => s,
Err(e) => {
log_error_message(
false,
format!("Input stream can not be read - {}", e.message).as_str(),
);
std::process::exit(2);
}
for filename in filenames.clone() {
let contents = match cli::read_to_string(filename) {
Ok(v) => v,
Err(e) => {
log_error_message(false, e.message.as_str());
std::process::exit(EXIT_ERROR_PARSING);
}
};
@ -707,7 +698,7 @@ fn main() {
.fixme()
.as_str(),
);
std::process::exit(3);
std::process::exit(EXIT_ERROR_RUNTIME);
}
}
} else {
@ -744,7 +735,7 @@ fn main() {
false,
format!("Issue writing to {}: {:?}", file_path.display(), why).as_str(),
);
std::process::exit(127)
std::process::exit(EXIT_ERROR_UNDEFINED)
}
Ok(file) => file,
};
@ -754,7 +745,7 @@ fn main() {
false,
format!("Issue writing to {}: {:?}", file_path.display(), why).as_str(),
);
std::process::exit(127)
std::process::exit(EXIT_ERROR_UNDEFINED)
}
}
@ -762,8 +753,12 @@ fn main() {
log_verbose(format!("Writing html report to {}", dir_path.display()).as_str());
unwrap_or_exit(
&log_error_message,
write_html_report(dir_path, hurl_results.clone()),
report::write_html_report(dir_path.clone(), hurl_results.clone()),
);
for filename in filenames {
unwrap_or_exit(&log_error_message, format_html(filename, dir_path.clone()));
}
}
if let Some(file_path) = cookies_output_file {
@ -797,14 +792,44 @@ fn exit_code(hurl_results: Vec<HurlResult>) -> i32 {
}
}
if count_errors_runner > 0 {
3
EXIT_ERROR_RUNTIME
} else if count_errors_assert > 0 {
4
EXIT_ERROR_ASSERT
} else {
0
EXIT_OK
}
}
fn format_html(input_file: &str, dir_path: PathBuf) -> Result<(), CliError> {
eprintln!("copy/format to html {}", input_file);
let file_path = dir_path.join(format!("{}.html", input_file));
eprintln!("file_path= {:?}", file_path);
let parent = file_path.parent().expect("a parent");
eprintln!("parent={:?}", parent);
std::fs::create_dir_all(parent).unwrap();
eprintln!("create dir all ok");
let mut file = match std::fs::File::create(&file_path) {
Err(why) => {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
Ok(file) => file,
};
let content = cli::read_to_string(input_file).expect("readable hurl file");
let hurl_file = parser::parse_hurl_file(content.as_str()).expect("valid hurl file");
let s = hurl_core::format::format_html(hurl_file, true);
if let Err(why) = file.write_all(s.as_bytes()) {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
Ok(())
}
fn write_output(bytes: Vec<u8>, filename: Option<&str>) -> Result<(), CliError> {
match filename {
None => {
@ -879,135 +904,3 @@ fn write_cookies_file(file_path: PathBuf, hurl_results: Vec<HurlResult>) -> Resu
}
Ok(())
}
fn write_html_report(dir_path: PathBuf, hurl_results: Vec<HurlResult>) -> Result<(), CliError> {
//let now: DateTime<Utc> = Utc::now();
let now: DateTime<Local> = Local::now();
let html = create_html_index(now.to_rfc2822(), hurl_results);
let s = html.render();
let file_path = dir_path.join("index.html");
let mut file = match std::fs::File::create(&file_path) {
Err(why) => {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
Ok(file) => file,
};
if let Err(why) = file.write_all(s.as_bytes()) {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
let file_path = dir_path.join("report.css");
let mut file = match std::fs::File::create(&file_path) {
Err(why) => {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
Ok(file) => file,
};
if let Err(why) = file.write_all(include_bytes!("report.css")) {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
Ok(())
}
fn create_html_index(now: String, hurl_results: Vec<HurlResult>) -> html::Html {
let head = html::Head {
title: "Hurl Report".to_string(),
stylesheet: Some("report.css".to_string()),
};
let body = html::Body {
children: vec![
html::Element::NodeElement {
name: "h2".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement("Hurl Report".to_string())],
},
html::Element::NodeElement {
name: "div".to_string(),
attributes: vec![html::Attribute::Class("date".to_string())],
children: vec![html::Element::TextElement(now)],
},
html::Element::NodeElement {
name: "table".to_string(),
attributes: vec![],
children: vec![
create_html_table_header(),
create_html_table_body(hurl_results),
],
},
],
};
html::Html { head, body }
}
fn create_html_table_header() -> html::Element {
html::Element::NodeElement {
name: "thead".to_string(),
attributes: vec![],
children: vec![html::Element::NodeElement {
name: "tr".to_string(),
attributes: vec![],
children: vec![
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement("filename".to_string())],
},
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement("duration".to_string())],
},
],
}],
}
}
fn create_html_table_body(hurl_results: Vec<HurlResult>) -> html::Element {
let children = hurl_results
.iter()
.map(|result| create_html_result(result.clone()))
.collect();
html::Element::NodeElement {
name: "tbody".to_string(),
attributes: vec![],
children,
}
}
fn create_html_result(result: HurlResult) -> html::Element {
let status = if result.success {
"success".to_string()
} else {
"failure".to_string()
};
html::Element::NodeElement {
name: "tr".to_string(),
attributes: vec![],
children: vec![
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![html::Attribute::Class(status)],
children: vec![html::Element::TextElement(result.filename.clone())],
},
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement(format!(
"{}s",
result.time_in_ms as f64 / 1000.0
))],
},
],
}
}

View File

@ -46,5 +46,6 @@ pub enum Element {
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Attribute {
Class(String),
Id(String),
//Id(String),
Href(String),
}

View File

@ -83,7 +83,8 @@ impl Attribute {
fn render(self) -> String {
match self {
Attribute::Class(s) => format!("class=\"{}\"", s),
Attribute::Id(s) => format!("id=\"{}\"", s),
//Attribute::Id(s) => format!("id=\"{}\"", s),
Attribute::Href(s) => format!("href=\"{}\"", s),
}
}
}

View File

@ -0,0 +1,224 @@
/*
* hurl (https://hurl.dev)
* Copyright (C) 2020 Orange
*
* 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.
*
*/
use std::io::prelude::*;
use std::path::PathBuf;
use chrono::{DateTime, Local};
use super::cli::CliError;
use super::runner::HurlResult;
mod html;
pub fn write_html_report(dir_path: PathBuf, hurl_results: Vec<HurlResult>) -> Result<(), CliError> {
//let now: DateTime<Utc> = Utc::now();
let now: DateTime<Local> = Local::now();
let html = create_html_index(now.to_rfc2822(), hurl_results);
let s = html.render();
let file_path = dir_path.join("index.html");
let mut file = match std::fs::File::create(&file_path) {
Err(why) => {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
Ok(file) => file,
};
if let Err(why) = file.write_all(s.as_bytes()) {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
let file_path = dir_path.join("report.css");
let mut file = match std::fs::File::create(&file_path) {
Err(why) => {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
Ok(file) => file,
};
if let Err(why) = file.write_all(include_bytes!("report.css")) {
return Err(CliError {
message: format!("Issue writing to {}: {:?}", file_path.display(), why),
});
}
Ok(())
}
fn percentage(count: usize, total: usize) -> String {
format!("{:.1}%", (count as f32 * 100.0) / total as f32)
}
fn create_html_index(now: String, hurl_results: Vec<HurlResult>) -> html::Html {
let head = html::Head {
title: "Hurl Report".to_string(),
stylesheet: Some("report.css".to_string()),
};
let count_total = hurl_results.len();
let count_failure = hurl_results.iter().filter(|result| !result.success).count();
let count_success = hurl_results.iter().filter(|result| result.success).count();
let body = html::Body {
children: vec![
html::Element::NodeElement {
name: "h2".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement("Hurl Report".to_string())],
},
html::Element::NodeElement {
name: "div".to_string(),
attributes: vec![html::Attribute::Class("summary".to_string())],
children: vec![
html::Element::NodeElement {
name: "div".to_string(),
attributes: vec![html::Attribute::Class("date".to_string())],
children: vec![html::Element::TextElement(now)],
},
html::Element::NodeElement {
name: "div".to_string(),
attributes: vec![html::Attribute::Class("count".to_string())],
children: vec![html::Element::TextElement(format!(
"total: {} (100%)",
count_total
))],
},
html::Element::NodeElement {
name: "div".to_string(),
attributes: vec![html::Attribute::Class("count".to_string())],
children: vec![html::Element::TextElement(format!(
"failure: {} ({})",
count_failure,
percentage(count_failure, count_total)
))],
},
html::Element::NodeElement {
name: "div".to_string(),
attributes: vec![html::Attribute::Class("count".to_string())],
children: vec![html::Element::TextElement(format!(
"success: {} ({})",
count_success,
percentage(count_success, count_total)
))],
},
],
},
html::Element::NodeElement {
name: "table".to_string(),
attributes: vec![],
children: vec![
create_html_table_header(),
create_html_table_body(hurl_results),
],
},
],
};
html::Html { head, body }
}
fn create_html_table_header() -> html::Element {
html::Element::NodeElement {
name: "thead".to_string(),
attributes: vec![],
children: vec![html::Element::NodeElement {
name: "tr".to_string(),
attributes: vec![],
children: vec![
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement("filename".to_string())],
},
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement("status".to_string())],
},
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement("duration".to_string())],
},
],
}],
}
}
fn create_html_table_body(hurl_results: Vec<HurlResult>) -> html::Element {
let children = hurl_results
.iter()
.map(|result| create_html_result(result.clone()))
.collect();
html::Element::NodeElement {
name: "tbody".to_string(),
attributes: vec![],
children,
}
}
fn create_html_result(result: HurlResult) -> html::Element {
let status = if result.success {
"success".to_string()
} else {
"failure".to_string()
};
html::Element::NodeElement {
name: "tr".to_string(),
attributes: vec![html::Attribute::Class(status.clone())],
children: vec![
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::NodeElement {
name: "a".to_string(),
attributes: vec![html::Attribute::Href(format!("{}.html", result.filename))],
children: vec![html::Element::TextElement(result.filename.clone())],
}],
},
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement(status)],
},
html::Element::NodeElement {
name: "td".to_string(),
attributes: vec![],
children: vec![html::Element::TextElement(format!(
"{}s",
result.time_in_ms as f64 / 1000.0
))],
},
],
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_percentage() {
assert_eq!(percentage(100, 100), "100.0%".to_string());
assert_eq!(percentage(66, 99), "66.7%".to_string());
assert_eq!(percentage(33, 99), "33.3%".to_string());
}
}

View File

@ -6,11 +6,18 @@ thead {
font-weight: bolder;
}
.success {
td {
padding: 3px 5px;
}
.summary {
padding: 10px;
}
.success, .success a {
color: green;
}
.failure {
.failure, .failure a {
color: red;
}

View File

@ -17,5 +17,5 @@ strict = []
[dependencies]
float-cmp = "0.6.0"
sxd-document = "0.3.2"
regex = "1.1.0"

View File

@ -16,7 +16,8 @@
*
*/
use super::core::Template;
use crate::ast::Expr;
use crate::ast::{Expr, JsonValue};
use core::fmt;
///
/// This the AST for the JSON used within hurl
@ -24,7 +25,6 @@ use crate::ast::Expr;
/// It is a superset of the standard json spec.
/// Strings have been replaced by hurl template.
///
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Value {
Expression(Expr),
@ -72,3 +72,163 @@ pub struct ObjectElement {
pub value: Value,
pub space3: String,
}
impl fmt::Display for JsonValue {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let s = match self {
Value::Expression(expr) => format!("{{{{{}}}}}", expr.to_string()),
Value::Number(s) => s.to_string(),
Value::String(template) => format!("\"{}\"", template.to_string()),
Value::Boolean(value) => {
if *value {
"true".to_string()
} else {
"false".to_string()
}
}
Value::List { space0, elements } => {
let elements = elements
.iter()
.map(|e| e.to_string())
.collect::<Vec<String>>();
format!("[{}{}]", space0, elements.join(","))
}
Value::Object { space0, elements } => {
let elements = elements
.iter()
.map(|e| e.to_string())
.collect::<Vec<String>>();
format!("{{{}{}}}", space0, elements.join(","))
}
Value::Null { .. } => "null".to_string(),
};
write!(f, "{}", s)
}
}
impl fmt::Display for ListElement {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut s = "".to_string();
s.push_str(self.space0.as_str());
s.push_str(self.value.to_string().as_str());
s.push_str(self.space1.as_str());
write!(f, "{}", s)
}
}
impl fmt::Display for ObjectElement {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut s = "".to_string();
s.push_str(self.space0.as_str());
s.push('"');
s.push_str(self.name.as_str());
s.push('"');
s.push_str(self.space1.as_str());
s.push(':');
s.push_str(self.space2.as_str());
s.push_str(self.value.to_string().as_str());
s.push_str(self.space3.as_str());
write!(f, "{}", s)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ast::{SourceInfo, TemplateElement, Variable, Whitespace};
#[test]
fn test_to_string() {
assert_eq!(
"{{x}}".to_string(),
JsonValue::Expression(Expr {
space0: Whitespace {
value: "".to_string(),
source_info: SourceInfo::init(0, 0, 0, 0)
},
variable: Variable {
name: "x".to_string(),
source_info: SourceInfo::init(0, 0, 0, 0)
},
space1: Whitespace {
value: "".to_string(),
source_info: SourceInfo::init(0, 0, 0, 0)
}
})
.to_string()
);
assert_eq!(
"1".to_string(),
JsonValue::Number("1".to_string()).to_string()
);
assert_eq!(
"\"hello\"".to_string(),
JsonValue::String(Template {
quotes: false,
elements: vec![TemplateElement::String {
value: "hello".to_string(),
encoded: "hello".to_string(),
}],
source_info: SourceInfo::init(0, 0, 0, 0),
})
.to_string()
);
assert_eq!("true".to_string(), JsonValue::Boolean(true).to_string());
assert_eq!(
"[]".to_string(),
JsonValue::List {
space0: "".to_string(),
elements: vec![]
}
.to_string()
);
assert_eq!(
"[1, 2, 3]".to_string(),
JsonValue::List {
space0: "".to_string(),
elements: vec![
ListElement {
space0: "".to_string(),
value: JsonValue::Number("1".to_string()),
space1: "".to_string(),
},
ListElement {
space0: " ".to_string(),
value: JsonValue::Number("2".to_string()),
space1: "".to_string(),
},
ListElement {
space0: " ".to_string(),
value: JsonValue::Number("3".to_string()),
space1: "".to_string(),
}
],
}
.to_string()
);
assert_eq!(
"{}".to_string(),
JsonValue::Object {
space0: "".to_string(),
elements: vec![]
}
.to_string()
);
assert_eq!(
"{ \"id\": 123 }".to_string(),
JsonValue::Object {
space0: "".to_string(),
elements: vec![ObjectElement {
space0: " ".to_string(),
name: "id".to_string(),
space1: "".to_string(),
space2: " ".to_string(),
value: JsonValue::Number("123".to_string()),
space3: " ".to_string()
}]
}
.to_string()
);
assert_eq!("null".to_string(), JsonValue::Null {}.to_string());
}
}

View File

@ -15,9 +15,9 @@
* limitations under the License.
*
*/
use super::text::format_token;
use super::Tokenizable;
use hurl_core::ast::*;
//use hurlfmt::format::text::format_token;
//use hurlfmt::format::token::Tokenizable;
use crate::ast::*;
pub trait Htmlable {
fn to_html(&self) -> String;
@ -704,12 +704,9 @@ fn xml_escape(s: String) -> String {
.replace('&', "&amp;")
}
impl Htmlable for hurl_core::ast::JsonValue {
impl Htmlable for JsonValue {
fn to_html(&self) -> String {
let mut s = String::from("");
for token in self.tokenize() {
s.push_str(format_token(token, false).as_str());
}
let s = self.to_string();
let mut lines: Vec<String> = regex::Regex::new(r"\n|\r\n")
.unwrap()
.split(s.as_str())

View File

@ -0,0 +1,21 @@
/*
* hurl (https://hurl.dev)
* Copyright (C) 2020 Orange
*
* 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.
*
*/
pub use self::html::format as format_html;
mod html;

View File

@ -21,4 +21,5 @@ extern crate float_cmp;
pub mod ast;
pub mod error;
pub mod format;
pub mod parser;

View File

@ -16,12 +16,10 @@
*
*/
pub use self::html::format as format_html;
pub use self::json::format as format_json;
pub use self::text::format as format_text;
pub use self::token::{Token, Tokenizable};
mod html;
mod json;
mod serialize_json;
mod text;

View File

@ -221,7 +221,7 @@ fn main() {
"json" => format::format_json(hurl_file),
"html" => {
let standalone = matches.is_present("standalone");
format::format_html(hurl_file, standalone)
hurl_core::format::format_html(hurl_file, standalone)
}
"ast" => format!("{:#?}", hurl_file),
_ => {