Interface support for custom HTTP headers in DL manager

* constants for new DB table, keys for including headers in a
  DownloadProvider.insert() call, and new URIs for retrieving headers
* support in DownloadManager to pass headers to the provider
diff --git a/core/java/android/net/DownloadManager.java b/core/java/android/net/DownloadManager.java
index 02b6210..00b6864 100644
--- a/core/java/android/net/DownloadManager.java
+++ b/core/java/android/net/DownloadManager.java
@@ -350,8 +350,7 @@
             }
 
             if (!mRequestHeaders.isEmpty()) {
-                // TODO request headers support
-                throw new UnsupportedOperationException();
+                encodeHttpHeaders(values);
             }
 
             putIfNonNull(values, Downloads.COLUMN_TITLE, mTitle);
@@ -367,6 +366,15 @@
             return values;
         }
 
+        private void encodeHttpHeaders(ContentValues values) {
+            int index = 0;
+            for (Map.Entry<String, String> entry : mRequestHeaders.entrySet()) {
+                String headerString = entry.getKey() + ": " + entry.getValue();
+                values.put(Downloads.Impl.RequestHeaders.INSERT_KEY_PREFIX + index, headerString);
+                index++;
+            }
+        }
+
         private void putIfNonNull(ContentValues contentValues, String key, String value) {
             if (value != null) {
                 contentValues.put(key, value);
diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java
index 1a4f8c0..2a612fe 100644
--- a/core/java/android/provider/Downloads.java
+++ b/core/java/android/provider/Downloads.java
@@ -1115,5 +1115,26 @@
          * This download doesn't show in the UI or in the notifications.
          */
         public static final int VISIBILITY_HIDDEN = 2;
+
+        /**
+         * Constants related to HTTP request headers associated with each download.
+         */
+        public static class RequestHeaders {
+            public static final String HEADERS_DB_TABLE = "request_headers";
+            public static final String COLUMN_DOWNLOAD_ID = "download_id";
+            public static final String COLUMN_HEADER = "header";
+            public static final String COLUMN_VALUE = "value";
+
+            /**
+             * Path segment to add to a download URI to retrieve request headers
+             */
+            public static final String URI_SEGMENT = "headers";
+
+            /**
+             * Prefix for ContentValues keys that contain HTTP header lines, to be passed to
+             * DownloadProvider.insert().
+             */
+            public static final String INSERT_KEY_PREFIX = "http_header_";
+        }
     }
 }