]> Pileus Git - grits/blobdiff - src/data/gis-http.c
Return NULL when GisHttp fetch fails
[grits] / src / data / gis-http.c
index fb742c7e0e8d1d8b5c0d3981226c7e45cc197902..0765415f3e974d87c42d4879d63a663274cd7974 100644 (file)
@@ -133,7 +133,10 @@ gchar *gis_http_fetch(GisHttp *http, const gchar *uri, const char *local,
                g_debug("GisHttp: do_cache - Caching file %s", local);
 
                /* Open the file for writting */
-               FILE *fp = fopen_p(path, "a");
+               gchar *part = path;
+               if (!g_file_test(path, G_FILE_TEST_EXISTS))
+                       part = g_strdup_printf("%s.part", path);
+               FILE *fp = fopen_p(part, "a");
 
                /* Make temp data */
                struct _CacheInfo info = {
@@ -151,14 +154,23 @@ gchar *gis_http_fetch(GisHttp *http, const gchar *uri, const char *local,
                soup_message_headers_set_range(message->request_headers, ftell(fp), -1);
                soup_session_send_message(http->soup, message);
 
+               /* Close file */
+               fclose(fp);
+               if (path != part && SOUP_STATUS_IS_SUCCESSFUL(message->status_code)) {
+                       g_rename(part, path);
+                       g_free(part);
+               }
+
                /* Finished */
                if (message->status_code == 416) {
                        /* Range unsatisfiable, file already complete */
-               } else if (!SOUP_STATUS_IS_SUCCESSFUL(message->status_code))
+               } else if (!SOUP_STATUS_IS_SUCCESSFUL(message->status_code)) {
                        g_warning("GisHttp: done_cb - error copying file, status=%d\n"
                                        "\tsrc=%s\n"
                                        "\tdst=%s",
                                        message->status_code, uri, path);
+                       return NULL;
+               }
        }
 
        /* TODO: free everything.. */