diff --git a/twisted/web/http_headers.py b/twisted/web/http_headers.py
index f0790b9..1a93e18 100644
--- a/twisted/web/http_headers.py
+++ b/twisted/web/http_headers.py
@@ -194,9 +194,14 @@ class Headers(object):
 
         @return: C{None}
         """
+
         if not isinstance(values, list):
             raise TypeError("Header entry %r should be list but found "
                             "instance of %r instead" % (name, type(values)))
+
+        if not all(isinstance(n, bytes) for n in name):
+            raise TypeError("All header elements in %r must be bytes" % name )
+
         self._rawHeaders[name.lower()] = values
 
 
diff --git a/twisted/web/test/test_http.py b/twisted/web/test/test_http.py
index f3f2dcc..cc59a23 100644
--- a/twisted/web/test/test_http.py
+++ b/twisted/web/test/test_http.py
@@ -1375,6 +1375,16 @@ class RequestTests(unittest.TestCase, ResponseTestMixin):
             "Passing non-bytes header values is deprecated since "
             "Twisted 12.3. Pass only bytes instead.")
 
+    def test_nonByteHeaderError(self):
+        """
+        L{http.Request.write} casts non-bytes header value to bytes
+        transparently.
+        """
+        req = http.Request(DummyChannel(), None)
+
+        intlist = [int(1), int(2)]
+        err = self.assertRaises(TypeError, req.responseHeaders.setRawHeaders, intlist, [10])
+        self.assertEqual(str(err), "All header elements in " + intlist.__str__() + " must be bytes")     
 
     def test_firstWriteHTTP11Chunked(self):
         """
