static gboolean http_archive_read_callback (gpointer user_data) { FetchData *fetch_data = (FetchData *) user_data; gint r; struct archive_entry *entry; gchar *newPath = NULL; r = archive_read_next_header(fetch_data->a, &entry); if (r == ARCHIVE_EOF) { if (fetch_data->extracted_cnt == 0) { g_set_error(&fetch_data->error, RESTRAINT_FETCH_LIBARCHIVE_ERROR, ARCHIVE_WARN, "Nothing was extracted from archive"); } g_idle_add (archive_finish_callback, fetch_data); return FALSE; } if (r != ARCHIVE_OK) { g_set_error(&fetch_data->error, RESTRAINT_FETCH_LIBARCHIVE_ERROR, r, "archive_read_next_header failed: %s", archive_error_string(fetch_data->a)); g_idle_add (archive_finish_callback, fetch_data); return FALSE; } if (fetch_data->archive_entry_callback) { fetch_data->archive_entry_callback (archive_entry_pathname (entry), fetch_data->user_data); } const gchar *fragment = soup_uri_get_fragment(fetch_data->url); const gchar *entry_path = archive_entry_pathname(entry); if (fragment == NULL || (g_strrstr(entry_path, fragment) != NULL && !(fragment[strlen(fragment)] != '/' && strlen(entry_path) == strlen(fragment) + 1)) ) { // Update pathname gchar *basename = g_path_get_basename(entry_path); newPath = g_build_filename(fetch_data->base_path, basename, NULL); archive_entry_set_pathname( entry, newPath ); g_free(basename); if (fetch_data->keepchanges == FALSE || access(archive_entry_pathname(entry), F_OK) == -1) { r = archive_read_extract2(fetch_data->a, entry, fetch_data->ext); if (r != ARCHIVE_OK) { g_set_error(&fetch_data->error, RESTRAINT_FETCH_LIBARCHIVE_ERROR, r, "archive_read_extract2 failed: %s", archive_error_string(fetch_data->ext)); g_idle_add (archive_finish_callback, fetch_data); return FALSE; } fetch_data->extracted_cnt++; } } return TRUE; }
ScLocalStorageManager* sc_local_storage_manager_new(const gchar *url) { ScLocalStorageManager *manager = g_new0(ScLocalStorageManager, 1); SoupURI *uri = soup_uri_new(url); GString *filename = g_string_new(NULL); const gchar *host = soup_uri_get_host(uri); const gchar *path = soup_uri_get_path(uri); const gchar *query = soup_uri_get_query(uri); const gchar *fragment = soup_uri_get_fragment(uri); GFile *parent = NULL; GError *error = NULL; g_string_append_printf(filename, "%s/%s", host, path); if(url[strlen(url) - 1] == '/' || g_strcmp0("/", path) == 0) g_string_append(filename, "/index.html"); if(query) g_string_append_printf(filename, "/%s\n", query); if(fragment) g_string_append_printf(filename, "#%s\n", fragment); manager->file = g_file_new_for_commandline_arg(filename->str); g_string_free(filename, TRUE); if(g_file_query_exists(manager->file, NULL)) { g_file_delete(manager->file, NULL, &error); if(error && !g_error_matches(error, G_IO_ERROR,G_IO_ERROR_EXISTS)) { g_critical(G_STRLOC ": %d : %s", error->code, error->message); g_error_free(error); g_object_unref(parent); g_object_unref(manager->file); g_free(manager); return NULL; } } parent = g_file_get_parent(manager->file); g_file_make_directory_with_parents(parent, NULL, &error); if(error && !g_error_matches(error, G_IO_ERROR,G_IO_ERROR_EXISTS)) { g_critical(G_STRLOC ": %d : %s", error->code, error->message); g_error_free(error); g_object_unref(parent); g_object_unref(manager->file); g_free(manager); return NULL; } error = NULL; manager->ostream = g_file_create(manager->file, G_FILE_CREATE_NONE, NULL, &error); if(error) { g_critical(G_STRLOC ": %d : %s", error->code, error->message); g_error_free(error); g_object_unref(parent); g_object_unref(manager->file); g_free(manager); return NULL; } return manager; }
static void do_soup_uri_null_tests (void) { SoupURI *uri, *uri2; char *uri_string; debug_printf (1, "\nsoup_uri_new (NULL)\n"); uri = soup_uri_new (NULL); if (SOUP_URI_IS_VALID (uri) || SOUP_URI_VALID_FOR_HTTP (uri)) { debug_printf (1, " ERROR: soup_uri_new(NULL) returns valid URI?\n"); errors++; } /* This implicitly also verifies that none of these methods g_warn */ if (soup_uri_get_scheme (uri) || soup_uri_get_user (uri) || soup_uri_get_password (uri) || soup_uri_get_host (uri) || soup_uri_get_port (uri) || soup_uri_get_path (uri) || soup_uri_get_query (uri) || soup_uri_get_fragment (uri)) { debug_printf (1, " ERROR: soup_uri_new(NULL) returns non-empty URI?\n"); errors++; } expect_warning = TRUE; uri2 = soup_uri_new_with_base (uri, "/path"); if (uri2 || expect_warning) { debug_printf (1, " ERROR: soup_uri_new_with_base didn't fail on NULL URI?\n"); errors++; expect_warning = FALSE; } expect_warning = TRUE; uri_string = soup_uri_to_string (uri, FALSE); if (expect_warning) { debug_printf (1, " ERROR: soup_uri_to_string didn't fail on NULL URI?\n"); errors++; expect_warning = FALSE; } else if (*uri_string) { debug_printf (1, " ERROR: soup_uri_to_string on NULL URI returned '%s'\n", uri_string); errors++; } g_free (uri_string); soup_uri_set_scheme (uri, SOUP_URI_SCHEME_HTTP); if (SOUP_URI_IS_VALID (uri) || SOUP_URI_VALID_FOR_HTTP (uri)) { debug_printf (1, " ERROR: setting scheme on NULL URI makes it valid?\n"); errors++; } expect_warning = TRUE; uri_string = soup_uri_to_string (uri, FALSE); if (expect_warning) { debug_printf (1, " ERROR: soup_uri_to_string didn't fail on scheme-only URI?\n"); errors++; expect_warning = FALSE; } else if (strcmp (uri_string, "http:") != 0) { debug_printf (1, " ERROR: soup_uri_to_string returned '%s' instead of 'http:'\n", uri_string); errors++; } g_free (uri_string); soup_uri_set_host (uri, "localhost"); if (SOUP_URI_IS_VALID (uri)) { debug_printf (1, " ERROR: setting scheme+host on NULL URI makes it valid?\n"); errors++; } if (SOUP_URI_VALID_FOR_HTTP (uri)) { debug_printf (1, " ERROR: setting scheme+host on NULL URI makes it valid for http?\n"); errors++; } expect_warning = TRUE; uri_string = soup_uri_to_string (uri, FALSE); if (expect_warning) { debug_printf (1, " ERROR: soup_uri_to_string didn't fail on scheme+host URI?\n"); errors++; expect_warning = FALSE; } else if (strcmp (uri_string, "http://localhost/") != 0) { debug_printf (1, " ERROR: soup_uri_to_string with NULL path returned '%s' instead of 'http://localhost/'\n", uri_string); errors++; } g_free (uri_string); expect_warning = TRUE; uri2 = soup_uri_new_with_base (uri, "/path"); if (expect_warning) { debug_printf (1, " ERROR: soup_uri_new_with_base didn't warn on NULL+scheme URI?\n"); errors++; expect_warning = FALSE; } else if (!uri2) { debug_printf (1, " ERROR: soup_uri_new_with_base didn't fix path on NULL+scheme URI\n"); errors++; } if (uri2) { uri_string = soup_uri_to_string (uri2, FALSE); if (!uri_string) { debug_printf (1, " ERROR: soup_uri_to_string failed on uri2?\n"); errors++; } else if (strcmp (uri_string, "http://localhost/path") != 0) { debug_printf (1, " ERROR: soup_uri_to_string returned '%s' instead of 'http://localhost/path'\n", uri_string); errors++; } g_free (uri_string); soup_uri_free (uri2); } expect_warning = TRUE; soup_uri_set_path (uri, NULL); if (expect_warning) { debug_printf (1, " ERROR: setting path to NULL doesn't warn\n"); errors++; expect_warning = FALSE; } if (!uri->path || *uri->path) { debug_printf (1, " ERROR: setting path to NULL != \"\"\n"); errors++; soup_uri_set_path (uri, ""); } uri_string = soup_uri_to_string (uri, FALSE); if (!uri_string) { debug_printf (1, " ERROR: soup_uri_to_string failed on complete URI?\n"); errors++; } else if (strcmp (uri_string, "http://localhost/") != 0) { debug_printf (1, " ERROR: soup_uri_to_string with empty path returned '%s' instead of 'http://localhost/'\n", uri_string); errors++; } g_free (uri_string); if (!SOUP_URI_IS_VALID (uri)) { debug_printf (1, " ERROR: setting scheme+path on NULL URI doesn't make it valid?\n"); errors++; } if (!SOUP_URI_VALID_FOR_HTTP (uri)) { debug_printf (1, " ERROR: setting scheme+host+path on NULL URI doesn't make it valid for http?\n"); errors++; } soup_uri_free (uri); }