Giaslas Georgios introduced CURLINFO_CONTENT_TYPE
authorDaniel Stenberg <daniel@haxx.se>
Tue, 29 Jan 2002 10:49:32 +0000 (10:49 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 29 Jan 2002 10:49:32 +0000 (10:49 +0000)
include/curl/curl.h
lib/getinfo.c
lib/transfer.c
lib/url.c
lib/urldata.h

index 44b317410c26129930a6747e6213e3d71d1b8870..62ac0479d3a4ec3833f9a1e7901de0635c66a4c0 100644 (file)
@@ -666,7 +666,11 @@ typedef enum {
 
   CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17,
 
-  CURLINFO_LASTONE          = 18
+  CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18,
+
+  /* Fill in new entries here! */
+
+  CURLINFO_LASTONE          = 19
 } CURLINFO;
 
 /* unfortunately, the easy.h include file needs the options and info stuff
index 51ceacbe611fffba43a2100b26b449bd8362247e..1df9b17435c1c2e7a3ceaae2ae17731606a8ef60 100644 (file)
@@ -48,9 +48,13 @@ CURLcode Curl_initinfo(struct SessionHandle *data)
   info->httpcode = 0;
   info->httpversion=0;
   info->filetime=-1; /* -1 is an illegal time and thus means unknown */
+  
+  if (info->contenttype)
+    free(info->contenttype);
+  info->contenttype = NULL;
+
   info->header_size = 0;
   info->request_size = 0;
-
   return CURLE_OK;
 }
 
@@ -134,6 +138,9 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
   case CURLINFO_CONTENT_LENGTH_UPLOAD:
     *param_doublep = data->progress.size_ul;
     break;
+  case CURLINFO_CONTENT_TYPE:
+    *param_charp = data->info.contenttype;
+    break;
   default:
     return CURLE_BAD_FUNCTION_ARGUMENT;
   }
index 448801b0f87cccaf9797385d6ae5c1be3c68461f..7acd06ab49d5deb5adf7119f7eed982701f3977d 100644 (file)
@@ -466,6 +466,31 @@ CURLcode Curl_readwrite(struct connectdata *conn,
             conn->size = k->contentlength;
             Curl_pgrsSetDownloadSize(data, k->contentlength);
           }
+          /* check for Content-Type: header lines to get the mime-type */
+          else if (strnequal("Content-Type:", k->p, 13)) {
+            char *start;
+            char *end;
+            int len;
+
+            /* Find the first non-space letter */
+            for(start=k->p+14;
+                *start && isspace((int)*start);
+                start++);
+
+            /* count all non-space letters following */
+            for(end=start+1, len=0;
+                *end && !isspace((int)*end);
+                end++, len++);
+
+            /* allocate memory of a cloned copy */
+            data->info.contenttype = malloc(len + 1);
+            if (NULL == data->info.contenttype)
+             return CURLE_OUT_OF_MEMORY;
+
+            /* copy the content-type string */
+           memcpy(data->info.contenttype, start, len);
+            data->info.contenttype[len] = 0; /* zero terminate */
+          }
           else if((k->httpversion == 10) &&
                   conn->bits.httpproxy &&
                   compareheader(k->p, "Proxy-Connection:", "keep-alive")) {
index 52b70f6383e05fc67a0534d09b36a4e3b5e786b3..6092c281c5302e4fba92f9ec0f4c0b18e1e551dd 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -191,6 +191,9 @@ CURLcode Curl_close(struct SessionHandle *data)
   /* free the connection cache */
   free(data->state.connects);
 
+  if(data->info.contenttype)
+    free(data->info.contenttype);
+
   free(data);
   return CURLE_OK;
 }
index d655347f42c5eec242a8dc25b94aa5c2865f294d..3d521d64806c0ea9a60aaa44d894a476bb607995 100644 (file)
@@ -432,6 +432,8 @@ struct PureInfo {
                     the time was unretrievable */
   long header_size;  /* size of read header(s) in bytes */
   long request_size; /* the amount of bytes sent in the request(s) */
+
+  char *contenttype; /* the content type of the object */
 };