Skip to content

Commit

Permalink
feat(tlsn-formats): default commit to entire http request/response (#433
Browse files Browse the repository at this point in the history
)

* feat(tlsn-formats): default commit to entire http request/response

* refactor(tlsn-formats): avoid duplicate HTTP commitments, add test fixtures
  • Loading branch information
sinui0 authored Feb 13, 2024
1 parent 82b9582 commit 98a3c4d
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 18 deletions.
98 changes: 80 additions & 18 deletions tlsn/tlsn-formats/src/http/commit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,25 @@ pub trait HttpCommit {
direction: Direction,
request: &Request,
) -> Result<(), HttpCommitError> {
builder
.commit(&request.without_data(), direction)
.map_err(|e| {
HttpCommitError::new_with_source(
MessageKind::Request,
"failed to commit to request with excluded data",
e,
)
})?;
builder.commit(request, direction).map_err(|e| {
HttpCommitError::new_with_source(
MessageKind::Request,
"failed to commit to entire request",
e,
)
})?;

if !request.headers.is_empty() || request.body.is_some() {
builder
.commit(&request.without_data(), direction)
.map_err(|e| {
HttpCommitError::new_with_source(
MessageKind::Request,
"failed to commit to request with excluded data",
e,
)
})?;
}

self.commit_target(builder, direction, request, &request.request.target)?;

Expand Down Expand Up @@ -270,15 +280,25 @@ pub trait HttpCommit {
direction: Direction,
response: &Response,
) -> Result<(), HttpCommitError> {
builder
.commit(&response.without_data(), direction)
.map_err(|e| {
HttpCommitError::new_with_source(
MessageKind::Response,
"failed to commit to response excluding data",
e,
)
})?;
builder.commit(response, direction).map_err(|e| {
HttpCommitError::new_with_source(
MessageKind::Response,
"failed to commit to entire response",
e,
)
})?;

if !response.headers.is_empty() || response.body.is_some() {
builder
.commit(&response.without_data(), direction)
.map_err(|e| {
HttpCommitError::new_with_source(
MessageKind::Response,
"failed to commit to response excluding data",
e,
)
})?;
}

for header in &response.headers {
self.commit_response_header(builder, direction, response, header)?;
Expand Down Expand Up @@ -383,3 +403,45 @@ pub trait HttpCommit {
pub struct DefaultHttpCommitter {}

impl HttpCommit for DefaultHttpCommitter {}

#[cfg(test)]
mod tests {
use super::*;
use rstest::*;
use spansy::http::{parse_request, parse_response};
use tlsn_core::fixtures;

#[rstest]
#[case::get_empty(include_bytes!("../../tests/fixtures/http/request_get_empty"))]
#[case::get_with_header(include_bytes!("../../tests/fixtures/http/request_get_with_header"))]
#[case::post_json(include_bytes!("../../tests/fixtures/http/request_post_json"))]
fn test_http_default_commit_request(#[case] src: &'static [u8]) {
let request = parse_request(src).unwrap();
let mut committer = DefaultHttpCommitter::default();
let mut builder =
TranscriptCommitmentBuilder::new(fixtures::encoding_provider(src, &[]), src.len(), 0);

committer
.commit_request(&mut builder, Direction::Sent, &request)
.unwrap();

builder.build().unwrap();
}

#[rstest]
#[case::empty(include_bytes!("../../tests/fixtures/http/response_empty"))]
#[case::json(include_bytes!("../../tests/fixtures/http/response_json"))]
#[case::text(include_bytes!("../../tests/fixtures/http/response_text"))]
fn test_http_default_commit_response(#[case] src: &'static [u8]) {
let response = parse_response(src).unwrap();
let mut committer = DefaultHttpCommitter::default();
let mut builder =
TranscriptCommitmentBuilder::new(fixtures::encoding_provider(&[], src), 0, src.len());

committer
.commit_response(&mut builder, Direction::Received, &response)
.unwrap();

builder.build().unwrap();
}
}
2 changes: 2 additions & 0 deletions tlsn/tlsn-formats/tests/fixtures/http/request_get_empty
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
GET / HTTP/1.1

3 changes: 3 additions & 0 deletions tlsn/tlsn-formats/tests/fixtures/http/request_get_with_header
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
GET / HTTP/1.1
Host: localhost

6 changes: 6 additions & 0 deletions tlsn/tlsn-formats/tests/fixtures/http/request_post_json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
POST /hello HTTP/1.1
Host: localhost
Content-Length: 44
Content-Type: application/json

{"foo": "bar", "bazz": 123, "buzz": [1,"5"]}
3 changes: 3 additions & 0 deletions tlsn/tlsn-formats/tests/fixtures/http/response_empty
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
HTTP/1.1 200 OK
Content-Length: 0

6 changes: 6 additions & 0 deletions tlsn/tlsn-formats/tests/fixtures/http/response_json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
HTTP/1.1 200 OK
Cookie: very-secret-cookie
Content-Length: 14
Content-Type: application/json

{"foo": "bar"}
6 changes: 6 additions & 0 deletions tlsn/tlsn-formats/tests/fixtures/http/response_text
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
HTTP/1.1 200 OK
Cookie: very-secret-cookie
Content-Length: 14
Content-Type: text/plain

Hello World!!!

0 comments on commit 98a3c4d

Please sign in to comment.