| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #include "stream.h" |
| 4 | |
| 5 | static struct { |
| 6 | STREAM_HANDSHAKE err; |
| 7 | const char *str; |
| 8 | int response_code; |
| 9 | } handshake_errors[] = { |
| 10 | {STREAM_HANDSHAKE_OK_V3, "CONNECTED", 200}, |
| 11 | {STREAM_HANDSHAKE_OK_V2, "CONNECTED", 200}, |
| 12 | {STREAM_HANDSHAKE_OK_V1, "CONNECTED", 200}, |
| 13 | {STREAM_HANDSHAKE_NEVER, "NEVER CONNECTED", 204}, // No Content |
| 14 | {STREAM_HANDSHAKE_CONNECT_HANDSHAKE_FAILED, "BAD HANDSHAKE", 400}, // Bad Request |
| 15 | {STREAM_HANDSHAKE_PARENT_IS_LOCALHOST, "LOCALHOST", 101}, // Switching Protocols |
| 16 | {STREAM_HANDSHAKE_PARENT_NODE_ALREADY_CONNECTED, "ALREADY CONNECTED", 409}, // Conflict |
| 17 | {STREAM_HANDSHAKE_PARENT_DENIED_ACCESS, "DENIED", 403}, // Forbidden |
| 18 | {STREAM_HANDSHAKE_CONNECT_SEND_TIMEOUT, "SEND TIMEOUT", 408}, // Request Timeout |
| 19 | {STREAM_HANDSHAKE_CONNECT_RECEIVE_TIMEOUT, "RECEIVE TIMEOUT", 504}, // Gateway Timeout |
| 20 | {STREAM_HANDSHAKE_CONNECT_INVALID_CERTIFICATE, "INVALID CERTIFICATE", 495}, // Custom: SSL Certificate Error |
| 21 | {STREAM_HANDSHAKE_CONNECT_SSL_ERROR, "SSL ERROR", 525}, // SSL Handshake Failure |
| 22 | {STREAM_HANDSHAKE_CONNECTION_FAILED, "CANT CONNECT", 502}, // Bad Gateway |
| 23 | {STREAM_HANDSHAKE_PARENT_BUSY_TRY_LATER, "BUSY TRY LATER", 503}, // Service Unavailable |
| 24 | {STREAM_HANDSHAKE_PARENT_INTERNAL_ERROR, "INTERNAL ERROR", 500}, // Internal Server Error |
| 25 | {STREAM_HANDSHAKE_PARENT_IS_INITIALIZING, "REMOTE IS INITIALIZING", 102}, // Processing (WebDAV) |
| 26 | |
| 27 | // receiver-only codes |
| 28 | {STREAM_HANDSHAKE_RCV_DISCONNECT_PARSER_FAILED, "DISCONNECTED PARSE ERROR", 400}, // Bad Request |
| 29 | {STREAM_HANDSHAKE_RCV_DISCONNECT_STALE_RECEIVER, "DISCONNECTED STALE RECEIVER", 410}, // Gone |
| 30 | {STREAM_HANDSHAKE_RCV_DECOMPRESSION_FAILED, "DISCONNECTED DECOMPRESSION FAILED", 415}, // Unsupported Media Type |
| 31 | |
| 32 | // sender-only codes |
| 33 | {STREAM_HANDSHAKE_SND_DISCONNECT_HOST_CLEANUP, "DISCONNECTED HOST CLEANUP", 202}, // Accepted |
| 34 | {STREAM_HANDSHAKE_SND_DISCONNECT_COMPRESSION_FAILED, "DISCONNECTED SND COMPRESSION FAILED", 415}, // Unsupported Media Type |
| 35 | {STREAM_HANDSHAKE_SND_DISCONNECT_HTTP_UPGRADE_FAILED, "HTTP UPGRADE ERROR", 426}, // Upgrade Required |
| 36 | {STREAM_HANDSHAKE_SND_DISCONNECT_RECEIVER_LEFT, "RECEIVER LEFT", 498}, |
| 37 | {STREAM_HANDSHAKE_SND_VNODE_IS_STALE, "VNODE STALE", 498}, |
| 38 | |
| 39 | // receiver and sender codes |
| 40 | {STREAM_HANDSHAKE_DISCONNECT_SIGNALED_TO_STOP, "DISCONNECTED SIGNALED TO STOP", 499}, // Client Closed Request |
| 41 | {STREAM_HANDSHAKE_DISCONNECT_SHUTDOWN, "DISCONNECTED SHUTDOWN REQUESTED", 503}, // Service Unavailable |
| 42 | {STREAM_HANDSHAKE_DISCONNECT_SOCKET_READ_FAILED, "DISCONNECTED SOCKET READ FAILED", 502}, // Bad Gateway |
| 43 | {STREAM_HANDSHAKE_DISCONNECT_SOCKET_WRITE_FAILED, "DISCONNECTED SOCKET WRITE FAILED", 502}, // Bad Gateway |
| 44 | {STREAM_HANDSHAKE_DISCONNECT_SOCKET_ERROR, "DISCONNECT SOCKET ERROR", 500}, // Internal Server Error |
| 45 | {STREAM_HANDSHAKE_DISCONNECT_TIMEOUT, "DISCONNECTED TIMEOUT", 504}, // Gateway Timeout |
| 46 | {STREAM_HANDSHAKE_DISCONNECT_SOCKET_CLOSED_BY_REMOTE, "DISCONNECTED SOCKET CLOSED BY REMOTE END", 499}, // Client Closed Request |
| 47 | {STREAM_HANDSHAKE_DISCONNECT_BUFFER_OVERFLOW, "DISCONNECTED NOT SUFFICIENT SEND BUFFER", 413}, // Payload Too Large |
| 48 | {STREAM_HANDSHAKE_DISCONNECT_REPLICATION_STALLED, "REPLICATION STALLED", 507}, // Insufficient Storage |
| 49 | |
| 50 | // sender (stream parents - SP) failures to connect |
| 51 | {STREAM_HANDSHAKE_SP_PREPARING, "PREPARING", 102}, // Processing (WebDAV) |
| 52 | {STREAM_HANDSHAKE_SP_NO_HOST_IN_DESTINATION, "NO HOST IN DESTINATION - CONFIG ERROR", 404}, // Not Found |
| 53 | {STREAM_HANDSHAKE_SP_CONNECT_TIMEOUT, "CONNECT TIMEOUT", 408}, // Request Timeout |
| 54 | {STREAM_HANDSHAKE_SP_CONNECTION_REFUSED, "CONNECTION REFUSED", 403}, // Forbidden |
| 55 | {STREAM_HANDSHAKE_SP_CANT_RESOLVE_HOSTNAME, "CANT RESOLVE HOSTNAME", 400}, // Bad Request |
| 56 | {STREAM_HANDSHAKE_SP_CONNECTING, "CONNECTING", 102}, // Processing (WebDAV) |
| 57 | {STREAM_HANDSHAKE_SP_CONNECTED, "SOCKET CONNECTED", 200}, // OK |
| 58 | {STREAM_HANDSHAKE_SP_NO_STREAM_INFO, "NO STREAM INFO", 404}, // Not Found |
| 59 | {STREAM_HANDSHAKE_SP_NO_DESTINATION, "NO PARENT TO SEND TO", 502}, // Bad Gateway |
| 60 | {STREAM_HANDSHAKE_PARENT_VNODE_IS_LOCAL, "LOCAL VNODE", 101}, |
| 61 | |
| 62 | { 0, NULL, 0 }, |
| 63 | }; |
| 64 | |
| 65 | const char *stream_handshake_error_to_string(STREAM_HANDSHAKE reason) { |
| 66 | if(reason >= STREAM_HANDSHAKE_OK_V1) |
| 67 | // handshake_error is the whole version / capabilities number |
| 68 | return "CONNECTED"; |
| 69 | |
| 70 | for(size_t i = 0; handshake_errors[i].str ; i++) { |
| 71 | if(reason == handshake_errors[i].err) |
| 72 | return handshake_errors[i].str; |
| 73 | } |
| 74 | |
| 75 | return "UNKNOWN"; |
| 76 | } |
| 77 | |
| 78 | int stream_handshake_error_to_response_code(STREAM_HANDSHAKE reason) { |
| 79 | if(reason >= STREAM_HANDSHAKE_OK_V1) |
| 80 | // handshake_error is the whole version / capabilities number |
| 81 | return 200; |
| 82 | |
| 83 | for(size_t i = 0; handshake_errors[i].str ; i++) { |
| 84 | if(reason == handshake_errors[i].err) |
| 85 | return handshake_errors[i].response_code; |
| 86 | } |
| 87 | |
| 88 | return 404; |
| 89 | } |