Differentiate between success (full or partial), not-found, and failure.
authorDavid Shaw <dshaw@jabberwocky.com>
Sun, 3 Mar 2013 01:39:48 +0000 (20:39 -0500)
committerDavid Shaw <dshaw@jabberwocky.com>
Sun, 3 Mar 2013 01:57:29 +0000 (20:57 -0500)
* keyserver/gpgkeys_hkp.c (get_key): Use curl_easy_setinfo to get the
  HTTP status code so we can tell the difference between a successful
  retrieval, a partial retrieval, a not-found, or a server failed.

keyserver/gpgkeys_hkp.c

index d90027a..f0647d7 100644 (file)
@@ -1,6 +1,6 @@
 /* gpgkeys_hkp.c - talk to an HKP keyserver
  * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
- *               2009, 2012 Free Software Foundation, Inc.
+ *               2009, 2012, 2013 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -319,15 +319,49 @@ get_key(char *getkey)
     }
   else
     {
+      long status = 0;
+
       curl_writer_finalize(&ctx);
-      if(!ctx.flags.done)
+
+      curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &status);
+
+      if (opt->verbose > 2)
+       fprintf (console, "gpgkeys: HTTP response code is %ld\n", status);
+
+      if (status == 200)
+       {
+         if (!ctx.flags.done)
+           {
+             if (ctx.flags.begun)
+               {
+                 fprintf (console, "gpgkeys: key %s partially retrieved"
+                          " (probably corrupt)\n", getkey);
+                 fprintf (output, "\nKEY 0x%s FAILED %d\n",
+                          getkey, KEYSERVER_KEY_INCOMPLETE);
+               }
+             else
+               {
+                 fprintf (console, "gpgkeys: key %s can't be retrieved\n",
+                          getkey);
+                 fprintf (output, "\nKEY 0x%s FAILED %d\n",
+                          getkey, KEYSERVER_GENERAL_ERROR);
+               }
+           }
+         else
+           fprintf (output, "\nKEY 0x%s END\n", getkey);
+       }
+      else if (status == 404)
        {
-         fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
-         fprintf(output,"\nKEY 0x%s FAILED %d\n",
-                 getkey,KEYSERVER_KEY_NOT_FOUND);
+         fprintf (console, "gpgkeys: key %s not found on keyserver\n", getkey);
+         fprintf (output, "\nKEY 0x%s FAILED %d\n",
+                 getkey, KEYSERVER_KEY_NOT_FOUND);
        }
       else
-       fprintf(output,"\nKEY 0x%s END\n",getkey);
+       {
+         fprintf (console, "gpgkeys: key %s can't be retrieved\n", getkey);
+         fprintf (output, "\nKEY 0x%s FAILED %d\n",
+                 getkey, KEYSERVER_GENERAL_ERROR);
+       }
     }
 
   return KEYSERVER_OK;
@@ -388,16 +422,47 @@ get_name(const char *getkey)
     }
   else
     {
+      long status = 0;
+
       curl_writer_finalize(&ctx);
-      if(!ctx.flags.done)
+
+      curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &status);
+
+      if (opt->verbose > 2)
+       fprintf (console, "gpgkeys: HTTP response code is %ld\n", status);
+
+      if (status == 200)
+       {
+         if (!ctx.flags.done)
+           {
+             if (ctx.flags.begun)
+               {
+                 fprintf (console, "gpgkeys: key %s partially retrieved"
+                          " (probably corrupt)\n", getkey);
+                 ret = KEYSERVER_KEY_INCOMPLETE;
+               }
+             else
+               {
+                 fprintf (console, "gpgkeys: key %s can't be retrieved\n",
+                          getkey);
+                 ret = KEYSERVER_GENERAL_ERROR;
+               }
+           }
+         else
+           {
+             fprintf (output, "\nNAME %s END\n", getkey);
+             ret = KEYSERVER_OK;
+           }
+       }
+      else if (status == 404)
        {
-         fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
-         ret=KEYSERVER_KEY_NOT_FOUND;
+         fprintf (console, "gpgkeys: key %s not found on keyserver\n", getkey);
+         ret = KEYSERVER_KEY_NOT_FOUND;
        }
       else
        {
-         fprintf(output,"\nNAME %s END\n",getkey);
-         ret=KEYSERVER_OK;
+         fprintf (console, "gpgkeys: key %s can't be retrieved\n", getkey);
+         ret = KEYSERVER_GENERAL_ERROR;
        }
     }