2

I set my dart server as shown below. I can sent data from Flutter Mobile app and receive back from Dart Server.

If the request method is GET in dart Server I connect to tcp socket a get some data. the data I need to send to Flutter app must be in JSON format.

I try to set request.response.headers.contentType to json and I am keep getting an error that says HttpException: HTTP headers are not mutable.

Code Part:

var _secureResponse = {};
_secureResponse[“Data”] = "$_returningServerData";
_secureResult = json.encode(_secureResponse);

request.response.headers.contentType = new ContentType("application", "json", charset: "utf-8");
request.response.write(_secureResult);
request.response.close();

Error:

  • null
  • Unhandled exception: HttpException: HTTP headers are not mutable
  • HttpHeaders._checkMutable (dart:_http/http_headers.dart:447:20)
  • HttpHeaders.contentType= (dart:_http/http_headers.dart:267:5)

Server Code:

Future main() async {
  final HttpServer server = await HttpServer.bind("127.0.0.1", 8080);
  server.listen((HttpRequest request) async {

    print(request.headers.contentType);

    try {
      if (request.method == "GET") {
         String _requestData = ......
          Socket _socket = await Socket.connect('192.168.22.129', 3000);

          // READ FROM CSERVER
          _socket.listen((List<int> event) {
            _reply = new String.fromCharCodes(event).trim();
          });

          // WRITE TO SERVER
          _socket.add(utf8.encode('$_requestData\r\n'));

          // wait 1 seconds
          await Future.delayed(Duration(milliseconds: 1000));
          _socket.close();

          var _secureResponse = {};
          _secureResponse["Data"] = "$_reply";
          _secureResult = json.encode(_secureResponse);

          request.response.headers.contentType = new    
          ContentType("application", "json", charset: "utf-8");
          request.response.write(_secureResult);
          request.response.close();

        }

    } finally {
      var _secureResponse = {};
      _secureResponse["Data"] = "ERROR";
      _secureResult = json.encode(_secureResponse);

      request.response.headers.contentType = new 
      ContentType("application", "json", charset: "utf-8");
      request.response.write(_secureResult);
      request.response.close();
    }
  });
}
Nick
  • 4,163
  • 13
  • 38
  • 63

1 Answers1

1

See https://api.dartlang.org/stable/2.1.0/dart-io/HttpHeaders-class.html

Did you try something like

request.headers.set(HttpHeaders.cacheControlHeader,
                    'max-age=3600, must-revalidate');

If you're building a server in Dart, may I suggest using package:shelf – it's much more user-friendly.

Kevin Moore
  • 5,921
  • 2
  • 29
  • 43
  • I am just trying to build middleware for my flutter app. The backend database it allows only tcp socket connection for some security reason. I use nginx to make proxy pass through to dart server. And in dart server I get request from Flutter mobile app and send to tcp socket. data which comes from tcp socket is not formatted, I just format with single key, value map (son) and I need to send to Flutter mobile app. I use aqueduct but for my project its very slow and looses some data. Does dart server has isolates so it can receive example 5000 request per min – Nick Feb 05 '19 at 03:13
  • Also tcp socket adata its in iso-8859-9 (Turkish) format. but when I try to send as utf-8 I need little bit more job on Flutter app to replace the character like 'Ý' to ‘I’. Or 'Ð' to 'G' or Þ' to 'S' so on.. – Nick Feb 05 '19 at 03:34