# HG changeset patch # User Sebastien Jodogne # Date 1440673008 -7200 # Node ID 2bac60a4f584701e4c740dc45a5d898f44552aab # Parent 235d89817b89baaab62a3c3b8cbf744269cee338 OrthancPluginSendHttpStatus diff -r 235d89817b89 -r 2bac60a4f584 NEWS --- a/NEWS Thu Aug 27 12:32:09 2015 +0200 +++ b/NEWS Thu Aug 27 12:56:48 2015 +0200 @@ -7,6 +7,7 @@ * "limit" and "since" arguments while retrieving DICOM resources in the REST API * Support of "deflate" and "gzip" content-types in HTTP requests * Options to validate peers against CA certificates in HTTPS requests +* New configuration option: "HttpTimeout" to set the default timeout for HTTP requests Lua --- @@ -23,15 +24,15 @@ * New function "OrthancPluginReadFile()" to read files from the filesystem * New function "OrthancPluginWriteFile()" to write files to the filesystem * New function "OrthancPluginGetErrorDescription()" to convert error codes to strings +* New function "OrthancPluginSendHttpStatus()" to send HTTP status with a body * Plugins have access to explicit error codes Maintenance ----------- -* New configuration option: "HttpTimeout" to set the default timeout for HTTP requests -* Improved error codes * Many code refactorings -* If error while calling the REST API, the answer body contains an error description +* Improved error codes (no more custom descriptions in exceptions) +* If error while calling the REST API, the answer body contains description of the error (this feature can be disabled with the "HttpDescribeErrors" option) * Upgrade to curl 7.44.0 for static and Windows builds * Upgrade to libcurl 1.0.2d for static and Windows builds diff -r 235d89817b89 -r 2bac60a4f584 Plugins/Engine/OrthancPlugins.cpp --- a/Plugins/Engine/OrthancPlugins.cpp Thu Aug 27 12:32:09 2015 +0200 +++ b/Plugins/Engine/OrthancPlugins.cpp Thu Aug 27 12:56:48 2015 +0200 @@ -522,6 +522,25 @@ } + void OrthancPlugins::SendHttpStatus(const void* parameters) + { + const _OrthancPluginSendHttpStatus& p = + *reinterpret_cast(parameters); + + HttpOutput* translatedOutput = reinterpret_cast(p.output); + HttpStatus status = static_cast(p.status); + + if (p.bodySize > 0 && p.body != NULL) + { + translatedOutput->SendStatus(status, p.body, p.bodySize); + } + else + { + translatedOutput->SendStatus(status); + } + } + + void OrthancPlugins::SendUnauthorized(const void* parameters) { const _OrthancPluginOutputPlusArgument& p = @@ -1043,6 +1062,10 @@ SendMethodNotAllowed(parameters); return true; + case _OrthancPluginService_SendHttpStatus: + SendHttpStatus(parameters); + return true; + case _OrthancPluginService_SendHttpStatusCode: SendHttpStatusCode(parameters); return true; diff -r 235d89817b89 -r 2bac60a4f584 Plugins/Engine/OrthancPlugins.h --- a/Plugins/Engine/OrthancPlugins.h Thu Aug 27 12:32:09 2015 +0200 +++ b/Plugins/Engine/OrthancPlugins.h Thu Aug 27 12:56:48 2015 +0200 @@ -85,6 +85,8 @@ void SendHttpStatusCode(const void* parameters); + void SendHttpStatus(const void* parameters); + void SendUnauthorized(const void* parameters); void SendMethodNotAllowed(const void* parameters); diff -r 235d89817b89 -r 2bac60a4f584 Plugins/Include/orthanc/OrthancCPlugin.h --- a/Plugins/Include/orthanc/OrthancCPlugin.h Thu Aug 27 12:32:09 2015 +0200 +++ b/Plugins/Include/orthanc/OrthancCPlugin.h Thu Aug 27 12:56:48 2015 +0200 @@ -1467,6 +1467,7 @@ * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). * @param output The HTTP connection to the client application. * @param status The HTTP status code to be sent. + * @see OrthancPluginSendHttpStatus() **/ ORTHANC_PLUGIN_INLINE void OrthancPluginSendHttpStatusCode( OrthancPluginContext* context, @@ -2493,6 +2494,50 @@ } + + typedef struct + { + OrthancPluginRestOutput* output; + uint16_t status; + const char* body; + uint32_t bodySize; + } _OrthancPluginSendHttpStatus; + + /** + * @brief Send a HTTP status, with a custom body. + * + * This function answers to a HTTP request by sending a HTTP status + * code (such as "400 - Bad Request"), together with a body + * describing the error. The body will only be returned if the + * configuration option "HttpDescribeErrors" of Orthanc is set to "true". + * + * Note that: + * - Successful requests (status 200) must use ::OrthancPluginAnswerBuffer(). + * - Redirections (status 301) must use ::OrthancPluginRedirect(). + * - Unauthorized access (status 401) must use ::OrthancPluginSendUnauthorized(). + * - Methods not allowed (status 405) must use ::OrthancPluginSendMethodNotAllowed(). + * + * @param context The Orthanc plugin context, as received by OrthancPluginInitialize(). + * @param output The HTTP connection to the client application. + * @param status The HTTP status code to be sent. + * @see OrthancPluginSendHttpStatusCode() + **/ + ORTHANC_PLUGIN_INLINE void OrthancPluginSendHttpStatus( + OrthancPluginContext* context, + OrthancPluginRestOutput* output, + uint16_t status, + const char* body, + uint32_t bodySize) + { + _OrthancPluginSendHttpStatus params; + params.output = output; + params.status = status; + params.body = body; + params.bodySize = bodySize; + context->InvokeService(context, _OrthancPluginService_SendHttpStatus, ¶ms); + } + + #ifdef __cplusplus } #endif