static PyObject * cbson_as_json (PyObject *self, PyObject *args) { const bson_uint8_t *buffer; bson_uint32_t buffer_length; bson_reader_t reader; const bson_t *b; PyObject *ret = NULL; size_t len = 0; char *str; if (!PyArg_ParseTuple(args, "s#", &buffer, &buffer_length)) { return NULL; } bson_reader_init_from_data(&reader, buffer, buffer_length); b = bson_reader_read(&reader, NULL); bson_reader_destroy(&reader); if (b) { str = bson_as_json(b, &len); ret = PyUnicode_DecodeUTF8(str, len, "strict"); bson_free(str); } else { PyErr_SetString(PyExc_ValueError, "Failed to parse BSON document."); } return ret; }
static PyObject * cbson_loads (PyObject *self, PyObject *args) { const bson_uint8_t *buffer; bson_uint32_t buffer_length; bson_reader_t reader; bson_iter_t iter; const bson_t *b; bson_bool_t eof = FALSE; PyObject *ret = NULL; PyObject *dict; if (!PyArg_ParseTuple(args, "s#", &buffer, &buffer_length)) { return NULL; } ret = PyList_New(0); bson_reader_init_from_data(&reader, buffer, buffer_length); if (!(b = bson_reader_read(&reader, &eof))) { PyErr_SetString(PyExc_ValueError, "Failed to parse buffer."); goto failure; } do { if (!bson_iter_init(&iter, b)) { bson_reader_destroy(&reader); goto failure; } dict = PyDict_New(); bson_iter_visit_all(&iter, &gLoadsVisitors, &dict); if (dict) { PyList_Append(ret, dict); Py_DECREF(dict); } } while ((b = bson_reader_read(&reader, &eof))); bson_reader_destroy(&reader); if (!eof) { PyErr_SetString(PyExc_ValueError, "Buffer contained invalid BSON."); goto failure; } return ret; failure: Py_XDECREF(ret); return NULL; }
static void test_reader_from_data_overflow (void) { bson_reader_t reader; bson_uint8_t *buffer; const bson_t *b; bson_uint32_t i; bson_bool_t eof = FALSE; buffer = bson_malloc0(4096); for (i = 0; i < 4095; i += 5) { buffer[i] = 5; } buffer[4095] = 5; bson_reader_init_from_data(&reader, buffer, 4096); for (i = 0; (b = bson_reader_read(&reader, &eof)); i++) { const bson_uint8_t *buf = bson_get_data(b); assert(b->len == 5); assert(buf[0] == 5); assert(buf[1] == 0); assert(buf[2] == 0); assert(buf[3] == 0); assert(buf[4] == 0); eof = FALSE; } assert(i == (4095/5)); assert_cmpint(eof, ==, FALSE); bson_free(buffer); bson_reader_destroy(&reader); }