diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c
index 80f9eb0..b4844a2 100644
--- a/ext/soup/gstsouphttpsrc.c
+++ b/ext/soup/gstsouphttpsrc.c
@@ -75,6 +75,7 @@
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>             /* atoi() */
 #endif
+#include <stdio.h>              /* sscanf() */
 #include <gst/gstelement.h>
 #include <gst/gst-i18n-plugin.h>
 #include <libsoup/soup.h>
@@ -164,6 +165,8 @@ static void gst_soup_http_src_finished_cb (SoupMessage * msg,
 static void gst_soup_http_src_authenticate_cb (SoupSession * session,
     SoupMessage * msg, SoupAuth * auth, gboolean retrying,
     GstSoupHTTPSrc * src);
+static void gst_soup_http_src_determine_size (GstSoupHTTPSrc * src);
+static void gst_soup_http_src_log_http_info (GstSoupHTTPSrc * src);
 
 #define gst_soup_http_src_parent_class parent_class
 G_DEFINE_TYPE_WITH_CODE (GstSoupHTTPSrc, gst_soup_http_src, GST_TYPE_PUSH_SRC,
@@ -551,10 +554,20 @@ gst_soup_http_src_add_range_header (GstSoupHTTPSrc * src, guint64 offset,
       rc = g_snprintf (buf, sizeof (buf), "bytes=%" G_GUINT64_FORMAT "-",
           offset);
     }
-    if (rc > sizeof (buf) || rc < 0)
+    if (rc > sizeof (buf) || rc < 0) {
+      GST_INFO_OBJECT (src, "Not adding range to HEAD request");
       return FALSE;
+    }
+    GST_INFO_OBJECT (src, "Adding range to HEAD request");
     soup_message_headers_append (src->msg->request_headers, "Range", buf);
+  } else if (src->msg->method == SOUP_METHOD_HEAD) {
+    /* If this is a HEAD request include range to get content length in case
+     * server does not include by default */
+    GST_INFO_OBJECT (src, "Adding range to HEAD request");
+    soup_message_headers_append (src->msg->request_headers, "Range",
+        "bytes=0-");
   }
+
   src->read_position = offset;
   return TRUE;
 }
@@ -741,9 +754,7 @@ gst_soup_http_src_got_headers_cb (SoupMessage * msg, GstSoupHTTPSrc * src)
   guint64 newsize;
   GHashTable *params = NULL;
 
-  GST_DEBUG_OBJECT (src, "got headers:");
-  soup_message_headers_foreach (msg->response_headers,
-      gst_soup_http_src_headers_foreach, src);
+  gst_soup_http_src_log_http_info (src);
 
   if (msg->status_code == 407 && src->proxy_id && src->proxy_pw)
     return;
@@ -771,13 +782,23 @@ gst_soup_http_src_got_headers_cb (SoupMessage * msg, GstSoupHTTPSrc * src)
       src->content_size = newsize;
       src->have_size = TRUE;
       src->seekable = TRUE;
-      GST_DEBUG_OBJECT (src, "size = %" G_GUINT64_FORMAT, src->content_size);
+      GST_INFO_OBJECT (src,
+          "Got content-length, setting size = %" G_GUINT64_FORMAT,
+          src->content_size);
 
       basesrc = GST_BASE_SRC_CAST (src);
       basesrc->segment.duration = src->content_size;
       gst_element_post_message (GST_ELEMENT (src),
           gst_message_new_duration_changed (GST_OBJECT (src)));
     }
+  } else {
+    if (!src->have_size) {
+      /* Use HEAD response headers to determine content size if content-length
+       * not included */
+      GST_INFO_OBJECT (src,
+          "Determine size based on HTTP HEAD response headers");
+      gst_soup_http_src_determine_size (src);
+    }
   }
 
   /* Icecast stuff */
@@ -1405,6 +1426,99 @@ gst_soup_http_src_get_size (GstBaseSrc * bsrc, guint64 * size)
 }
 
 static void
+gst_soup_http_src_log_http_info (GstSoupHTTPSrc * src)
+{
+  const gchar *header_name, *header_value;
+  SoupMessageHeadersIter iter;
+  GString *log_str = g_string_sized_new (256);
+
+  if (src->msg) {
+    g_string_append_printf (log_str, "\nREQUEST: %s %s HTTP/1.%d\n",
+        src->msg->method, soup_uri_to_string (soup_message_get_uri (src->msg),
+            TRUE), soup_message_get_http_version (src->msg));
+
+    log_str = g_string_append (log_str, "REQUEST HEADERS:\n");
+    soup_message_headers_iter_init (&iter, src->msg->request_headers);
+    while (soup_message_headers_iter_next (&iter, &header_name, &header_value))
+      g_string_append_printf (log_str, "%s: %s\n", header_name, header_value);
+
+    g_string_append_printf (log_str, "RESPONSE: HTTP/1.%d %d %s\n",
+        soup_message_get_http_version (src->msg),
+        src->msg->status_code, src->msg->reason_phrase);
+
+    log_str = g_string_append (log_str, "RESPONSE HEADERS:\n");
+    soup_message_headers_iter_init (&iter, src->msg->response_headers);
+    while (soup_message_headers_iter_next (&iter, &header_name, &header_value))
+      g_string_append_printf (log_str, "%s: %s\n", header_name, header_value);
+    GST_INFO_OBJECT (src, "Soup http message: %s", log_str->str);
+  } else
+    GST_INFO_OBJECT (src, "Null soup http message");
+
+  g_string_free (log_str, TRUE);
+}
+
+static void
+gst_soup_http_src_determine_size (GstSoupHTTPSrc * src)
+{
+  guint64 size;
+  const gchar *header;
+  gchar *header_uppercase;
+  GstBaseSrc *basesrc;
+
+  if (!src->msg) {
+    GST_INFO_OBJECT (src, "Unable to determine size due to null HTTP message");
+    return;
+  }
+
+  if (src->have_size) {
+    GST_INFO_OBJECT (src, "Already have size = %" G_GUINT64_FORMAT,
+        src->content_size);
+    return;
+  }
+
+  if ((header =
+          soup_message_headers_get_one (src->msg->response_headers,
+              "content-range")) != NULL) {
+  } else {
+    GST_INFO_OBJECT (src,
+        "Unable to get size due to no content range header available");
+    return;
+  }
+
+  /* Convert to upper case */
+  header_uppercase = g_ascii_strup (header, -1);
+
+  /* Parse out size from string in format: bytes 0-168042671/168042672 */
+  if (sscanf (header_uppercase, "BYTES%*[^/]/%" G_GUINT64_FORMAT, &size) != 1) {
+    GST_WARNING_OBJECT (src,
+        "Problem parsing BYTES from header with format %s in HEAD response: %s",
+        "BYTES%*[^/]/%" G_GUINT64_FORMAT, header);
+    g_free (header_uppercase);
+    return;
+  } else {
+    GST_INFO_OBJECT (src,
+        "Set size based on header %s in head response, size = %"
+        G_GUINT64_FORMAT, header, size);
+  }
+  g_free (header_uppercase);
+
+  /* If now have size, update accordingly */
+  if (size > 0) {
+    src->content_size = size;
+    src->have_size = TRUE;
+    src->seekable = TRUE;
+    GST_INFO_OBJECT (src, "Set seekable with size = %" G_GUINT64_FORMAT,
+        src->content_size);
+
+    basesrc = GST_BASE_SRC_CAST (src);
+    basesrc->segment.duration = src->content_size;
+    gst_element_post_message (GST_ELEMENT (src),
+        gst_message_new_duration_changed (GST_OBJECT (src)));
+  } else
+    GST_INFO_OBJECT (src, "Got size 0 from content range header");
+}
+
+static void
 gst_soup_http_src_check_seekable (GstSoupHTTPSrc * src)
 {
   GstFlowReturn ret = GST_FLOW_OK;
@@ -1452,12 +1566,12 @@ gst_soup_http_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment)
 {
   GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc);
 
-  GST_DEBUG_OBJECT (src, "do_seek(%" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT
+  GST_INFO_OBJECT (src, "do_seek(%" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT
       ")", segment->start, segment->stop);
   if (src->read_position == segment->start &&
       src->request_position == src->read_position &&
       src->stop_position == segment->stop) {
-    GST_DEBUG_OBJECT (src,
+    GST_INFO_OBJECT (src,
         "Seek to current read/end position and no seek pending");
     return TRUE;
   }
