diff --git a/site/index.html b/site/index.html
index 790dd0b..fb1fb88 100644
--- a/site/index.html
+++ b/site/index.html
@@ -519,7 +519,7 @@ Design the server architecture
Route requests
Handle requests
Data abstraction layer
-Error generation
+Error generation
@@ -533,9 +533,9 @@ specification.
Client-Server API
-- Error responses
+Error responses
/_matrix/client/versions
-- CORS Headers
+CORS Headers
- Well-known URIs
- Client Authentication
- Capabilities negotiation
diff --git a/src/Matrix.c b/src/Matrix.c
index 241d7b7..e841309 100644
--- a/src/Matrix.c
+++ b/src/Matrix.c
@@ -25,6 +25,8 @@
#include
#include
+#include
+#include
void
MatrixHttpHandler(HttpServerContext * context, void *argp)
@@ -86,3 +88,158 @@ finish:
LogConfigUnindent(lc);
}
+
+HashMap *
+MatrixCreateError(MatrixError errorArg)
+{
+ HashMap *errorObj;
+ char *errcode;
+ char *error;
+
+ switch (errorArg)
+ {
+ case M_FORBIDDEN:
+ errcode = "M_FORBIDDEN";
+ error = "Forbidden access. Bad permissions or not authenticated.";
+ break;
+ case M_UNKNOWN_TOKEN:
+ errcode = "M_UNKNOWN_TOKEN";
+ error = "The access or refresh token specified was not recognized.";
+ break;
+ case M_MISSING_TOKEN:
+ errcode = "M_MISSING_TOKEN";
+ error = "No access token was specified for the request.";
+ break;
+ case M_BAD_JSON:
+ errcode = "M_BAD_JSON";
+ error = "Request contained valid JSON, but it was malformed in some way.";
+ break;
+ case M_NOT_JSON:
+ errcode = "M_NOT_JSON";
+ error = "Request did not contain valid JSON.";
+ break;
+ case M_NOT_FOUND:
+ errcode = "M_NOT_FOUND";
+ error = "No resource was found for this request.";
+ break;
+ case M_LIMIT_EXCEEDED:
+ errcode = "M_LIMIT_EXCEEDED";
+ error = "Too many requests have been sent in a short period of time. "
+ "Wait a while then try again.";
+ break;
+ case M_UNKNOWN:
+ errcode = "M_UNKNOWN";
+ error = "An unknown error has occurred.";
+ break;
+
+ case M_UNRECOGNIZED:
+ errcode = "M_UNRECOGNIZED";
+ error = "The server did not understand the request.";
+ break;
+ case M_UNAUTHORIZED:
+ errcode = "M_UNAUTHORIZED";
+ error = "The request was not correctly authorized.";
+ break;
+ case M_USER_DEACTIVATED:
+ errcode = "M_USER_DEACTIVATED";
+ error = "The user ID assocated with the request has been deactivated.";
+ break;
+ case M_USER_IN_USE:
+ errcode = "M_USER_IN_USE";
+ error = "The user ID specified has already been taken.";
+ break;
+ case M_INVALID_USERNAME:
+ errcode = "M_INVALID_USERNAME";
+ error = "The user ID specified is not valid.";
+ break;
+ case M_ROOM_IN_USE:
+ errcode = "M_ROOM_IN_USE";
+ error = "The room alias given is already in use.";
+ break;
+ case M_INVALID_ROOM_STATE:
+ errcode = "M_INVALID_ROOM_STATE";
+ error = "The initial room state is invalid.";
+ break;
+ case M_THREEPID_IN_USE:
+ errcode = "M_THREEPID_IN_USE";
+ error = "The given threepid cannot be used because the same threepid is already in use.";
+ break;
+ case M_THREEPID_NOT_FOUND:
+ errcode = "M_THREEPID_NOT_FOUND";
+ error = "The given threepid cannot be used because no record matching the threepid "
+ "was found.";
+ break;
+ case M_THREEPID_AUTH_FAILED:
+ errcode = "M_THREEPID_AUTH_FAILED";
+ error = "Authentication could not be performed on the third party identifier.";
+ break;
+ case M_THREEPID_DENIED:
+ errcode = "M_THREEPID_DENIED";
+ error = "The server does not permit this third party identifier.";
+ break;
+ case M_SERVER_NOT_TRUSTED:
+ errcode = "M_SERVER_NOT_TRUSTED";
+ error = "The request used a third party server that this server does not trust.";
+ break;
+ case M_UNSUPPORTED_ROOM_VERSION:
+ errcode = "M_UNSUPPORTED_ROOM_VERSION";
+ error = "The request to create a room used a room version that the server "
+ "does not support.";
+ break;
+ case M_INCOMPATIBLE_ROOM_VERSION:
+ errcode = "M_INCOMPATIBLE_ROOM_VERSION";
+ error = "Attempted to join a room that has a version the server does not support.";
+ break;
+ case M_BAD_STATE:
+ errcode = "M_BAD_STATE";
+ error = "The state change requested cannot be performed.";
+ break;
+ case M_GUEST_ACCESS_FORBIDDEN:
+ errcode = "M_GUEST_ACCESS_FORBIDDEN";
+ error = "The room or resource does not permit guests to access it.";
+ break;
+ case M_CAPTCHA_NEEDED:
+ errcode = "M_CAPTCHA_NEEDED";
+ error = "A Captcha is required to complete the request.";
+ break;
+ case M_CAPTCHA_INVALID:
+ errcode = "M_CAPTCHA_INVALID";
+ error = "The Captcha provided did not match what was expected.";
+ break;
+ case M_MISSING_PARAM:
+ errcode = "M_MISSING_PARAM";
+ error = "A required parameter was missing from the request.";
+ break;
+ case M_TOO_LARGE:
+ errcode = "M_TOO_LARGE";
+ error = "The request or entity was too large.";
+ break;
+ case M_EXCLUSIVE:
+ errcode = "M_EXCLUSIVE";
+ error = "The resource being requested is reserved by an application service, "
+ "or the application service making the request has not created the resource.";
+ break;
+ case M_RESOURCE_LIMIT_EXCEEDED:
+ errcode = "M_RESOURCE_LIMIT_EXCEEDED";
+ error = "The request cannot be completed because the homeserver has reached "
+ "a resource limit imposed on it.";
+ break;
+ case M_CANNOT_LEAVE_SERVER_NOTICE_ROOM:
+ errcode = "M_CANNOT_LEAVE_SERVER_NOTICE_ROOM";
+ error = "The user is unable to reject an invite to join the server notices room.";
+ break;
+ default:
+ return NULL;
+ }
+
+ errorObj = HashMapCreate();
+ if (!errorObj)
+ {
+ return NULL;
+ }
+
+ HashMapSet(errorObj, "errcode", JsonValueString(UtilStringDuplicate(errcode)));
+ HashMapSet(errorObj, "error", JsonValueString(UtilStringDuplicate(error)));
+
+ return errorObj;
+}
diff --git a/src/include/Matrix.h b/src/include/Matrix.h
index f7a029a..c257b7d 100644
--- a/src/include/Matrix.h
+++ b/src/include/Matrix.h
@@ -26,6 +26,48 @@
#include
#include
+#include
+
+typedef enum MatrixError
+{
+ M_FORBIDDEN,
+ M_UNKNOWN_TOKEN,
+ M_MISSING_TOKEN,
+ M_BAD_JSON,
+ M_NOT_JSON,
+ M_NOT_FOUND,
+ M_LIMIT_EXCEEDED,
+ M_UNKNOWN,
+
+ M_UNRECOGNIZED,
+ M_UNAUTHORIZED,
+ M_USER_DEACTIVATED,
+ M_USER_IN_USE,
+ M_INVALID_USERNAME,
+ M_ROOM_IN_USE,
+ M_INVALID_ROOM_STATE,
+
+ M_THREEPID_IN_USE,
+ M_THREEPID_NOT_FOUND,
+ M_THREEPID_AUTH_FAILED,
+ M_THREEPID_DENIED,
+
+ M_SERVER_NOT_TRUSTED,
+ M_UNSUPPORTED_ROOM_VERSION,
+ M_INCOMPATIBLE_ROOM_VERSION,
+ M_BAD_STATE,
+ M_GUEST_ACCESS_FORBIDDEN,
+ M_CAPTCHA_NEEDED,
+ M_CAPTCHA_INVALID,
+
+ M_MISSING_PARAM,
+ M_INVALID_PARAM,
+
+ M_TOO_LARGE,
+ M_EXCLUSIVE,
+ M_RESOURCE_LIMIT_EXCEEDED,
+ M_CANNOT_LEAVE_SERVER_NOTICE_ROOM
+} MatrixError;
typedef struct MatrixHttpHandlerArgs
{
@@ -35,4 +77,7 @@ typedef struct MatrixHttpHandlerArgs
extern void
MatrixHttpHandler(HttpServerContext *, void *);
+extern HashMap *
+ MatrixCreateError(MatrixError);
+
#endif