aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/curl/curl.h6
-rw-r--r--lib/getinfo.c9
-rw-r--r--lib/transfer.c25
-rw-r--r--lib/url.c3
-rw-r--r--lib/urldata.h2
5 files changed, 43 insertions, 2 deletions
diff --git a/include/curl/curl.h b/include/curl/curl.h
index 44b317410..62ac0479d 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -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
diff --git a/lib/getinfo.c b/lib/getinfo.c
index 51ceacbe6..1df9b1743 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -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;
}
diff --git a/lib/transfer.c b/lib/transfer.c
index 448801b0f..7acd06ab4 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -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")) {
diff --git a/lib/url.c b/lib/url.c
index 52b70f638..6092c281c 100644
--- 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;
}
diff --git a/lib/urldata.h b/lib/urldata.h
index d655347f4..3d521d648 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -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 */
};