@@ -72,8 +72,13 @@ struct _autoresponder_handle_t {
72
72
int id ;
73
73
};
74
74
75
+ typedef enum {
76
+ REPLY , HANGUP , RESET
77
+ } reply_type_t ;
78
+
75
79
76
80
typedef struct {
81
+ reply_type_t type ;
77
82
mongoc_reply_flags_t flags ;
78
83
bson_t * docs ;
79
84
int n_docs ;
@@ -1218,12 +1223,14 @@ mock_server_receives_kill_cursors (mock_server_t *server, int64_t cursor_id)
1218
1223
void
1219
1224
mock_server_hangs_up (request_t * request )
1220
1225
{
1226
+ reply_t * reply ;
1221
1227
test_suite_mock_server_log ("%5.2f %hu <- %hu \thang up!" ,
1222
1228
mock_server_get_uptime_sec (request -> server ),
1223
1229
request -> client_port ,
1224
1230
request_get_server_port (request ));
1225
-
1226
- mongoc_stream_close (request -> client );
1231
+ reply = bson_malloc0 (sizeof (reply_t ));
1232
+ reply -> type = HANGUP ;
1233
+ q_put (request -> replies , reply );
1227
1234
}
1228
1235
1229
1236
@@ -1245,20 +1252,15 @@ mock_server_hangs_up (request_t *request)
1245
1252
void
1246
1253
mock_server_resets (request_t * request )
1247
1254
{
1248
- struct linger no_linger ;
1249
- no_linger .l_onoff = 1 ;
1250
- no_linger .l_linger = 0 ;
1251
-
1255
+ reply_t * reply ;
1252
1256
test_suite_mock_server_log ("%5.2f %hu <- %hu \treset!" ,
1253
1257
mock_server_get_uptime_sec (request -> server ),
1254
1258
request -> client_port ,
1255
1259
request_get_server_port (request ));
1256
1260
1257
- /* send RST packet to client */
1258
- mongoc_stream_setsockopt (
1259
- request -> client , SOL_SOCKET , SO_LINGER , & no_linger , sizeof no_linger );
1260
-
1261
- mongoc_stream_close (request -> client );
1261
+ reply = bson_malloc0 (sizeof (reply_t ));
1262
+ reply -> type = RESET ;
1263
+ q_put (request -> replies , reply );
1262
1264
}
1263
1265
1264
1266
@@ -1331,7 +1333,6 @@ mock_server_replies_simple (request_t *request, const char *docs_json)
1331
1333
mock_server_replies (request , MONGOC_REPLY_NONE , 0 , 0 , 1 , docs_json );
1332
1334
}
1333
1335
1334
-
1335
1336
/*--------------------------------------------------------------------------
1336
1337
*
1337
1338
* mock_server_replies_ok_and_destroys --
@@ -1801,6 +1802,7 @@ mock_server_reply_multi (request_t *request,
1801
1802
1802
1803
reply = bson_malloc0 (sizeof (reply_t ));
1803
1804
1805
+ reply -> type = REPLY ;
1804
1806
reply -> flags = flags ;
1805
1807
reply -> n_docs = n_docs ;
1806
1808
reply -> docs = bson_malloc0 (n_docs * sizeof (bson_t ));
@@ -1837,12 +1839,26 @@ _mock_server_reply_with_stream (mock_server_t *server,
1837
1839
uint8_t * ptr ;
1838
1840
size_t len ;
1839
1841
bool is_op_msg ;
1840
-
1841
1842
mongoc_reply_flags_t flags = reply -> flags ;
1842
1843
const bson_t * docs = reply -> docs ;
1843
1844
int n_docs = reply -> n_docs ;
1844
1845
int64_t cursor_id = reply -> cursor_id ;
1845
1846
1847
+ if (reply -> type == HANGUP ) {
1848
+ mongoc_stream_close (client );
1849
+ return ;
1850
+ } else if (reply -> type == RESET ) {
1851
+ struct linger no_linger ;
1852
+ no_linger .l_onoff = 1 ;
1853
+ no_linger .l_linger = 0 ;
1854
+
1855
+ /* send RST packet to client */
1856
+ mongoc_stream_setsockopt (client , SOL_SOCKET , SO_LINGER , & no_linger , sizeof no_linger );
1857
+
1858
+ mongoc_stream_close (client );
1859
+ return ;
1860
+ }
1861
+
1846
1862
docs_json = bson_string_new ("" );
1847
1863
for (i = 0 ; i < n_docs ; i ++ ) {
1848
1864
doc_json = bson_as_json (& docs [i ], NULL );
0 commit comments