@@ -20,99 +20,125 @@ lxb_status_t find_callback(lxb_dom_node_t *node, lxb_css_selector_specificity_t
20
20
{
21
21
UNUSED_PARAMETER (spec);
22
22
std::string str;
23
- (void )lxb_html_serialize_deep_cb (node, serializer_callback, &str);
24
- ((std::vector<std::string> *)data)->push_back (str);
25
- return LXB_STATUS_OK;
23
+ lxb_status_t status = lxb_html_serialize_deep_cb (node, serializer_callback, &str);
24
+ if (status == LXB_STATUS_OK) {
25
+ ((std::vector<std::string> *)data)->push_back (str);
26
+ }
27
+ return status;
26
28
}
27
29
28
30
lxb_status_t find_with_selectors (const std::string &slctrs, lxb_html_document_t *document,
29
31
std::vector<std::string> &found)
30
32
{
31
- /* Create CSS parser. */
32
- lxb_css_parser_t *parser;
33
- lxb_css_selector_list_t *list;
34
- lxb_status_t status;
35
- lxb_dom_node_t *body;
36
- lxb_selectors_t *selectors;
37
-
38
- parser = lxb_css_parser_create ();
39
- status = lxb_css_parser_init (parser, NULL );
40
- if (status != LXB_STATUS_OK) {
41
- obs_log (LOG_ERROR, " Failed to setup CSS parser" );
42
- return EXIT_FAILURE;
43
- }
33
+ lxb_css_parser_t *parser = nullptr ;
34
+ lxb_css_selector_list_t *list = nullptr ;
35
+ lxb_selectors_t *selectors = nullptr ;
36
+ lxb_status_t status = LXB_STATUS_ERROR;
37
+
38
+ do {
39
+ parser = lxb_css_parser_create ();
40
+ if (!parser) {
41
+ obs_log (LOG_ERROR, " Failed to create CSS parser" );
42
+ break ;
43
+ }
44
44
45
- /* Selectors. */
46
- selectors = lxb_selectors_create ();
47
- status = lxb_selectors_init (selectors);
48
- if (status != LXB_STATUS_OK) {
49
- obs_log (LOG_ERROR, " Failed to setup Selectors" );
50
- return EXIT_FAILURE;
51
- }
45
+ status = lxb_css_parser_init (parser, nullptr );
46
+ if (status != LXB_STATUS_OK) {
47
+ obs_log (LOG_ERROR, " Failed to init CSS parser" );
48
+ break ;
49
+ }
52
50
53
- /* Parse and get the log. */
51
+ selectors = lxb_selectors_create ();
52
+ if (!selectors) {
53
+ obs_log (LOG_ERROR, " Failed to create selectors" );
54
+ break ;
55
+ }
54
56
55
- list = lxb_css_selectors_parse (parser, ( const lxb_char_t *)slctrs. c_str (), slctrs. length () );
56
- if (parser-> status != LXB_STATUS_OK) {
57
- obs_log (LOG_ERROR, " Failed to parse CSS selectors" );
58
- return EXIT_FAILURE ;
59
- }
57
+ status = lxb_selectors_init (selectors );
58
+ if (status != LXB_STATUS_OK) {
59
+ obs_log (LOG_ERROR, " Failed to init selectors" );
60
+ break ;
61
+ }
60
62
61
- /* Find HTML nodes by CSS Selectors. */
62
- body = lxb_dom_interface_node (lxb_html_document_body_element (document));
63
+ list = lxb_css_selectors_parse (parser, (const lxb_char_t *)slctrs.c_str (),
64
+ slctrs.length ());
65
+ if (!list || parser->status != LXB_STATUS_OK) {
66
+ obs_log (LOG_ERROR, " Failed to parse CSS selectors" );
67
+ break ;
68
+ }
63
69
64
- status = lxb_selectors_find (selectors, body, list, find_callback, &found);
65
- if (status != LXB_STATUS_OK) {
66
- obs_log (LOG_ERROR, " Failed to find HTML nodes by CSS Selectors" );
67
- return EXIT_FAILURE;
68
- }
70
+ lxb_dom_node_t *body =
71
+ lxb_dom_interface_node (lxb_html_document_body_element (document));
72
+ if (!body) {
73
+ obs_log (LOG_ERROR, " Failed to get document body" );
74
+ break ;
75
+ }
69
76
70
- /* Destroy Selectors object. */
71
- (void )lxb_selectors_destroy (selectors, true );
77
+ status = lxb_selectors_find (selectors, body, list, find_callback, &found);
78
+ if (status != LXB_STATUS_OK) {
79
+ obs_log (LOG_ERROR, " Failed to find nodes by CSS Selectors" );
80
+ break ;
81
+ }
72
82
73
- /* Destroy resources for CSS Parser. */
74
- (void )lxb_css_parser_destroy (parser, true );
83
+ } while (0 );
75
84
76
- /* Destroy all object for all CSS Selector List. */
77
- lxb_css_selector_list_destroy_memory (list);
85
+ // Cleanup
86
+ if (list) {
87
+ lxb_css_selector_list_destroy_memory (list);
88
+ }
89
+ if (selectors) {
90
+ lxb_selectors_destroy (selectors, true );
91
+ }
92
+ if (parser) {
93
+ lxb_css_parser_destroy (parser, true );
94
+ }
78
95
79
- return LXB_STATUS_OK ;
96
+ return status ;
80
97
}
81
98
82
99
struct request_data_handler_response parse_html (struct request_data_handler_response response,
83
100
const url_source_request_data *request_data)
84
101
{
85
- lxb_status_t status;
86
- lxb_html_document_t *document;
102
+ lxb_html_document_t *document = nullptr ;
87
103
88
- document = lxb_html_document_create ();
89
- if (document == NULL ) {
90
- return make_fail_parse_response (" Failed to setup HTML parser" );
91
- }
104
+ try {
105
+ document = lxb_html_document_create ();
106
+ if (!document) {
107
+ return make_fail_parse_response (" Failed to create HTML document" );
108
+ }
92
109
93
- status = lxb_html_document_parse (document, (const lxb_char_t *)response.body .c_str (),
94
- response.body .length ());
95
- if (status != LXB_STATUS_OK) {
96
- return make_fail_parse_response (" Failed to parse HTML" );
97
- }
110
+ lxb_status_t status =
111
+ lxb_html_document_parse (document, (const lxb_char_t *)response.body .c_str (),
112
+ response.body .length ());
98
113
99
- std::string parsed_output = response.body ;
100
- // Get the output value
101
- if (request_data->output_cssselector != " " ) {
102
- std::vector<std::string> found;
103
- if (find_with_selectors (request_data->output_cssselector , document, found) !=
104
- LXB_STATUS_OK) {
105
- return make_fail_parse_response (" Failed to find element with CSS selector" );
106
- } else {
107
- if (found.size () > 0 ) {
108
- std::copy (found.begin (), found.end (),
109
- std::back_inserter (response.body_parts_parsed ));
114
+ if (status != LXB_STATUS_OK) {
115
+ lxb_html_document_destroy (document);
116
+ return make_fail_parse_response (" Failed to parse HTML" );
117
+ }
118
+
119
+ if (!request_data->output_cssselector .empty ()) {
120
+ std::vector<std::string> found;
121
+ status = find_with_selectors (request_data->output_cssselector , document,
122
+ found);
123
+
124
+ if (status != LXB_STATUS_OK) {
125
+ lxb_html_document_destroy (document);
126
+ return make_fail_parse_response (
127
+ " Failed to find element with CSS selector" );
110
128
}
129
+
130
+ response.body_parts_parsed = std::move (found);
131
+ } else {
132
+ response.body_parts_parsed .push_back (response.body );
111
133
}
112
- } else {
113
- // Return the whole HTML object
114
- response.body_parts_parsed .push_back (parsed_output);
115
- }
116
134
117
- return response;
135
+ lxb_html_document_destroy (document);
136
+ return response;
137
+
138
+ } catch (const std::exception &e) {
139
+ if (document) {
140
+ lxb_html_document_destroy (document);
141
+ }
142
+ return make_fail_parse_response (std::string (" HTML parsing exception: " ) + e.what ());
143
+ }
118
144
}
0 commit comments