34constexpr const char* kIti43SoapAction =
"urn:ihe:iti:2007:RetrieveDocumentSet";
38constexpr const char* kSoapContentType =
39 "application/soap+xml; charset=UTF-8; "
40 "action=\"urn:ihe:iti:2007:RetrieveDocumentSet\"";
50 std::shared_ptr<kcenon::pacs::security::xds_audit_sink> sink) {
55 const std::string& document_unique_id,
56 const std::string& repository_unique_id) {
59 audit(document_unique_id, repository_unique_id, r);
63 if (document_unique_id.empty()) {
64 return do_audit(kcenon::common::make_error<document_response>(
67 "retrieve: document_unique_id is empty",
70 if (repository_unique_id.empty()) {
71 return do_audit(kcenon::common::make_error<document_response>(
74 "retrieve: repository_unique_id is empty",
83 if (env_result.is_err()) {
84 return do_audit(kcenon::common::make_error<document_response>(
87 auto env = env_result.value();
92 if (sign_result.is_err()) {
93 return do_audit(kcenon::common::make_error<document_response>(
94 sign_result.error()));
107 if (http_result.is_err()) {
108 return do_audit(kcenon::common::make_error<document_response>(
109 http_result.error()));
111 auto response = http_result.value();
115 if (parsed.is_err()) {
116 return do_audit(kcenon::common::make_error<document_response>(
119 auto mtom = parsed.value();
122 if (verify.is_err()) {
123 return do_audit(kcenon::common::make_error<document_response>(
128 mtom.root_xml, mtom.parts, req));
132 void audit(
const std::string& document_unique_id,
133 const std::string& repository_unique_id,
136 kcenon::pacs::security::xds_iti43_event e;
138 e.document_unique_id = document_unique_id;
139 e.repository_unique_id = repository_unique_id;
145 e.failure_description = r.error().message;
152 std::shared_ptr<kcenon::pacs::security::xds_audit_sink>
audit_sink_;
157 : impl_(std::make_unique<
impl>(std::move(opts), std::move(signing))) {}
166 const std::
string& document_unique_id,
167 const std::
string& repository_unique_id) {
168 return impl_->
retrieve(document_unique_id, repository_unique_id);
172 std::shared_ptr<kcenon::pacs::security::xds_audit_sink> sink) {
void set_audit_sink(std::shared_ptr< kcenon::pacs::security::xds_audit_sink > sink)
signing_material signing_
std::shared_ptr< kcenon::pacs::security::xds_audit_sink > audit_sink_
impl(http_options opts, signing_material signing)
void audit(const std::string &document_unique_id, const std::string &repository_unique_id, const kcenon::common::Result< document_response > &r)
kcenon::common::Result< document_response > retrieve(const std::string &document_unique_id, const std::string &repository_unique_id)
ITI-43 Document Consumer actor.
std::unique_ptr< impl > impl_
kcenon::common::Result< document_response > retrieve(const std::string &document_unique_id, const std::string &repository_unique_id)
Retrieve one document by its (documentUniqueId, repositoryUniqueId) pair.
document_consumer(http_options opts, signing_material signing)
Construct an ITI-43 Document Consumer bound to a repository endpoint and a signing credential.
void set_audit_sink(std::shared_ptr< kcenon::pacs::security::xds_audit_sink > sink)
Install an ATNA audit sink.
IHE XDS.b Document Consumer Actor (ITI-43 Retrieve Document Set).
libcurl-backed HTTPS POST client for ITI-41 transport.
MTOM / XOP multipart/related packager for ITI-41.
kcenon::common::Result< document_response > parse_retrieve_response(const std::string &root_xml, const std::vector< mtom_part > &parts, const retrieve_request &req)
Parse a RetrieveDocumentSetResponse envelope and resolve the attachment that matches req.
kcenon::common::Result< built_envelope > build_iti43_envelope(const retrieve_request &req)
Build a SOAP envelope for ITI-43 from a retrieve_request.
kcenon::common::Result< http_response > http_post(const http_options &opts, const std::string &content_type, const std::string &body)
POST body to opts.endpoint with the given Content-Type.
kcenon::common::Result< bool > sign_envelope(built_envelope &env, std::string_view cert_pem, std::string_view key_pem, std::string_view key_password)
Sign the body + timestamp of env in place.
kcenon::common::Result< parsed_mtom > parse_mtom_response(const std::string &content_type_header, const std::string &body)
Parse a multipart/related MTOM response body.
kcenon::common::Result< bool > verify_envelope_integrity(std::string_view signed_xml)
Verify the structural integrity of a previously signed envelope against the certificate embedded in i...
constexpr std::string_view error_source
Short identifier used as the "source" field of make_error.
@ consumer_retrieve_missing_document_id
@ consumer_retrieve_missing_repository_id
SOAP 1.2 envelope builder for IHE XDS.b ITI-43 RetrieveDocumentSet.
Parser for IHE XDS.b ITI-43 RetrieveDocumentSetResponse.
SOAP 1.2 envelope builder for IHE XDS.b ITI-41 requests.
ITI-43 RetrieveDocumentSet response payload.
HTTPS transport options for the Document Source actor.
ITI-43 RetrieveDocumentSet request target.
std::string document_unique_id
std::string repository_unique_id
Signing material for WS-Security XML-DSig.
std::string private_key_password
std::string certificate_pem
std::string private_key_pem
WS-Security XML-DSig signer backed by OpenSSL EVP_DigestSign.
ATNA audit event helpers for the IHE XDS.b actors (ITI-18/41/43).