diff --git a/src/envoy/prototype/api_manager_env.cc b/src/envoy/prototype/api_manager_env.cc index b058142597e..79e9f86b3b7 100644 --- a/src/envoy/prototype/api_manager_env.cc +++ b/src/envoy/prototype/api_manager_env.cc @@ -59,6 +59,8 @@ std::unique_ptr Env::StartPeriodicTimer( return timer; } +static const LowerCaseString kApiManagerUrl("x-api-manager-url"); + class HTTPRequest : public Http::Message { private: HeaderMapImpl header_map_; @@ -67,16 +69,26 @@ class HTTPRequest : public Http::Message { public: HTTPRequest(google::api_manager::HTTPRequest *request) : body_(request->body()) { - header_map_.addStatic(Headers::get().Method, request->method()); - header_map_.addStatic(Headers::get().Path, "/"); - header_map_.addStatic(Headers::get().Scheme, "http"); - header_map_.addStatic(Headers::get().Host, "localhost"); - header_map_.addStatic(Headers::get().ContentLength, - std::to_string(body_.length())); - header_map_.addStatic(LowerCaseString("x-api-manager-url"), request->url()); - for (auto header : request->request_headers()) { - LowerCaseString key(header.first); - header_map_.addStatic(key, header.second); + header_map_.addStaticKey(Headers::get().Method, request->method()); + + size_t path_pos = request->url().find('/', 8); + if (path_pos == std::string::npos) { + header_map_.addStaticKey(Headers::get().Path, "/"); + } else { + header_map_.addStaticKey(Headers::get().Path, + request->url().substr(path_pos)); + } + + header_map_.addStaticKey(Headers::get().Scheme, "http"); + header_map_.addStaticKey(Headers::get().Host, "localhost"); + header_map_.addStaticKey(Headers::get().ContentLength, body_.length()); + header_map_.addStaticKey(kApiManagerUrl, request->url()); + for (const auto header : request->request_headers()) { + LowerCaseString lower_key(header.first); + HeaderString key, value; + key.setCopy(lower_key.get().data(), lower_key.get().size()); + value.setCopy(header.second.data(), header.second.size()); + header_map_.addViaMove(std::move(key), std::move(value)); } } virtual HeaderMap &headers() override { return header_map_; } diff --git a/src/envoy/prototype/api_manager_filter.cc b/src/envoy/prototype/api_manager_filter.cc index d310508a592..96bcddb7d6c 100644 --- a/src/envoy/prototype/api_manager_filter.cc +++ b/src/envoy/prototype/api_manager_filter.cc @@ -54,9 +54,12 @@ typedef std::shared_ptr ConfigPtr; class Request : public google::api_manager::Request { private: HeaderMap& header_map_; + bool query_parsed_; + std::map query_params_; public: - Request(HeaderMap& header_map) : header_map_(header_map) {} + Request(HeaderMap& header_map) + : header_map_(header_map), query_parsed_(false) {} virtual std::string GetRequestHTTPMethod() override { return header_map_.Method()->value().c_str(); } @@ -68,12 +71,30 @@ class Request : public google::api_manager::Request { } virtual std::string GetClientIP() override { return ""; } virtual bool FindQuery(const std::string& name, std::string* query) override { - return false; + if (!query_parsed_) { + auto header = header_map_.Path(); + if (header != nullptr) { + std::string path = header->value().c_str(); + Utility::parseQueryString(path).swap(query_params_); + } + query_parsed_ = true; + } + auto entry = query_params_.find(name); + if (entry == query_params_.end()) { + return false; + } + *query = entry->second; + return true; } virtual bool FindHeader(const std::string& name, std::string* header) override { - // TODO: find header with header_map + LowerCaseString key(name); + const HeaderEntry* entry = header_map_.get(key); + if (entry == nullptr) { + return false; + } + *header = entry->value().c_str(); return true; } @@ -83,7 +104,6 @@ class Request : public google::api_manager::Request { } virtual google::api_manager::utils::Status AddHeaderToBackend( const std::string& key, const std::string& value) override { - header_map_.addStatic(LowerCaseString(key), value); return google::api_manager::utils::Status::OK; } virtual void SetAuthToken(const std::string& auth_token) override {}