Commit 43a2a70a authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

Add nghttp2_error_callback2

nghttp2_error_callback2 is an extended version of the existing
nghttp2_error_callback by adding error code parameter.  This
deprecates nghttp2_error_callback.
parent 73344ae9
...@@ -81,6 +81,7 @@ APIDOCS= \ ...@@ -81,6 +81,7 @@ APIDOCS= \
nghttp2_session_callbacks_set_before_frame_send_callback.rst \ nghttp2_session_callbacks_set_before_frame_send_callback.rst \
nghttp2_session_callbacks_set_data_source_read_length_callback.rst \ nghttp2_session_callbacks_set_data_source_read_length_callback.rst \
nghttp2_session_callbacks_set_error_callback.rst \ nghttp2_session_callbacks_set_error_callback.rst \
nghttp2_session_callbacks_set_error_callback2.rst \
nghttp2_session_callbacks_set_on_begin_frame_callback.rst \ nghttp2_session_callbacks_set_on_begin_frame_callback.rst \
nghttp2_session_callbacks_set_on_begin_headers_callback.rst \ nghttp2_session_callbacks_set_on_begin_headers_callback.rst \
nghttp2_session_callbacks_set_on_data_chunk_recv_callback.rst \ nghttp2_session_callbacks_set_on_data_chunk_recv_callback.rst \
......
...@@ -387,6 +387,11 @@ typedef enum { ...@@ -387,6 +387,11 @@ typedef enum {
* Indicates that a processing was canceled. * Indicates that a processing was canceled.
*/ */
NGHTTP2_ERR_CANCEL = -535, NGHTTP2_ERR_CANCEL = -535,
/**
* When a local endpoint expects to receive SETTINGS frame, it
* receives an other type of frame.
*/
NGHTTP2_ERR_SETTINGS_EXPECTED = -536,
/** /**
* The errors < :enum:`NGHTTP2_ERR_FATAL` mean that the library is * The errors < :enum:`NGHTTP2_ERR_FATAL` mean that the library is
* under unexpected condition and processing was terminated (e.g., * under unexpected condition and processing was terminated (e.g.,
...@@ -1987,6 +1992,9 @@ typedef ssize_t (*nghttp2_pack_extension_callback)(nghttp2_session *session, ...@@ -1987,6 +1992,9 @@ typedef ssize_t (*nghttp2_pack_extension_callback)(nghttp2_session *session,
* of length |len|. |len| does not include the sentinel NULL * of length |len|. |len| does not include the sentinel NULL
* character. * character.
* *
* This function is deprecated. The new application should use
* :type:`nghttp2_error_callback2`.
*
* The format of error message may change between nghttp2 library * The format of error message may change between nghttp2 library
* versions. The application should not depend on the particular * versions. The application should not depend on the particular
* format. * format.
...@@ -2003,6 +2011,33 @@ typedef ssize_t (*nghttp2_pack_extension_callback)(nghttp2_session *session, ...@@ -2003,6 +2011,33 @@ typedef ssize_t (*nghttp2_pack_extension_callback)(nghttp2_session *session,
typedef int (*nghttp2_error_callback)(nghttp2_session *session, const char *msg, typedef int (*nghttp2_error_callback)(nghttp2_session *session, const char *msg,
size_t len, void *user_data); size_t len, void *user_data);
/**
* @functypedef
*
* Callback function invoked when library provides the error code, and
* message. This callback is solely for debugging purpose.
* |lib_error_code| is one of error code defined in
* :enum:`nghttp2_error`. The |msg| is typically NULL-terminated
* string of length |len|, and intended for human consumption. |len|
* does not include the sentinel NULL character.
*
* The format of error message may change between nghttp2 library
* versions. The application should not depend on the particular
* format.
*
* Normally, application should return 0 from this callback. If fatal
* error occurred while doing something in this callback, application
* should return :enum:`NGHTTP2_ERR_CALLBACK_FAILURE`. In this case,
* library will return immediately with return value
* :enum:`NGHTTP2_ERR_CALLBACK_FAILURE`. Currently, if nonzero value
* is returned from this callback, they are treated as
* :enum:`NGHTTP2_ERR_CALLBACK_FAILURE`, but application should not
* rely on this details.
*/
typedef int (*nghttp2_error_callback2)(nghttp2_session *session,
int lib_error_code, const char *msg,
size_t len, void *user_data);
struct nghttp2_session_callbacks; struct nghttp2_session_callbacks;
/** /**
...@@ -2267,10 +2302,30 @@ nghttp2_session_callbacks_set_on_extension_chunk_recv_callback( ...@@ -2267,10 +2302,30 @@ nghttp2_session_callbacks_set_on_extension_chunk_recv_callback(
* *
* Sets callback function invoked when library tells error message to * Sets callback function invoked when library tells error message to
* the application. * the application.
*
* This function is deprecated. The new application should use
* `nghttp2_session_callbacks_set_error_callback2()`.
*
* If both :type:`nghttp2_error_callback` and
* :type:`nghttp2_error_callback2` are set, the latter takes
* precedence.
*/ */
NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback( NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback(
nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback); nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback);
/**
* @function
*
* Sets callback function invoked when library tells error code, and
* message to the application.
*
* If both :type:`nghttp2_error_callback` and
* :type:`nghttp2_error_callback2` are set, the latter takes
* precedence.
*/
NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback2(
nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2);
/** /**
* @functypedef * @functypedef
* *
......
...@@ -168,3 +168,8 @@ void nghttp2_session_callbacks_set_error_callback( ...@@ -168,3 +168,8 @@ void nghttp2_session_callbacks_set_error_callback(
nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback) { nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback) {
cbs->error_callback = error_callback; cbs->error_callback = error_callback;
} }
void nghttp2_session_callbacks_set_error_callback2(
nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2) {
cbs->error_callback2 = error_callback2;
}
...@@ -119,6 +119,7 @@ struct nghttp2_session_callbacks { ...@@ -119,6 +119,7 @@ struct nghttp2_session_callbacks {
nghttp2_unpack_extension_callback unpack_extension_callback; nghttp2_unpack_extension_callback unpack_extension_callback;
nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback; nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback;
nghttp2_error_callback error_callback; nghttp2_error_callback error_callback;
nghttp2_error_callback2 error_callback2;
}; };
#endif /* NGHTTP2_CALLBACKS_H */ #endif /* NGHTTP2_CALLBACKS_H */
...@@ -322,6 +322,9 @@ const char *nghttp2_strerror(int error_code) { ...@@ -322,6 +322,9 @@ const char *nghttp2_strerror(int error_code) {
return "Internal error"; return "Internal error";
case NGHTTP2_ERR_CANCEL: case NGHTTP2_ERR_CANCEL:
return "Cancel"; return "Cancel";
case NGHTTP2_ERR_SETTINGS_EXPECTED:
return "When a local endpoint expects to receive SETTINGS frame, it "
"receives an other type of frame";
case NGHTTP2_ERR_NOMEM: case NGHTTP2_ERR_NOMEM:
return "Out of memory"; return "Out of memory";
case NGHTTP2_ERR_CALLBACK_FAILURE: case NGHTTP2_ERR_CALLBACK_FAILURE:
......
...@@ -148,14 +148,16 @@ static int check_ext_type_set(const uint8_t *ext_types, uint8_t type) { ...@@ -148,14 +148,16 @@ static int check_ext_type_set(const uint8_t *ext_types, uint8_t type) {
} }
static int session_call_error_callback(nghttp2_session *session, static int session_call_error_callback(nghttp2_session *session,
const char *fmt, ...) { int lib_error_code, const char *fmt,
...) {
size_t bufsize; size_t bufsize;
va_list ap; va_list ap;
char *buf; char *buf;
int rv; int rv;
nghttp2_mem *mem; nghttp2_mem *mem;
if (!session->callbacks.error_callback) { if (!session->callbacks.error_callback &&
!session->callbacks.error_callback2) {
return 0; return 0;
} }
...@@ -189,8 +191,13 @@ static int session_call_error_callback(nghttp2_session *session, ...@@ -189,8 +191,13 @@ static int session_call_error_callback(nghttp2_session *session,
return 0; return 0;
} }
if (session->callbacks.error_callback2) {
rv = session->callbacks.error_callback2(session, lib_error_code, buf,
(size_t)rv, session->user_data);
} else {
rv = session->callbacks.error_callback(session, buf, (size_t)rv, rv = session->callbacks.error_callback(session, buf, (size_t)rv,
session->user_data); session->user_data);
}
nghttp2_mem_free(mem, buf); nghttp2_mem_free(mem, buf);
...@@ -3608,7 +3615,7 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame, ...@@ -3608,7 +3615,7 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame,
nv.name->base, (int)nv.value->len, nv.value->base); nv.name->base, (int)nv.value->len, nv.value->base);
rv2 = session_call_error_callback( rv2 = session_call_error_callback(
session, session, NGHTTP2_ERR_HTTP_HEADER,
"Ignoring received invalid HTTP header field: frame type: " "Ignoring received invalid HTTP header field: frame type: "
"%u, stream: %d, name: [%.*s], value: [%.*s]", "%u, stream: %d, name: [%.*s], value: [%.*s]",
frame->hd.type, frame->hd.stream_id, (int)nv.name->len, frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
...@@ -3626,7 +3633,8 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame, ...@@ -3626,7 +3633,8 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame,
nv.name->base, (int)nv.value->len, nv.value->base); nv.name->base, (int)nv.value->len, nv.value->base);
rv = session_call_error_callback( rv = session_call_error_callback(
session, "Invalid HTTP header field was received: frame type: " session, NGHTTP2_ERR_HTTP_HEADER,
"Invalid HTTP header field was received: frame type: "
"%u, stream: %d, name: [%.*s], value: [%.*s]", "%u, stream: %d, name: [%.*s], value: [%.*s]",
frame->hd.type, frame->hd.stream_id, (int)nv.name->len, frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
nv.name->base, (int)nv.value->len, nv.value->base); nv.name->base, (int)nv.value->len, nv.value->base);
...@@ -5345,7 +5353,8 @@ ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in, ...@@ -5345,7 +5353,8 @@ ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
iframe->state = NGHTTP2_IB_IGN_ALL; iframe->state = NGHTTP2_IB_IGN_ALL;
rv = session_call_error_callback( rv = session_call_error_callback(
session, "Remote peer returned unexpected data while we expected " session, NGHTTP2_ERR_SETTINGS_EXPECTED,
"Remote peer returned unexpected data while we expected "
"SETTINGS frame. Perhaps, peer does not support HTTP/2 " "SETTINGS frame. Perhaps, peer does not support HTTP/2 "
"properly."); "properly.");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment