Skip to content

Commit

Permalink
add option to allow access methods from default url
Browse files Browse the repository at this point in the history
  • Loading branch information
wxf committed Aug 22, 2020
1 parent 7de0d7e commit ca66d1f
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/brpc/policy/http_rpc_protocol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1011,7 +1011,7 @@ FindMethodPropertyByURI(const std::string& uri_path, const Server* server,
const Server::MethodProperty* mp =
FindMethodPropertyByURIImpl(uri_path, server, unresolved_path);
if (mp != NULL) {
if (mp->http_url != NULL) {
if (mp->http_url != NULL && mp->restful_mapped_only) {
// the restful method is accessed from its
// default url (SERVICE/METHOD) which should be rejected.
return NULL;
Expand Down
7 changes: 6 additions & 1 deletion src/brpc/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1305,6 +1305,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
}
if (mp->http_url == NULL) {
mp->http_url = new std::string(mappings[i].path.to_string());
mp->restful_mapped_only = svc_opt.restful_mapped_only;
} else {
if (!mp->http_url->empty()) {
mp->http_url->append(" @");
Expand Down Expand Up @@ -1345,6 +1346,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
}
if (mp->http_url == NULL) {
mp->http_url = new std::string(mappings[i].path.to_string());
mp->restful_mapped_only = svc_opt.restful_mapped_only;
} else {
if (!mp->http_url->empty()) {
mp->http_url->append(" @");
Expand Down Expand Up @@ -1384,6 +1386,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,

ServiceOptions::ServiceOptions()
: ownership(SERVER_DOESNT_OWN_SERVICE)
, restful_mapped_only(true)
, allow_http_body_to_pb(true)
#ifdef BAIDU_INTERNAL
, pb_bytes_to_base64(false)
Expand All @@ -1401,11 +1404,13 @@ int Server::AddService(google::protobuf::Service* service,

int Server::AddService(google::protobuf::Service* service,
ServiceOwnership ownership,
const butil::StringPiece& restful_mappings) {
const butil::StringPiece& restful_mappings,
bool restful_mapped_only) {
ServiceOptions options;
options.ownership = ownership;
// TODO: This is weird
options.restful_mappings = restful_mappings.as_string();
options.restful_mapped_only = restful_mapped_only;
return AddServiceInternal(service, false, options);
}

Expand Down
9 changes: 8 additions & 1 deletion src/brpc/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,11 @@ struct ServiceOptions {
// Default: empty
std::string restful_mappings;

// Work with restful_mappings, if this flag is true, reject methods accessed
// from default urls (SERVICE/METHOD).
// Default: true
bool restful_mapped_only;

// [ Not recommended to change this option ]
// If this flag is true, the service will convert http body to protobuf
// when the pb schema is non-empty in http servings. The body must be
Expand Down Expand Up @@ -334,6 +339,7 @@ class Server {
struct MethodProperty {
bool is_builtin_service;
bool own_method_status;
bool restful_mapped_only;
// Parameters which have nothing to do with management of services, but
// will be used when the service is queried.
struct OpaqueParams {
Expand Down Expand Up @@ -414,7 +420,8 @@ class Server {
ServiceOwnership ownership);
int AddService(google::protobuf::Service* service,
ServiceOwnership ownership,
const butil::StringPiece& restful_mappings);
const butil::StringPiece& restful_mappings,
bool restful_mapped_only = true);
int AddService(google::protobuf::Service* service,
const ServiceOptions& options);

Expand Down

0 comments on commit ca66d1f

Please sign in to comment.