comparison Plugins/Engine/OrthancPlugins.cpp @ 2268:ce5c13b95dac

New function: OrthancPluginRegisterIncomingHttpRequestFilter2()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 22 Feb 2017 21:49:16 +0100
parents de1ba22fd28a
children 415450f11cc7
comparison
equal deleted inserted replaced
2267:f915aff7a866 2268:ce5c13b95dac
343 typedef std::pair<std::string, _OrthancPluginProperty> Property; 343 typedef std::pair<std::string, _OrthancPluginProperty> Property;
344 typedef std::list<RestCallback*> RestCallbacks; 344 typedef std::list<RestCallback*> RestCallbacks;
345 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks; 345 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks;
346 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; 346 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks;
347 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; 347 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters;
348 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2;
348 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; 349 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks;
349 typedef std::map<Property, std::string> Properties; 350 typedef std::map<Property, std::string> Properties;
350 351
351 PluginsManager manager_; 352 PluginsManager manager_;
352 353
356 OrthancPluginFindCallback findCallback_; 357 OrthancPluginFindCallback findCallback_;
357 OrthancPluginWorklistCallback worklistCallback_; 358 OrthancPluginWorklistCallback worklistCallback_;
358 DecodeImageCallbacks decodeImageCallbacks_; 359 DecodeImageCallbacks decodeImageCallbacks_;
359 _OrthancPluginMoveCallback moveCallbacks_; 360 _OrthancPluginMoveCallback moveCallbacks_;
360 IncomingHttpRequestFilters incomingHttpRequestFilters_; 361 IncomingHttpRequestFilters incomingHttpRequestFilters_;
362 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_;
361 std::auto_ptr<StorageAreaFactory> storageArea_; 363 std::auto_ptr<StorageAreaFactory> storageArea_;
362 364
363 boost::recursive_mutex restCallbackMutex_; 365 boost::recursive_mutex restCallbackMutex_;
364 boost::recursive_mutex storedCallbackMutex_; 366 boost::recursive_mutex storedCallbackMutex_;
365 boost::recursive_mutex changeCallbackMutex_; 367 boost::recursive_mutex changeCallbackMutex_;
1119 LOG(INFO) << "Plugin has registered a callback to filter incoming HTTP requests"; 1121 LOG(INFO) << "Plugin has registered a callback to filter incoming HTTP requests";
1120 pimpl_->incomingHttpRequestFilters_.push_back(p.callback); 1122 pimpl_->incomingHttpRequestFilters_.push_back(p.callback);
1121 } 1123 }
1122 1124
1123 1125
1126 void OrthancPlugins::RegisterIncomingHttpRequestFilter2(const void* parameters)
1127 {
1128 const _OrthancPluginIncomingHttpRequestFilter2& p =
1129 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter2*>(parameters);
1130
1131 LOG(INFO) << "Plugin has registered a callback to filter incoming HTTP requests";
1132 pimpl_->incomingHttpRequestFilters2_.push_back(p.callback);
1133 }
1134
1135
1124 void OrthancPlugins::AnswerBuffer(const void* parameters) 1136 void OrthancPlugins::AnswerBuffer(const void* parameters)
1125 { 1137 {
1126 const _OrthancPluginAnswerBuffer& p = 1138 const _OrthancPluginAnswerBuffer& p =
1127 *reinterpret_cast<const _OrthancPluginAnswerBuffer*>(parameters); 1139 *reinterpret_cast<const _OrthancPluginAnswerBuffer*>(parameters);
1128 1140
2686 2698
2687 case _OrthancPluginService_RegisterIncomingHttpRequestFilter: 2699 case _OrthancPluginService_RegisterIncomingHttpRequestFilter:
2688 RegisterIncomingHttpRequestFilter(parameters); 2700 RegisterIncomingHttpRequestFilter(parameters);
2689 return true; 2701 return true;
2690 2702
2703 case _OrthancPluginService_RegisterIncomingHttpRequestFilter2:
2704 RegisterIncomingHttpRequestFilter2(parameters);
2705 return true;
2706
2691 case _OrthancPluginService_RegisterStorageArea: 2707 case _OrthancPluginService_RegisterStorageArea:
2692 { 2708 {
2693 LOG(INFO) << "Plugin has registered a custom storage area"; 2709 LOG(INFO) << "Plugin has registered a custom storage area";
2694 const _OrthancPluginRegisterStorageArea& p = 2710 const _OrthancPluginRegisterStorageArea& p =
2695 *reinterpret_cast<const _OrthancPluginRegisterStorageArea*>(parameters); 2711 *reinterpret_cast<const _OrthancPluginRegisterStorageArea*>(parameters);
3096 3112
3097 bool OrthancPlugins::IsAllowed(HttpMethod method, 3113 bool OrthancPlugins::IsAllowed(HttpMethod method,
3098 const char* uri, 3114 const char* uri,
3099 const char* ip, 3115 const char* ip,
3100 const char* username, 3116 const char* username,
3101 const IHttpHandler::Arguments& httpHeaders) const 3117 const IHttpHandler::Arguments& httpHeaders,
3102 { 3118 const IHttpHandler::GetArguments& getArguments) const
3119 {
3120 OrthancPluginHttpMethod cMethod = Plugins::Convert(method);
3121
3103 std::vector<const char*> httpKeys(httpHeaders.size()); 3122 std::vector<const char*> httpKeys(httpHeaders.size());
3104 std::vector<const char*> httpValues(httpHeaders.size()); 3123 std::vector<const char*> httpValues(httpHeaders.size());
3105 3124
3106 size_t pos = 0; 3125 size_t pos = 0;
3107 for (IHttpHandler::Arguments::const_iterator 3126 for (IHttpHandler::Arguments::const_iterator
3109 { 3128 {
3110 httpKeys[pos] = it->first.c_str(); 3129 httpKeys[pos] = it->first.c_str();
3111 httpValues[pos] = it->second.c_str(); 3130 httpValues[pos] = it->second.c_str();
3112 } 3131 }
3113 3132
3114 OrthancPluginHttpMethod cMethod = Plugins::Convert(method); 3133 std::vector<const char*> getKeys(getArguments.size());
3115 const char** cHttpKeys = (httpKeys.size() == 0 ? NULL : &httpKeys[0]); 3134 std::vector<const char*> getValues(getArguments.size());
3116 const char** cHttpValues = (httpValues.size() == 0 ? NULL : &httpValues[0]); 3135
3136 for (size_t i = 0; i < getArguments.size(); i++)
3137 {
3138 getKeys[i] = getArguments[i].first.c_str();
3139 getValues[i] = getArguments[i].second.c_str();
3140 }
3141
3142 // Improved callback with support for GET arguments, since Orthanc 1.2.1
3143 for (PImpl::IncomingHttpRequestFilters2::const_iterator
3144 filter = pimpl_->incomingHttpRequestFilters2_.begin();
3145 filter != pimpl_->incomingHttpRequestFilters2_.end(); ++filter)
3146 {
3147 int32_t allowed = (*filter) (cMethod, uri, ip,
3148 httpKeys.size(),
3149 httpKeys.empty() ? NULL : &httpKeys[0],
3150 httpValues.empty() ? NULL : &httpValues[0],
3151 getKeys.size(),
3152 getKeys.empty() ? NULL : &getKeys[0],
3153 getValues.empty() ? NULL : &getValues[0]);
3154
3155 if (allowed == 0)
3156 {
3157 return false;
3158 }
3159 else if (allowed != 1)
3160 {
3161 // The callback is only allowed to answer 0 or 1
3162 throw OrthancException(ErrorCode_Plugin);
3163 }
3164 }
3117 3165
3118 for (PImpl::IncomingHttpRequestFilters::const_iterator 3166 for (PImpl::IncomingHttpRequestFilters::const_iterator
3119 filter = pimpl_->incomingHttpRequestFilters_.begin(); 3167 filter = pimpl_->incomingHttpRequestFilters_.begin();
3120 filter != pimpl_->incomingHttpRequestFilters_.end(); ++filter) 3168 filter != pimpl_->incomingHttpRequestFilters_.end(); ++filter)
3121 { 3169 {
3122 int32_t allowed = (*filter) (cMethod, uri, ip, httpKeys.size(), cHttpKeys, cHttpValues); 3170 int32_t allowed = (*filter) (cMethod, uri, ip, httpKeys.size(),
3123 3171 httpKeys.empty() ? NULL : &httpKeys[0],
3124 if (allowed != 0 && 3172 httpValues.empty() ? NULL : &httpValues[0]);
3125 allowed != 1) 3173
3126 { 3174 if (allowed == 0)
3175 {
3176 return false;
3177 }
3178 else if (allowed != 1)
3179 {
3180 // The callback is only allowed to answer 0 or 1
3127 throw OrthancException(ErrorCode_Plugin); 3181 throw OrthancException(ErrorCode_Plugin);
3128 } 3182 }
3129
3130 if (allowed == 0)
3131 {
3132 return false;
3133 }
3134 } 3183 }
3135 3184
3136 return true; 3185 return true;
3137 } 3186 }
3138 } 3187 }