Skip to content

Commit

Permalink
Merge pull request envoyproxy#27 from lizan/fix_prototype_memory
Browse files Browse the repository at this point in the history
Improve envoy prototype
  • Loading branch information
lizan authored Jan 4, 2017
2 parents bb3c4d4 + 5c48caf commit e941522
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 14 deletions.
32 changes: 22 additions & 10 deletions src/envoy/prototype/api_manager_env.cc
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ std::unique_ptr<google::api_manager::PeriodicTimer> Env::StartPeriodicTimer(
return timer;
}

static const LowerCaseString kApiManagerUrl("x-api-manager-url");

class HTTPRequest : public Http::Message {
private:
HeaderMapImpl header_map_;
Expand All @@ -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_; }
Expand Down
28 changes: 24 additions & 4 deletions src/envoy/prototype/api_manager_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,12 @@ typedef std::shared_ptr<Config> ConfigPtr;
class Request : public google::api_manager::Request {
private:
HeaderMap& header_map_;
bool query_parsed_;
std::map<std::string, std::string> 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();
}
Expand All @@ -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;
}

Expand All @@ -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 {}
Expand Down

0 comments on commit e941522

Please sign in to comment.