Mercurial > hg > orthanc
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 } |