|  | // Copyright 2017 The Crashpad Authors. All rights reserved. | 
|  | // | 
|  | // 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. | 
|  |  | 
|  | #include "handler/minidump_to_upload_parameters.h" | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "client/annotation.h" | 
|  | #include "snapshot/module_snapshot.h" | 
|  | #include "snapshot/process_snapshot.h" | 
|  | #include "util/stdlib/map_insert.h" | 
|  |  | 
|  | namespace crashpad { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | void InsertOrReplaceMapEntry(std::map<std::string, std::string>* map, | 
|  | const std::string& key, | 
|  | const std::string& value) { | 
|  | std::string old_value; | 
|  | if (!MapInsertOrReplace(map, key, value, &old_value)) { | 
|  | LOG(WARNING) << "duplicate key " << key << ", discarding value " | 
|  | << old_value; | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | std::map<std::string, std::string> BreakpadHTTPFormParametersFromMinidump( | 
|  | const ProcessSnapshot* process_snapshot) { | 
|  | std::map<std::string, std::string> parameters = | 
|  | process_snapshot->AnnotationsSimpleMap(); | 
|  |  | 
|  | std::string list_annotations; | 
|  | for (const ModuleSnapshot* module : process_snapshot->Modules()) { | 
|  | for (const auto& kv : module->AnnotationsSimpleMap()) { | 
|  | if (!parameters.insert(kv).second) { | 
|  | LOG(WARNING) << "duplicate key " << kv.first << ", discarding value " | 
|  | << kv.second; | 
|  | } | 
|  | } | 
|  |  | 
|  | for (std::string annotation : module->AnnotationsVector()) { | 
|  | list_annotations.append(annotation); | 
|  | list_annotations.append("\n"); | 
|  | } | 
|  |  | 
|  | for (const AnnotationSnapshot& annotation : module->AnnotationObjects()) { | 
|  | if (annotation.type != static_cast<uint16_t>(Annotation::Type::kString)) { | 
|  | continue; | 
|  | } | 
|  |  | 
|  | std::string value(reinterpret_cast<const char*>(annotation.value.data()), | 
|  | annotation.value.size()); | 
|  | std::pair<std::string, std::string> entry(annotation.name, value); | 
|  | if (!parameters.insert(entry).second) { | 
|  | LOG(WARNING) << "duplicate annotation name " << annotation.name | 
|  | << ", discarding value " << value; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | if (!list_annotations.empty()) { | 
|  | // Remove the final newline character. | 
|  | list_annotations.resize(list_annotations.size() - 1); | 
|  |  | 
|  | InsertOrReplaceMapEntry(¶meters, "list_annotations", list_annotations); | 
|  | } | 
|  |  | 
|  | UUID client_id; | 
|  | process_snapshot->ClientID(&client_id); | 
|  | InsertOrReplaceMapEntry(¶meters, "guid", client_id.ToString()); | 
|  |  | 
|  | return parameters; | 
|  | } | 
|  |  | 
|  | }  // namespace crashpad |