input/soup: return real GErrors to the caller
Add attribute postponed_error, pass this GError to the caller.
This commit is contained in:
		| @@ -58,6 +58,8 @@ struct input_soup { | |||||||
| 	size_t total_buffered; | 	size_t total_buffered; | ||||||
|  |  | ||||||
| 	bool alive, pause, eof; | 	bool alive, pause, eof; | ||||||
|  |  | ||||||
|  | 	GError *postponed_error; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static inline GQuark | static inline GQuark | ||||||
| @@ -128,6 +130,16 @@ input_soup_got_headers(SoupMessage *msg, gpointer user_data) | |||||||
| 	struct input_soup *s = user_data; | 	struct input_soup *s = user_data; | ||||||
|  |  | ||||||
| 	if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { | 	if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { | ||||||
|  | 		g_mutex_lock(s->mutex); | ||||||
|  |  | ||||||
|  | 		if (s->postponed_error == NULL) | ||||||
|  | 			s->postponed_error = | ||||||
|  | 				g_error_new(soup_quark(), msg->status_code, | ||||||
|  | 					    "got HTTP status %d", | ||||||
|  | 					    msg->status_code); | ||||||
|  |  | ||||||
|  | 		g_mutex_unlock(s->mutex); | ||||||
|  |  | ||||||
| 		soup_session_cancel_message(soup_session, msg, | 		soup_session_cancel_message(soup_session, msg, | ||||||
| 					    SOUP_STATUS_CANCELLED); | 					    SOUP_STATUS_CANCELLED); | ||||||
| 		return; | 		return; | ||||||
| @@ -230,6 +242,7 @@ input_soup_open(const char *uri, G_GNUC_UNUSED GError **error_r) | |||||||
| 	s->alive = true; | 	s->alive = true; | ||||||
| 	s->pause = false; | 	s->pause = false; | ||||||
| 	s->eof = false; | 	s->eof = false; | ||||||
|  | 	s->postponed_error = NULL; | ||||||
|  |  | ||||||
| 	soup_session_queue_message(soup_session, s->msg, | 	soup_session_queue_message(soup_session, s->msg, | ||||||
| 				   input_soup_session_callback, s); | 				   input_soup_session_callback, s); | ||||||
| @@ -286,10 +299,19 @@ input_soup_buffer(struct input_stream *is, GError **error_r) | |||||||
|  |  | ||||||
|  |  | ||||||
| 	bool success = input_soup_wait_data(s); | 	bool success = input_soup_wait_data(s); | ||||||
|  |  | ||||||
|  | 	if (!success) { | ||||||
|  | 		if (s->postponed_error != NULL) { | ||||||
|  | 			g_propagate_error(error_r, s->postponed_error); | ||||||
|  | 			s->postponed_error = NULL; | ||||||
|  | 		} else | ||||||
|  | 			g_set_error_literal(error_r, soup_quark(), 0, | ||||||
|  | 					    "HTTP failure"); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	g_mutex_unlock(s->mutex); | 	g_mutex_unlock(s->mutex); | ||||||
|  |  | ||||||
| 	if (!success) { | 	if (!success) { | ||||||
| 		g_set_error_literal(error_r, soup_quark(), 0, "HTTP failure"); |  | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -306,9 +328,15 @@ input_soup_read(struct input_stream *is, void *ptr, size_t size, | |||||||
|  |  | ||||||
| 	if (!input_soup_wait_data(s)) { | 	if (!input_soup_wait_data(s)) { | ||||||
| 		assert(!s->alive); | 		assert(!s->alive); | ||||||
| 		g_mutex_unlock(s->mutex); |  | ||||||
|  |  | ||||||
| 		g_set_error_literal(error_r, soup_quark(), 0, "HTTP failure"); | 		if (s->postponed_error != NULL) { | ||||||
|  | 			g_propagate_error(error_r, s->postponed_error); | ||||||
|  | 			s->postponed_error = NULL; | ||||||
|  | 		} else | ||||||
|  | 			g_set_error_literal(error_r, soup_quark(), 0, | ||||||
|  | 					    "HTTP failure"); | ||||||
|  |  | ||||||
|  | 		g_mutex_unlock(s->mutex); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann