浏览代码

Pass user_data to the callback

Sergey Lyubka 12 年之前
父节点
当前提交
b597da34da
共有 2 个文件被更改,包括 20 次插入0 次删除
  1. 3 0
      mongoose.c
  2. 17 0
      test/unit_test.c

+ 3 - 0
mongoose.c

@@ -518,6 +518,9 @@ const char **mg_get_valid_option_names(void) {
 }
 
 static void *call_user(struct mg_connection *conn, enum mg_event event) {
+  if (conn != NULL && conn->ctx != NULL) {
+    conn->request_info.user_data = conn->ctx->user_data;
+  }
   return conn == NULL || conn->ctx == NULL || conn->ctx->user_callback == NULL ?
     NULL : conn->ctx->user_callback(event, conn);
 }

+ 17 - 0
test/unit_test.c

@@ -333,6 +333,22 @@ static void test_lua(void) {
 }
 #endif
 
+static void *user_data_tester(enum mg_event event, struct mg_connection *conn) {
+  struct mg_request_info *ri = mg_get_request_info(conn);
+  ASSERT(ri->user_data == (void *) 123);
+  ASSERT(event == MG_NEW_REQUEST);
+  return NULL;
+}
+
+static void test_user_data(void) {
+  static const char *options[] = {"listening_ports", UNUSED_PORT, NULL};
+  struct mg_context *ctx;
+
+  ASSERT((ctx = mg_start(user_data_tester, (void *) 123, options)) != NULL);
+  ASSERT(ctx->user_data == (void *) 123);
+  call_user(fc(ctx), MG_NEW_REQUEST);
+}
+
 int main(void) {
   test_base64_encode();
   test_match_prefix();
@@ -343,6 +359,7 @@ int main(void) {
   test_mg_get_var();
   test_set_throttle();
   test_next_option();
+  test_user_data();
 #ifdef USE_LUA
   test_lua();
 #endif