| 215 | std::string Uri::query_string() const { return TextRangeToString(impl_->uri_.query); } |
| 216 | |
| 217 | Result<std::vector<std::pair<std::string, std::string>>> Uri::query_items() const { |
| 218 | const auto& query = impl_->uri_.query; |
| 219 | UriQueryListA* query_list; |
| 220 | int item_count; |
| 221 | std::vector<std::pair<std::string, std::string>> items; |
| 222 | |
| 223 | if (query.first == nullptr) { |
| 224 | return items; |
| 225 | } |
| 226 | if (uriDissectQueryMallocA(&query_list, &item_count, query.first, query.afterLast) != |
| 227 | URI_SUCCESS) { |
| 228 | return Status::Invalid("Cannot parse query string: '", query_string(), "'"); |
| 229 | } |
| 230 | std::unique_ptr<UriQueryListA, decltype(&uriFreeQueryListA)> query_guard( |
| 231 | query_list, uriFreeQueryListA); |
| 232 | |
| 233 | items.reserve(item_count); |
| 234 | while (query_list != nullptr) { |
| 235 | if (query_list->value != nullptr) { |
| 236 | items.emplace_back(query_list->key, query_list->value); |
| 237 | } else { |
| 238 | items.emplace_back(query_list->key, ""); |
| 239 | } |
| 240 | query_list = query_list->next; |
| 241 | } |
| 242 | return items; |
| 243 | } |
| 244 | |
| 245 | const std::string& Uri::ToString() const { return impl_->string_rep_; } |
| 246 | |