Use UTF8-decoding for headers in mime multipart parser.

BUG=http://code.google.com/p/dart/issues/detail?id=14303
R=sgjesse@google.com

Review URL: https://codereview.chromium.org//48403004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/mime@29526 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/lib/mime.dart b/lib/mime.dart
index 652aa85..d1372d4 100644
--- a/lib/mime.dart
+++ b/lib/mime.dart
@@ -15,6 +15,7 @@
 library mime;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:typed_data';
 
 part 'src/mime_type.dart';
diff --git a/lib/src/mime_multipart_transformer.dart b/lib/src/mime_multipart_transformer.dart
index 024cd71..a35b491 100644
--- a/lib/src/mime_multipart_transformer.dart
+++ b/lib/src/mime_multipart_transformer.dart
@@ -86,8 +86,8 @@
   int _index;
   List<int> _buffer;
 
-  StringBuffer _headerField = new StringBuffer();
-  StringBuffer _headerValue = new StringBuffer();
+  List<int> _headerField = [];
+  List<int> _headerValue = [];
 
   /**
    * Construct a new MIME multipart parser with the boundary
@@ -246,7 +246,7 @@
             _state = _HEADER_ENDING;
           } else {
             // Start of new header field.
-            _headerField.writeCharCode(_toLowerCase(byte));
+            _headerField.add(_toLowerCase(byte));
             _state = _HEADER_FIELD;
           }
           break;
@@ -258,7 +258,7 @@
             if (!_isTokenChar(byte)) {
               throw new MimeMultipartException("Invalid header field name");
             }
-            _headerField.writeCharCode(_toLowerCase(byte));
+            _headerField.add(_toLowerCase(byte));
           }
           break;
 
@@ -267,7 +267,7 @@
             _state = _HEADER_VALUE_FOLDING_OR_ENDING;
           } else if (byte != _CharCode.SP && byte != _CharCode.HT) {
             // Start of new header value.
-            _headerValue.writeCharCode(byte);
+            _headerValue.add(byte);
             _state = _HEADER_VALUE;
           }
           break;
@@ -276,7 +276,7 @@
           if (byte == _CharCode.CR) {
             _state = _HEADER_VALUE_FOLDING_OR_ENDING;
           } else {
-            _headerValue.writeCharCode(byte);
+            _headerValue.add(byte);
           }
           break;
 
@@ -289,16 +289,16 @@
           if (byte == _CharCode.SP || byte == _CharCode.HT) {
             _state = _HEADER_VALUE_START;
           } else {
-            String headerField = _headerField.toString();
-            String headerValue =_headerValue.toString();
+            String headerField = UTF8.decode(_headerField);
+            String headerValue = UTF8.decode(_headerValue);
             _headers[headerField.toLowerCase()] = headerValue;
-            _headerField = new StringBuffer();
-            _headerValue = new StringBuffer();
+            _headerField = [];
+            _headerValue = [];
             if (byte == _CharCode.CR) {
               _state = _HEADER_ENDING;
             } else {
               // Start of new header field.
-              _headerField.writeCharCode(_toLowerCase(byte));
+              _headerField.add(_toLowerCase(byte));
               _state = _HEADER_FIELD;
             }
           }