1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-12-04 14:46:30 -05:00

Update: Refactor error codes to a key-indexed array

Instead of storing the ID in the icecast_error_tag, use it as
array index for the error codes lookup list. That way its not
needed anymore to iterate the whole list to lookup errors by id.
This commit is contained in:
Marvin Scholz 2020-09-04 01:27:29 +02:00
parent 987bdec373
commit d22ce7b95d
2 changed files with 209 additions and 133 deletions

View File

@ -16,140 +16,215 @@
#include "logging.h"
#define CATMODULE "errors"
// cut -d' ' -f2 x | while read x; do printf " {.id = %-60s .http_status = xxx,\n .message = \"\"},\n" "$x",; done
static const icecast_error_t __errors[] = {
{.id = ICECAST_ERROR_ADMIN_DEST_NOT_RUNNING, .http_status = 400,
static const icecast_error_t __errors[ICECAST_ERROR_END_SENTINEL] =
{
[ICECAST_ERROR_ADMIN_DEST_NOT_RUNNING] = {
.http_status = 400,
.uuid = "52735a81-16fe-4d7e-9984-5aed8a941055",
.message = "Destination not running"},
{.id = ICECAST_ERROR_ADMIN_METADAT_BADCALL, .http_status = 400,
.message = "Destination not running"
},
[ICECAST_ERROR_ADMIN_METADAT_BADCALL] = {
.http_status = 400,
.uuid = "85d33e67-5c4e-4511-b4fa-3ca69ccd03de",
.message = "illegal metadata call"},
{.id = ICECAST_ERROR_ADMIN_METADAT_NO_SUCH_ACTION, .http_status = 501,
.message = "illegal metadata call"
},
[ICECAST_ERROR_ADMIN_METADAT_NO_SUCH_ACTION] = {
.http_status = 501,
.uuid = "14f4d814-98d9-468c-8a0b-ba5e74c9d771",
.message = "No such action"},
{.id = ICECAST_ERROR_ADMIN_MISSING_PARAMETER, .http_status = 400,
.message = "No such action"
},
[ICECAST_ERROR_ADMIN_MISSING_PARAMETER] = {
.http_status = 400,
.uuid = "cb11dc71-6149-454c-8d4e-47a3af26b03a",
.message = "Missing parameter"},
{.id = ICECAST_ERROR_ADMIN_missing_parameter, .http_status = 400,
.message = "Missing parameter"
},
[ICECAST_ERROR_ADMIN_missing_parameter] = {
.http_status = 400,
.uuid = "8be9ef0a-2b32-450c-aec9-a414ca0c074c",
.message = "missing parameter"},
{.id = ICECAST_ERROR_ADMIN_MOUNT_NOT_ACCEPT_URL_UPDATES, .http_status = 501,
.message = "missing parameter"
},
[ICECAST_ERROR_ADMIN_MOUNT_NOT_ACCEPT_URL_UPDATES] = {
.http_status = 501,
.uuid = "3bed51bb-a10f-4af3-9965-4e67181de7d6",
.message = "mountpoint will not accept URL updates"},
{.id = ICECAST_ERROR_ADMIN_NO_SUCH_DESTINATION, .http_status = 404,
.message = "mountpoint will not accept URL updates"
},
[ICECAST_ERROR_ADMIN_NO_SUCH_DESTINATION] = {
.http_status = 404,
.uuid = "c5f1ee06-46a0-4697-9f01-6e9fc333d555",
.message = "No such destination"},
{.id = ICECAST_ERROR_ADMIN_ROLEMGN_ADD_NOSYS, .http_status = 501,
.message = "No such destination"
},
[ICECAST_ERROR_ADMIN_ROLEMGN_ADD_NOSYS] = {
.http_status = 501,
.uuid = "7e1a8426-2ae1-4a6b-bfd9-59d8f8153021",
.message = "Adding users to role not supported by role"},
{.id = ICECAST_ERROR_ADMIN_ROLEMGN_DELETE_NOSYS, .http_status = 501,
.message = "Adding users to role not supported by role"
},
[ICECAST_ERROR_ADMIN_ROLEMGN_DELETE_NOSYS] = {
.http_status = 501,
.uuid = "367fbad1-389e-4292-bba8-c97984e616cc",
.message = "Deleting users from role not supported by role"},
{.id = ICECAST_ERROR_ADMIN_ROLEMGN_ROLE_NOT_FOUND, .http_status = 404,
.message = "Deleting users from role not supported by role"
},
[ICECAST_ERROR_ADMIN_ROLEMGN_ROLE_NOT_FOUND] = {
.http_status = 404,
.uuid = "59fe9c81-8c34-49ff-800f-7ec42ea498be",
.message = "Role not found"},
{.id = ICECAST_ERROR_ADMIN_SOURCE_DOES_NOT_EXIST, .http_status = 404,
.message = "Role not found"
},
[ICECAST_ERROR_ADMIN_SOURCE_DOES_NOT_EXIST] = {
.http_status = 404,
.uuid = "2f51a026-02e4-4fe4-bf9d-cc16557b3b65",
.message = "Source does not exist"},
{.id = ICECAST_ERROR_ADMIN_SOURCE_IS_NOT_AVAILABLE, .http_status = 400,
.message = "Source does not exist"
},
[ICECAST_ERROR_ADMIN_SOURCE_IS_NOT_AVAILABLE] = {
.http_status = 400,
.uuid = "00b9d977-f41d-455f-820f-6d457dffb246",
.message = "Source is not available"},
{.id = ICECAST_ERROR_ADMIN_SUPPLIED_MOUNTPOINTS_ARE_IDENTICAL, .http_status = 400,
.message = "Source is not available"
},
[ICECAST_ERROR_ADMIN_SUPPLIED_MOUNTPOINTS_ARE_IDENTICAL] = {
.http_status = 400,
.uuid = "4be9a010-7a3f-44e4-b74d-3c6d9c4f7236",
.message = "supplied mountpoints are identical"},
{.id = ICECAST_ERROR_ADMIN_UNRECOGNISED_COMMAND, .http_status = 400,
.message = "supplied mountpoints are identical"
},
[ICECAST_ERROR_ADMIN_UNRECOGNISED_COMMAND] = {
.http_status = 400,
.uuid = "811bddac-5be5-4580-9cde-7b849e66dfe5",
.message = "unrecognised command"},
{.id = ICECAST_ERROR_AUTH_BUSY, .http_status = 503,
.message = "unrecognised command"
},
[ICECAST_ERROR_AUTH_BUSY] = {
.http_status = 503,
.uuid = "26708754-8f98-4191-81d1-7fb7246200d6",
.message = "busy, please try again later"},
{.id = ICECAST_ERROR_CON_CONTENT_TYPE_NOSYS, .http_status = 415,
.message = "busy, please try again later"
},
[ICECAST_ERROR_CON_CONTENT_TYPE_NOSYS] = {
.http_status = 415,
.uuid = "f684ad3c-513b-4d87-9a66-424788bc6adb",
.message = "Content-type not supported"},
{.id = ICECAST_ERROR_CON_INTERNAL_FORMAT_ALLOC_ERROR, .http_status = 500,
.message = "Content-type not supported"
},
[ICECAST_ERROR_CON_INTERNAL_FORMAT_ALLOC_ERROR] = {
.http_status = 500,
.uuid = "47a4b11b-5d2a-46e2-8948-942e7b0af3e6",
.message = "internal format allocation problem"},
{.id = ICECAST_ERROR_CON_MISSING_PASS_PARAMETER, .http_status = 400 /* XXX */,
.message = "internal format allocation problem"
},
[ICECAST_ERROR_CON_MISSING_PASS_PARAMETER] = {
.http_status = 400 /* XXX */,
.uuid = "b59c3a05-e2b1-4a14-8798-bbe1ae46603b",
.message = "missing pass parameter"},
{.id = ICECAST_ERROR_CON_MOUNT_IN_USE, .http_status = 409,
.message = "missing pass parameter"
},
[ICECAST_ERROR_CON_MOUNT_IN_USE] = {
.http_status = 409,
.uuid = "c5724467-5f85-48c7-b45a-915c3150c292",
.message = "Mountpoint in use"},
{.id = ICECAST_ERROR_CON_MOUNTPOINT_NOT_STARTING_WITH_SLASH, .http_status = 400,
.message = "Mountpoint in use"
},
[ICECAST_ERROR_CON_MOUNTPOINT_NOT_STARTING_WITH_SLASH] = {
.http_status = 400,
.uuid = "1ae45ead-40fc-4de2-b56f-e54d3247f2ee",
.message = "source mountpoint not starting with /"},
{.id = ICECAST_ERROR_CON_NO_CONTENT_TYPE_GIVEN, .http_status = 400,
.message = "source mountpoint not starting with /"
},
[ICECAST_ERROR_CON_NO_CONTENT_TYPE_GIVEN] = {
.http_status = 400,
.uuid = "2cd86778-ac30-49e7-a108-26d627a7923b",
.message = "No Content-type given"},
{.id = ICECAST_ERROR_CON_PER_CRED_CLIENT_LIMIT, .http_status = 429,
.message = "No Content-type given"
},
[ICECAST_ERROR_CON_PER_CRED_CLIENT_LIMIT] = {
.http_status = 429,
.uuid = "9c72c1ec-f638-4d33-a077-6acbbff25317",
.message = "Reached limit of concurrent connections on those credentials"},
{.id = ICECAST_ERROR_CON_rejecting_client_for_whatever_reason, .http_status = 403 /* XXX */,
.message = "Reached limit of concurrent connections on those credentials"
},
[ICECAST_ERROR_CON_rejecting_client_for_whatever_reason] = {
.http_status = 403 /* XXX */,
.uuid = "534ee9af-8be5-4645-a839-501d22d541bd",
.message = "Rejecting client for whatever reason"},
{.id = ICECAST_ERROR_CON_SOURCE_CLIENT_LIMIT, .http_status = 503,
.message = "Rejecting client for whatever reason"
},
[ICECAST_ERROR_CON_SOURCE_CLIENT_LIMIT] = {
.http_status = 503,
.uuid = "c770182d-c854-422a-a8e5-7142689234a3",
.message = "too many sources connected"},
{.id = ICECAST_ERROR_CON_UNIMPLEMENTED, .http_status = 501,
.message = "too many sources connected"
},
[ICECAST_ERROR_CON_UNIMPLEMENTED] = {
.http_status = 501,
.uuid = "58ce6cb4-72b4-49da-8ad2-feaf775bc61e",
.message = "Unimplemented"},
{.id = ICECAST_ERROR_CON_UNKNOWN_REQUEST, .http_status = 405,
.message = "Unimplemented"
},
[ICECAST_ERROR_CON_UNKNOWN_REQUEST] = {
.http_status = 405,
.uuid = "78f590cc-8812-40d5-a4ef-17344ab75b35",
.message = "unknown request"},
{.id = ICECAST_ERROR_CON_UPGRADE_ERROR, .http_status = 400 /* XXX */,
.message = "unknown request"
},
[ICECAST_ERROR_CON_UPGRADE_ERROR] = {
.http_status = 400 /* XXX */,
.uuid = "ec16f654-f262-415f-ab91-95703ae33704",
.message = "Can not upgrade protocol"},
{.id = ICECAST_ERROR_FSERV_FILE_NOT_FOUND, .http_status = 404,
.message = "Can not upgrade protocol"
},
[ICECAST_ERROR_FSERV_FILE_NOT_FOUND] = {
.http_status = 404,
.uuid = "18c32b43-0d8e-469d-b434-10133cdd06ad",
.message = "The file you requested could not be found"},
{.id = ICECAST_ERROR_FSERV_FILE_NOT_READABLE, .http_status = 404 /* XXX */,
.message = "The file you requested could not be found"
},
[ICECAST_ERROR_FSERV_FILE_NOT_READABLE] = {
.http_status = 404 /* XXX */,
.uuid = "c883d55d-fb41-4f4c-8800-563f5542f51d",
.message = "File not readable"},
{.id = ICECAST_ERROR_FSERV_REQUEST_RANGE_NOT_SATISFIABLE, .http_status = 416,
.message = "File not readable"
},
[ICECAST_ERROR_FSERV_REQUEST_RANGE_NOT_SATISFIABLE] = {
.http_status = 416,
.uuid = "5874cc51-770b-42b5-82d2-737b2b406b30",
.message = "Request Range Not Satisfiable"},
{.id = ICECAST_ERROR_GEN_BUFFER_REALLOC, .http_status = 500,
.message = "Request Range Not Satisfiable"
},
[ICECAST_ERROR_GEN_BUFFER_REALLOC] = {
.http_status = 500,
.uuid = "cda8203e-f237-4090-8d43-544efdd6295c",
.message = "Buffer reallocation failed."},
{.id = ICECAST_ERROR_GEN_CLIENT_LIMIT, .http_status = 503,
.message = "Buffer reallocation failed."
},
[ICECAST_ERROR_GEN_CLIENT_LIMIT] = {
.http_status = 503,
.uuid = "87fd3e61-6702-4473-b506-f616d27a142f",
.message = "Icecast connection limit reached"},
{.id = ICECAST_ERROR_GEN_CLIENT_NEEDS_TO_AUTHENTICATE, .http_status = 401,
.message = "Icecast connection limit reached"
},
[ICECAST_ERROR_GEN_CLIENT_NEEDS_TO_AUTHENTICATE] = {
.http_status = 401,
.uuid = "25387198-0643-4577-9139-7c4f24f59d4a",
.message = "You need to authenticate"},
{.id = ICECAST_ERROR_GEN_HEADER_GEN_FAILED, .http_status = 500,
.message = "You need to authenticate"
},
[ICECAST_ERROR_GEN_HEADER_GEN_FAILED] = {
.http_status = 500,
.uuid = "a8b3c3fe-cb87-45fe-9a9d-ee4c2075d43a",
.message = "Header generation failed."},
{.id = ICECAST_ERROR_GEN_MEMORY_EXHAUSTED, .http_status = 503,
.message = "Header generation failed."
},
[ICECAST_ERROR_GEN_MEMORY_EXHAUSTED] = {
.http_status = 503,
.uuid = "18411e73-713e-4910-b7e4-52a2e324b4e0",
.message = "memory exhausted"},
{.id = ICECAST_ERROR_SOURCE_MOUNT_UNAVAILABLE, .http_status = 404 /* XXX */,
.message = "memory exhausted"
},
[ICECAST_ERROR_SOURCE_MOUNT_UNAVAILABLE] = {
.http_status = 404 /* XXX */,
.uuid = "88d06875-fcf2-4417-84af-05866c97745c",
.message = "Mount unavailable"},
{.id = ICECAST_ERROR_SOURCE_STREAM_PREPARATION_ERROR, .http_status = 500 /* XXX */,
.message = "Mount unavailable"
},
[ICECAST_ERROR_SOURCE_STREAM_PREPARATION_ERROR] = {
.http_status = 500 /* XXX */,
.uuid = "9e50d94d-f03d-4515-8216-577bf8e9f70d",
.message = "Stream preparation error"},
{.id = ICECAST_ERROR_XSLT_PARSE, .http_status = 404 /* XXX */,
.message = "Stream preparation error"
},
[ICECAST_ERROR_XSLT_PARSE] = {
.http_status = 404 /* XXX */,
.uuid = "f86b5b28-c1f8-49f6-a4cd-a18e2a6a44fd",
.message = "Could not parse XSLT file"},
{.id = ICECAST_ERROR_XSLT_problem, .http_status = 500,
.message = "Could not parse XSLT file"
},
[ICECAST_ERROR_XSLT_problem] = {
.http_status = 500,
.uuid = "d3c6e4b3-7d6e-4191-a81b-970273067ae3",
.message = "XSLT problem"},
{.id = ICECAST_ERROR_RECURSIVE_ERROR, .http_status = 500,
.message = "XSLT problem"
},
[ICECAST_ERROR_RECURSIVE_ERROR] = {
.http_status = 500,
.uuid = "13489d5c-eae6-4bf3-889e-ec1fa9a9b9ac",
.message = "Recursive error"}
.message = "Recursive error"
},
};
const icecast_error_t * error_get_by_id(icecast_error_id_t id) {
size_t i;
for (i = 0; i < (sizeof(__errors)/sizeof(*__errors)); i++) {
if (__errors[i].id == id) {
return &(__errors[i]);
}
}
if (id >= ICECAST_ERROR_END_SENTINEL || id < 0)
return NULL;
return &(__errors[id]);
}
const icecast_error_t * error_get_by_uuid(const char *uuid)

View File

@ -10,7 +10,7 @@
#define __ERRORS_H__
typedef enum {
ICECAST_ERROR_ADMIN_DEST_NOT_RUNNING,
ICECAST_ERROR_ADMIN_DEST_NOT_RUNNING = 0,
ICECAST_ERROR_ADMIN_METADAT_BADCALL,
ICECAST_ERROR_ADMIN_METADAT_NO_SUCH_ACTION,
ICECAST_ERROR_ADMIN_MISSING_PARAMETER,
@ -49,11 +49,12 @@ typedef enum {
ICECAST_ERROR_SOURCE_STREAM_PREPARATION_ERROR,
ICECAST_ERROR_XSLT_PARSE,
ICECAST_ERROR_XSLT_problem,
ICECAST_ERROR_RECURSIVE_ERROR
ICECAST_ERROR_RECURSIVE_ERROR,
ICECAST_ERROR_END_SENTINEL /* This element must always be the last! */
} icecast_error_id_t;
struct icecast_error_tag {
const icecast_error_id_t id;
const int http_status;
const char *uuid;
const char *message;