71 return kcenon::common::make_error<built_envelope>(
74 "retrieve_request.document_unique_id is empty",
78 return kcenon::common::make_error<built_envelope>(
81 "retrieve_request.repository_unique_id is empty",
85 pugi::xml_document doc;
86 auto decl = doc.append_child(pugi::node_declaration);
87 decl.append_attribute(
"version") =
"1.0";
88 decl.append_attribute(
"encoding") =
"UTF-8";
90 auto env = doc.append_child(
"soap:Envelope");
91 env.append_attribute(
"xmlns:soap") = kSoapEnv;
92 env.append_attribute(
"xmlns:wsa") = kWsa;
93 env.append_attribute(
"xmlns:wsse") = kWsse;
94 env.append_attribute(
"xmlns:wsu") = kWsu;
95 env.append_attribute(
"xmlns:xdsb") = kXdsb;
97 auto header = env.append_child(
"soap:Header");
99 auto action = header.append_child(
"wsa:Action");
100 action.append_attribute(
"soap:mustUnderstand") =
"true";
101 action.text().set(
"urn:ihe:iti:2007:RetrieveDocumentSet");
103 auto message_id = header.append_child(
"wsa:MessageID");
104 message_id.text().set((
"urn:uuid:" + make_xml_id(
"msg")).c_str());
106 auto security = header.append_child(
"wsse:Security");
107 security.append_attribute(
"soap:mustUnderstand") =
"true";
110 out.timestamp_id = make_xml_id(
"ts");
111 out.binary_security_token_id = make_xml_id(
"bst");
112 out.body_id = make_xml_id(
"body");
114 auto timestamp = security.append_child(
"wsu:Timestamp");
115 timestamp.append_attribute(
"wsu:Id") =
out.timestamp_id.c_str();
116 auto created = timestamp.append_child(
"wsu:Created");
117 const std::string now = utc_iso8601_now();
118 created.text().set(now.c_str());
120 auto bst = security.append_child(
"wsse:BinarySecurityToken");
121 bst.append_attribute(
"wsu:Id") =
out.binary_security_token_id.c_str();
122 bst.append_attribute(
"EncodingType") =
123 "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-"
124 "security-1.0#Base64Binary";
125 bst.append_attribute(
"ValueType") =
126 "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-"
127 "profile-1.0#X509v3";
129 auto body = env.append_child(
"soap:Body");
130 body.append_attribute(
"wsu:Id") =
out.body_id.c_str();
132 auto rq = body.append_child(
"xdsb:RetrieveDocumentSetRequest");
133 auto doc_req = rq.append_child(
"xdsb:DocumentRequest");
138 doc_req.append_child(
"xdsb:RepositoryUniqueId")
141 doc_req.append_child(
"xdsb:DocumentUniqueId")
145 xml_string_writer writer;
146 doc.save(writer,
"", pugi::format_raw | pugi::format_no_declaration,
147 pugi::encoding_utf8);
148 if (writer.out.empty()) {
149 return kcenon::common::make_error<built_envelope>(
151 "pugixml produced an empty envelope",
155 out.xml = R
"(<?xml version="1.0" encoding="UTF-8"?>)";
156 out.xml += writer.out;