DBG("Completed -%s: result(%d)\n", url, curl_code);
- if (curl_code == CURLE_OK) {
- transaction->completed_cb(transaction, transaction->completed_user_data);
- } else {
-
+ switch (curl_code) {
+ case CURLE_OK:
+ if (transaction->completed_cb)
+ transaction->completed_cb(transaction, transaction->completed_user_data);
+ break;
+ case CURLE_COULDNT_RESOLVE_HOST:
+ case CURLE_COULDNT_CONNECT:
+ case CURLE_SSL_CONNECT_ERROR:
+ case CURLE_OPERATION_TIMEDOUT:
+ if (transaction->aborted_cb)
+ transaction->aborted_cb(transaction, (int)curl_code, transaction->aborted_user_data);
+ break;
+ default:
+ break;
}
curl_multi_remove_handle(session->multi_handle, curl_easy);
- g_main_loop_quit((GMainLoop*)transaction->thread_loop);
}
message = curl_multi_info_read(session->multi_handle, &count);
}
g_main_loop_run(transaction->thread_loop);
- g_main_loop_unref(transaction->thread_loop);
- transaction->thread_loop = NULL;
DBG("thread exited.\n");
return NULL;
session->active_transaction_count--;
if (transaction) {
- g_thread_join(transaction->thread);
- transaction->thread = NULL;
if (transaction->easy_handle != NULL) {
curl_easy_cleanup(transaction->easy_handle);
transaction->timeout = 0;
transaction->verify_peer = 0;
- transaction->ca_path = '\0';
+
+ if (transaction->ca_path) {
+ free(transaction->ca_path);
+ transaction->ca_path = NULL;
+ }
transaction->error[0] = '\0';
transaction->header_cb = NULL;
free(header);
}
+ _remove_transaction_from_list(transaction);
+
+ g_main_loop_quit((GMainLoop*)transaction->thread_loop);
+
+ g_main_loop_unref(transaction->thread_loop);
+ transaction->thread_loop = NULL;
+
+ g_thread_join(transaction->thread);
+ transaction->thread = NULL;
+
free(transaction);
transaction = NULL;
}
return HTTP_ERROR_NONE;
}
+API int http_transaction_set_aborted_cb(http_transaction_h http_transaction, http_transaction_aborted_cb aborted_cb, void* user_data)
+{
+ _retvm_if(http_transaction == NULL, HTTP_ERROR_INVALID_PARAMETER,
+ "parameter(http_transaction) is NULL\n");
+ _retvm_if(aborted_cb == NULL, HTTP_ERROR_INVALID_PARAMETER,
+ "parameter(aborted_cb) is NULL\n");
+
+ __http_transaction_h *transaction = (__http_transaction_h *)http_transaction;
+
+ transaction->aborted_cb = aborted_cb;
+ transaction->aborted_user_data = user_data;
+
+ return HTTP_ERROR_NONE;
+}
API int http_transaction_unset_progress_cb(http_transaction_h http_transaction)
{
DBG("URI(%s) HTTP version (%d) Status Code (%d) Status message (%s)\n", uri, version, status_code, status_text);
}
+void close_transaction(http_transaction_h transaction_handle)
+{
+ remove_http_header(transaction_handle);
+
+ http_transaction_close(transaction_handle);
+
+ //transaction_handle = NULL;
+}
+
+void delete_session(http_session_h session)
+{
+ http_transaction_close_all(session_handle);
+
+ http_delete_session(session_handle);
+ session_handle = NULL;
+ http_deinit();
+}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////Callbacks////////////////////////////////////////////////////////////////////////////
void transaction_header_cb(http_transaction_h transaction_handle, char *header, size_t header_len, void *user_data)
{
- DBG("########################## transaction_header_cb#########################################\n");
+ DBG("########################## transaction_header_cb(%p)#########################################\n", transaction_handle);
}
void transaction_body_cb(http_transaction_h transaction_handle, char *body, size_t size, size_t nmemb, void *user_data)
{
- DBG("########################## transaction_body_cb#########################################\n");
+ DBG("########################## transaction_body_cb(%p)#########################################\n", transaction_handle);
int written = size * nmemb;
DBG("Received: %d\n", written);
//if (written) {
void transaction_write_cb(http_transaction_h transaction_handle, int recommended_chunk_size, void *user_data)
{
- DBG("########################## transaction_write_cb#########################################\n");
+ DBG("########################## transaction_write_cb(%p)#########################################\n", transaction_handle);
DBG("recommended_chunk_size:%d\n", recommended_chunk_size);
}
void transaction_completed_cb(http_transaction_h transaction_handle, void *user_data)
{
- DBG("########################## transaction_completed_cb#########################################\n");
+ DBG("########################## transaction_completed_cb(%p)#########################################\n", transaction_handle);
char *uri = NULL;
g_main_loop_quit((GMainLoop*)mainloop);
}
-void transaction_aborted_cb(int reason)
+void transaction_aborted_cb(http_transaction_h transaction_handle, int reason, void *user_data)
{
- DBG("########################## transaction_aborted_cb#########################################\n");
+ DBG("########################## transaction_aborted_cb(%p)#########################################\n", transaction_handle);
+ close_transaction(transaction_handle);
+ count--;
+
+ if (count == 0)
+ g_main_loop_quit((GMainLoop*)mainloop);
}
http_transaction_h create_http_request(http_session_h session_handle, gchar* host_url)
http_transaction_set_received_body_cb(transaction_handle1, transaction_body_cb, NULL);
http_transaction_set_uploaded_cb(transaction_handle1, transaction_write_cb, NULL);
http_transaction_set_completed_cb(transaction_handle1, transaction_completed_cb, NULL);
+ http_transaction_set_aborted_cb(transaction_handle1, transaction_aborted_cb, NULL);
http_transaction_set_received_header_cb(transaction_handle2, transaction_header_cb, NULL);
http_transaction_set_received_body_cb(transaction_handle2, transaction_body_cb, NULL);
http_transaction_set_uploaded_cb(transaction_handle2, transaction_write_cb, NULL);
http_transaction_set_completed_cb(transaction_handle2, transaction_completed_cb, NULL);
+ http_transaction_set_aborted_cb(transaction_handle2, transaction_aborted_cb, NULL);
DBG("transaction1(%p), transaction2(%p)\n", transaction_handle1, transaction_handle2);
submit_http_request(transaction_handle1);
g_main_loop_run(mainloop);
- remove_http_header(transaction_handle1);
- //http_transaction_close(transaction_handle1);
-
- remove_http_header(transaction_handle2);
- //http_transaction_close(transaction_handle2);
http_transaction_close_all(session_handle);
-
- if (transaction_handle1) DBG("transaction_handle1 remained(%p)\n", transaction_handle1);
- if (transaction_handle2) DBG("transaction_handle2 remained(%p)\n", transaction_handle2);
-
- transaction_handle1 = NULL;
- transaction_handle2 = NULL;
-
- http_delete_session(session_handle);
- session_handle = NULL;
- http_deinit();
-
- g_main_loop_unref(mainloop);
+ delete_session(session_handle);
DBG("########################## main:Exit#########################################\n");
return 0;