From b3e62d6b323d3732b1f703237e1318773838357d Mon Sep 17 00:00:00 2001
From: Aditya Mayukh Som <adityamayukhsom@gmail.com>
Date: Sun, 24 Mar 2024 18:53:29 +0530
Subject: [PATCH] updated header and query support

---
 lib/codegen/java/async_http_client.dart | 54 ++++++++++++++++---------
 1 file changed, 36 insertions(+), 18 deletions(-)

diff --git a/lib/codegen/java/async_http_client.dart b/lib/codegen/java/async_http_client.dart
index 6f092f4b..51f0c64b 100644
--- a/lib/codegen/java/async_http_client.dart
+++ b/lib/codegen/java/async_http_client.dart
@@ -173,33 +173,51 @@ public class Main {
           templateRequestCreation.render({"method": method.name.toUpperCase()});
 
       // setting up query parameters
-      if (uri.hasQuery) {
-        var params = uri.queryParameters;
+      var params = uri.queryParameters;
+      if (params.isNotEmpty) {
         var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam);
-        params.forEach((name, value) {
-          result +=
-              templateUrlQueryParam.render({"name": name, "value": value});
-        });
+        result += templateUrlQueryParam.render({"queryParams": params});
       }
 
-      result = kTemplateStart + result;
-
-      var contentType = requestModel.requestBodyContentType.header;
-      var templateRequestHeader = jj.Template(kTemplateRequestHeader);
+      var headers = <String, String>{};
+      for (var i in harJson["headers"]) {
+        headers[i["name"]] = i["value"];
+      }
 
       // especially sets up Content-Type header if the request has a body
       // and Content-Type is not explicitely set by the developer
-      if (hasBody &&
-          !requestModel.enabledHeadersMap.containsKey('Content-Type')) {
-        result += templateRequestHeader
-            .render({"name": 'Content-Type', "value": contentType});
+      if (requestModel.hasBody && !headers.containsKey("Content-Type")) {
+        headers["Content-Type"] = requestModel.requestBodyContentType.header;
+      }
+
+      if (requestModel.hasBody &&
+          requestModel.hasFormData &&
+          !requestModel.hasFileInFormData) {
+        headers["Content-Type"] = "application/x-www-form-urlencoded";
+      }
+
+      // we will use this request boundary to set boundary if multipart formdata is used
+      // String requestBoundary = "";
+      String multipartTypePrefix = "multipart/form-data; boundary=";
+      if (headers.containsKey("Content-Type") &&
+          headers["Content-Type"]!.startsWith(RegExp(multipartTypePrefix))) {
+        // String tmp = headers["Content-Type"]!;
+        // requestBoundary = tmp.substring(multipartTypePrefix.length);
+
+        // if a boundary is provided, we will use that as the default boundary
+        if (boundary != null) {
+          // requestBoundary = boundary;
+          headers["Content-Type"] = multipartTypePrefix + boundary;
+        }
       }
 
       // setting up rest of the request headers
-      var headers = requestModel.enabledHeadersMap;
-      headers.forEach((name, value) {
-        result += templateRequestHeader.render({"name": name, "value": value});
-      });
+      if (headers.isNotEmpty) {
+        var templateRequestHeader = jj.Template(kTemplateRequestHeader);
+        result += templateRequestHeader.render({
+          "headers": headers //
+        });
+      }
 
       // handling form data
       if (requestModel.hasFormData &&