|
1 | 1 | /* |
2 | | - * Copyright (C) 2022-2024 java-coap contributors (https://github.com/open-coap/java-coap) |
| 2 | + * Copyright (C) 2022-2026 java-coap contributors (https://github.com/open-coap/java-coap) |
3 | 3 | * Copyright (C) 2011-2018 ARM Limited. All rights reserved. |
4 | 4 | * SPDX-License-Identifier: Apache-2.0 |
5 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
|
19 | 19 |
|
20 | 20 | public enum Code { |
21 | 21 | //RFC 7252 |
22 | | - //draft-ietf-core-http-mapping-08 - for HTTP mapping |
| 22 | + //RFC 8075 |
23 | 23 |
|
24 | 24 | C201_CREATED(2, 01, 201), |
25 | 25 | C202_DELETED(2, 02, 200), |
26 | 26 | C203_VALID(2, 03, 200), |
27 | 27 | C204_CHANGED(2, 04, 200), |
28 | | - C205_CONTENT(2, 05, 200), |
| 28 | + C205_CONTENT(2, 05, 200), // No direct CoAP equivalent |
29 | 29 | C400_BAD_REQUEST(4, 00, 400), |
30 | 30 | C401_UNAUTHORIZED(4, 01, 403), |
31 | 31 | C402_BAD_OPTION(4, 02, 400), |
32 | 32 | C403_FORBIDDEN(4, 03, 403), |
33 | 33 | C404_NOT_FOUND(4, 04, 404), |
34 | | - C405_METHOD_NOT_ALLOWED(4, 05, 400), |
| 34 | + C405_METHOD_NOT_ALLOWED(4, 05, 405), |
35 | 35 | C406_NOT_ACCEPTABLE(4, 06, 406), |
| 36 | + C429_TOO_MANY_REQUESTS(4, 29, 429), // RFC 8516 |
36 | 37 | C412_PRECONDITION_FAILED(4, 12, 412), |
37 | 38 | C415_UNSUPPORTED_MEDIA_TYPE(4, 15, 415), |
38 | 39 | C500_INTERNAL_SERVER_ERROR(5, 00, 500), |
@@ -105,4 +106,86 @@ public boolean isSuccess() { |
105 | 106 | return coapCode >>> 5 == 2; |
106 | 107 | } |
107 | 108 |
|
| 109 | + public static Code fromHttp(int httpStatus, Method method) { |
| 110 | + |
| 111 | + switch (httpStatus) { |
| 112 | + // SUCCESS (2.xx) |
| 113 | + case 200: |
| 114 | + switch (method) { |
| 115 | + case PUT: |
| 116 | + case POST: |
| 117 | + case PATCH: |
| 118 | + case iPATCH: |
| 119 | + return C204_CHANGED; |
| 120 | + case DELETE: |
| 121 | + return C202_DELETED; |
| 122 | + default: |
| 123 | + return C205_CONTENT; |
| 124 | + } |
| 125 | + case 201: |
| 126 | + return C201_CREATED; |
| 127 | + case 204: |
| 128 | + if (method == Method.DELETE) { |
| 129 | + return C202_DELETED; |
| 130 | + } |
| 131 | + return C204_CHANGED; |
| 132 | + |
| 133 | + |
| 134 | + // REDIRECT (3.xx) |
| 135 | + case 304: |
| 136 | + return C203_VALID; |
| 137 | + |
| 138 | + // CLIENT ERRORS (4.xx) |
| 139 | + case 400: |
| 140 | + return C400_BAD_REQUEST; |
| 141 | + case 401: |
| 142 | + return C401_UNAUTHORIZED; |
| 143 | + case 403: |
| 144 | + return C403_FORBIDDEN; |
| 145 | + case 404: |
| 146 | + return C404_NOT_FOUND; |
| 147 | + case 405: |
| 148 | + return C405_METHOD_NOT_ALLOWED; |
| 149 | + case 406: |
| 150 | + return C406_NOT_ACCEPTABLE; |
| 151 | + case 408: |
| 152 | + return C408_REQUEST_ENTITY_INCOMPLETE; // Closest semantic match |
| 153 | + case 409: |
| 154 | + return C409_CONFLICT; |
| 155 | + case 412: |
| 156 | + return C412_PRECONDITION_FAILED; |
| 157 | + case 413: |
| 158 | + return C413_REQUEST_ENTITY_TOO_LARGE; |
| 159 | + case 415: |
| 160 | + return C415_UNSUPPORTED_MEDIA_TYPE; |
| 161 | + case 429: |
| 162 | + return C429_TOO_MANY_REQUESTS; |
| 163 | + |
| 164 | + // SERVER ERRORS (5.xx) |
| 165 | + case 500: |
| 166 | + return C500_INTERNAL_SERVER_ERROR; |
| 167 | + case 501: |
| 168 | + return C501_NOT_IMPLEMENTED; |
| 169 | + case 502: |
| 170 | + return C502_BAD_GATEWAY; |
| 171 | + case 503: |
| 172 | + return C503_SERVICE_UNAVAILABLE; |
| 173 | + case 504: |
| 174 | + return C504_GATEWAY_TIMEOUT; |
| 175 | + |
| 176 | + default: |
| 177 | + return mapUnhandledHttpStatusToDefault(httpStatus); |
| 178 | + } |
| 179 | + } |
| 180 | + |
| 181 | + private static Code mapUnhandledHttpStatusToDefault(int httpStatus) { |
| 182 | + if (httpStatus <= 299) { |
| 183 | + return C205_CONTENT; |
| 184 | + } else if (httpStatus <= 399) { |
| 185 | + return C502_BAD_GATEWAY; |
| 186 | + } else if (httpStatus <= 499) { |
| 187 | + return C400_BAD_REQUEST; |
| 188 | + } |
| 189 | + return C500_INTERNAL_SERVER_ERROR; |
| 190 | + } |
108 | 191 | } |
0 commit comments