[cpp-restsdk] fix crashes and constness (#5123)

* []c++[cpprest]fix some constness and invalid access to null  entities

* update petstore sample
This commit is contained in:
eimerej
2020-02-13 20:59:33 +01:00
committed by GitHub
parent 5a5c3db938
commit 346cfc62f3
44 changed files with 179 additions and 160 deletions

View File

@@ -35,7 +35,7 @@ public:
{{#allParams}}
{{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}},{{/hasMore}}
{{/allParams}}
) = 0;
) const = 0;
{{/operation}}
};{{/gmockApis}}
@@ -46,7 +46,7 @@ public:
using Base = I{{classname}};
{{/gmockApis}}
explicit {{classname}}( std::shared_ptr<ApiClient> apiClient );
explicit {{classname}}( std::shared_ptr<const ApiClient> apiClient );
{{#gmockApis}}
~{{classname}}() override;
@@ -69,11 +69,11 @@ public:
{{#allParams}}
{{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}},{{/hasMore}}
{{/allParams}}
){{#gmockApis}} override{{/gmockApis}};
) const{{#gmockApis}} override{{/gmockApis}};
{{/operation}}
protected:
std::shared_ptr<ApiClient> m_ApiClient;
std::shared_ptr<const ApiClient> m_ApiClient;
};
{{#apiNamespaceDeclarations}}

View File

@@ -16,7 +16,7 @@ namespace {{this}} {
using namespace {{modelNamespace}};
{{classname}}::{{classname}}( std::shared_ptr<ApiClient> apiClient )
{{classname}}::{{classname}}( std::shared_ptr<const ApiClient> apiClient )
: m_ApiClient(apiClient)
{
}
@@ -26,7 +26,7 @@ using namespace {{modelNamespace}};
}
{{#operation}}
pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{classname}}::{{operationId}}({{#allParams}}{{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{classname}}::{{operationId}}({{#allParams}}{{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) const
{
{{#allParams}}{{#required}}{{^isPrimitiveType}}{{^isContainer}}
// verify the required parameter '{{paramName}}' is set
@@ -36,7 +36,7 @@ pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/r
}
{{/isContainer}}{{/isPrimitiveType}}{{/required}}{{/allParams}}
std::shared_ptr<ApiConfiguration> localVarApiConfiguration( m_ApiClient->getConfiguration() );
std::shared_ptr<const ApiConfiguration> localVarApiConfiguration( m_ApiClient->getConfiguration() );
utility::string_t localVarPath = utility::conversions::to_string_t("{{{path}}}");
{{#pathParams}}boost::replace_all(localVarPath, utility::conversions::to_string_t("{") + utility::conversions::to_string_t("{{baseName}}") + utility::conversions::to_string_t("}"), ApiClient::parameterToString({{{paramName}}}));
{{/pathParams}}

View File

@@ -34,7 +34,7 @@ using namespace {{modelNamespace}};
class {{declspec}} ApiClient
{
public:
ApiClient( std::shared_ptr<ApiConfiguration> configuration = nullptr );
ApiClient( std::shared_ptr<const ApiConfiguration> configuration = nullptr );
virtual ~ApiClient();
typedef std::function<void(web::http::status_code, const web::http::http_headers&)> ResponseHandlerType;
@@ -42,8 +42,8 @@ public:
const ResponseHandlerType& getResponseHandler() const;
void setResponseHandler(const ResponseHandlerType& responseHandler);
std::shared_ptr<ApiConfiguration> getConfiguration() const;
void setConfiguration(std::shared_ptr<ApiConfiguration> configuration);
std::shared_ptr<const ApiConfiguration> getConfiguration() const;
void setConfiguration(std::shared_ptr<const ApiConfiguration> configuration);
static utility::string_t parameterToString(utility::string_t value);
static utility::string_t parameterToString(int32_t value);
@@ -70,7 +70,7 @@ public:
protected:
ResponseHandlerType m_ResponseHandler;
std::shared_ptr<ApiConfiguration> m_Configuration;
std::shared_ptr<const ApiConfiguration> m_Configuration;
};
template<class T>

View File

@@ -21,7 +21,7 @@ namespace {{this}} {
using namespace {{modelNamespace}};
ApiClient::ApiClient(std::shared_ptr<ApiConfiguration> configuration )
ApiClient::ApiClient(std::shared_ptr<const ApiConfiguration> configuration )
: m_Configuration(configuration)
{
}
@@ -37,11 +37,11 @@ void ApiClient::setResponseHandler(const ResponseHandlerType& responseHandler) {
m_ResponseHandler = responseHandler;
}
std::shared_ptr<ApiConfiguration> ApiClient::getConfiguration() const
std::shared_ptr<const ApiConfiguration> ApiClient::getConfiguration() const
{
return m_Configuration;
}
void ApiClient::setConfiguration(std::shared_ptr<ApiConfiguration> configuration)
void ApiClient::setConfiguration(std::shared_ptr<const ApiConfiguration> configuration)
{
m_Configuration = configuration;
}
@@ -108,7 +108,7 @@ pplx::task<web::http::http_response> ApiClient::callApi(
web::http::client::http_client client(m_Configuration->getBaseUrl(), m_Configuration->getHttpConfig());
web::http::http_request request;
for ( auto& kvp : headerParams )
for (const auto& kvp : headerParams)
{
request.headers().add(kvp.first, kvp.second);
}
@@ -116,18 +116,18 @@ pplx::task<web::http::http_response> ApiClient::callApi(
if (fileParams.size() > 0)
{
MultipartFormData uploadData;
for (auto& kvp : formParams)
for (const auto& kvp : formParams)
{
uploadData.add(ModelBase::toHttpContent(kvp.first, kvp.second));
}
for (auto& kvp : fileParams)
for (const auto& kvp : fileParams)
{
uploadData.add(ModelBase::toHttpContent(kvp.first, kvp.second));
}
std::stringstream data;
uploadData.writeTo(data);
auto bodyString = data.str();
auto length = bodyString.size();
const auto length = bodyString.size();
request.set_body(concurrency::streams::bytestream::open_istream(std::move(bodyString)), length, utility::conversions::to_string_t("multipart/form-data; boundary=") + uploadData.getBoundary());
}
else
@@ -137,7 +137,7 @@ pplx::task<web::http::http_response> ApiClient::callApi(
std::stringstream data;
postBody->writeTo(data);
auto bodyString = data.str();
auto length = bodyString.size();
const auto length = bodyString.size();
request.set_body(concurrency::streams::bytestream::open_istream(std::move(bodyString)), length, contentType);
}
else
@@ -157,7 +157,7 @@ pplx::task<web::http::http_response> ApiClient::callApi(
else
{
web::http::uri_builder formData;
for (auto& kvp : formParams)
for (const auto& kvp : formParams)
{
formData.append_query(kvp.first, kvp.second);
}
@@ -170,7 +170,7 @@ pplx::task<web::http::http_response> ApiClient::callApi(
}
web::http::uri_builder builder(path);
for (auto& kvp : queryParams)
for (const auto& kvp : queryParams)
{
builder.append_query(kvp.first, kvp.second);
}

View File

@@ -24,7 +24,7 @@ public:
ApiConfiguration();
virtual ~ApiConfiguration();
web::http::client::http_client_config& getHttpConfig();
const web::http::client::http_client_config& getHttpConfig() const;
void setHttpConfig( web::http::client::http_client_config& value );
utility::string_t getBaseUrl() const;
@@ -34,6 +34,7 @@ public:
void setUserAgent( const utility::string_t value );
std::map<utility::string_t, utility::string_t>& getDefaultHeaders();
const std::map<utility::string_t, utility::string_t>& getDefaultHeaders() const;
utility::string_t getApiKey( const utility::string_t& prefix) const;
void setApiKey( const utility::string_t& prefix, const utility::string_t& apiKey );

View File

@@ -13,7 +13,7 @@ ApiConfiguration::~ApiConfiguration()
{
}
web::http::client::http_client_config& ApiConfiguration::getHttpConfig()
const web::http::client::http_client_config& ApiConfiguration::getHttpConfig() const
{
return m_HttpConfig;
}
@@ -48,6 +48,11 @@ std::map<utility::string_t, utility::string_t>& ApiConfiguration::getDefaultHead
return m_DefaultHeaders;
}
const std::map<utility::string_t, utility::string_t>& ApiConfiguration::getDefaultHeaders() const
{
return m_DefaultHeaders;
}
utility::string_t ApiConfiguration::getApiKey( const utility::string_t& prefix) const
{
auto result = m_ApiKeys.find(prefix);

View File

@@ -265,7 +265,7 @@ void {{classname}}::fromJson(const web::json::value& val)
}
else
{
{{{items.datatype}}} newItem({{{items.defaultValue}}});
auto newItem = std::make_shared<{{{items.datatype}}}::element_type>();
newItem->fromJson(item);
m_{{name}}.push_back( newItem );
}
@@ -309,7 +309,7 @@ void {{classname}}::fromJson(const web::json::value& val)
}
else
{
{{{items.datatype}}} newItem({{{items.defaultValue}}});
auto newItem = std::make_shared<{{{items.datatype}}}::element_type>();
newItem->fromJson(item.at(utility::conversions::to_string_t("value")));
m_{{name}}.insert(std::pair<utility::string_t,{{{items.datatype}}}>( key, newItem ));
}
@@ -344,7 +344,7 @@ void {{classname}}::fromJson(const web::json::value& val)
{{/isDateTime}}
{{^isDateTime}}
{{^isByteArray}}
{{{dataType}}} newItem({{{defaultValue}}});
auto newItem = std::make_shared<{{{datatype}}}::element_type>();
newItem->fromJson(fieldValue);
{{setter}}( newItem );
{{/isByteArray}}
@@ -371,7 +371,7 @@ void {{classname}}::fromJson(const web::json::value& val)
{{setter}}(ModelBase::fileFromJson(val.at(utility::conversions::to_string_t("{{baseName}}"))));
{{/vendorExtensions.x-codegen-file}}
{{^vendorExtensions.x-codegen-file}}
{{{dataType}}} new{{name}}({{{defaultValue}}});
auto new{{name}} = std::make_shared<{{{dataType}}}::element_type>();
new{{name}}->fromJson(val.at(utility::conversions::to_string_t("{{baseName}}")));
{{setter}}( new{{name}} );
{{/vendorExtensions.x-codegen-file}}
@@ -553,7 +553,7 @@ void {{classname}}::fromMultiPart(std::shared_ptr<MultipartFormData> multipart,
}
else
{
{{{items.datatype}}} newItem({{{items.defaultValue}}});
auto newItem = std::make_shared<{{{items.datatype}}}::element_type>();
newItem->fromJson(item);
m_{{name}}.push_back( newItem );
}
@@ -600,7 +600,7 @@ void {{classname}}::fromMultiPart(std::shared_ptr<MultipartFormData> multipart,
}
else
{
{{{items.datatype}}} newItem({{{items.defaultValue}}});
auto newItem = std::make_shared<{{{items.datatype}}}::element_type>();
newItem->fromJson(item[utility::conversions::to_string_t("value")]);
m_{{name}}.insert(std::pair<utility::string_t,{{{items.datatype}}}>( key, newItem ));
}
@@ -633,7 +633,7 @@ void {{classname}}::fromMultiPart(std::shared_ptr<MultipartFormData> multipart,
{{^isDateTime}}
if(multipart->hasContent(utility::conversions::to_string_t("{{baseName}}")))
{
{{{dataType}}} newItem({{{defaultValue}}});
auto newItem = std::make_shared<{{{datatype}}}::element_type>();
newItem->fromMultiPart(multipart, utility::conversions::to_string_t("{{baseName}}."));
{{setter}}( newItem );
}
@@ -659,7 +659,7 @@ void {{classname}}::fromMultiPart(std::shared_ptr<MultipartFormData> multipart,
{{setter}}(multipart->getContent(utility::conversions::to_string_t("{{baseName}}")));
{{/vendorExtensions.x-codegen-file}}
{{^vendorExtensions.x-codegen-file}}
{{{dataType}}} new{{name}}({{{defaultValue}}});
auto new{{name}} = std::make_shared<{{{dataType}}}::element_type>();
new{{name}}->fromMultiPart(multipart, utility::conversions::to_string_t("{{baseName}}."));
{{setter}}( new{{name}} );
{{/vendorExtensions.x-codegen-file}}