Feat: python http.client codegen

This commit is contained in:
Ashita Prasad
2023-09-29 02:03:01 +05:30
parent 94000485f3
commit 0d3eeb631e

View File

@ -1,82 +1,144 @@
import 'dart:io';
import 'dart:convert';
import 'package:jinja/jinja.dart' as jj;
import 'package:apidash/consts.dart';
import '../../models/request_model.dart';
import 'package:apidash/utils/utils.dart'
show getValidRequestUri, padMultilineString, rowsToMap;
import 'package:apidash/models/models.dart' show RequestModel;
class PythonHttpClient {
final String headerSnippet = """
import http.client
import json
final String kTemplateStart = """import http.client
""";
String kTemplateParams = """
from urllib.parse import urlencode
queryParams = {{params}}
queryParamsStr = '?' + urlencode(queryParams)
""";
int kParamsPadding = 14;
String kTemplateBody = """
body = r'''{{body}}'''
""";
final String footerSnippet = """
String kTemplateHeaders = """
headers = {{headers}}
""";
int kHeadersPadding = 10;
String kTemplateConnection = """
conn = http.client.HTTP{{isHttps}}Connection("{{authority}}")""";
String kTemplateRequest = """
conn.request("{{method}}", "{{path}}"{{queryParamsStr}}""";
String kStringRequestBody = """,
body= body""";
String kStringRequestHeaders = """,
headers= headers""";
final String kStringRequestEnd = """)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
""";
String getCode(RequestModel requestModel) {
String result = "";
result += headerSnippet;
result +=
"conn = http.client.HTTPSConnection('${getUrl(requestModel)["host"]}'${getUrl(requestModel)["port"]})\n";
result += "payload = json.dumps(${requestModel.requestBody ?? ""})\n";
result +=
"""headers = {\n'Content-Type':'${requestModel.requestBodyContentType == ContentType.json ? 'application/json' : 'text/plain'}'\n${addHeaders(requestModel)}},\n""";
result +=
"conn.request(\"${requestModel.method.name.toUpperCase()}\", \"${getUrl(requestModel)["endpoint"]}${addQueryParams(requestModel)}\", payload, headers)\n";
result += footerSnippet;
String? getCode(
RequestModel requestModel,
String defaultUriScheme,
) {
try {
String result = "";
bool hasHeaders = false;
bool hasBody = false;
return result;
}
String url = requestModel.url;
if (!url.contains("://") && url.isNotEmpty) {
url = "$defaultUriScheme://$url";
}
String addHeaders(RequestModel requestModel) {
String result = "";
if (requestModel.requestHeaders == null) {
result += kTemplateStart;
var rec = getValidRequestUri(url, requestModel.requestParams);
Uri? uri = rec.$1;
if (uri != null) {
if (uri.hasQuery) {
var params = uri.queryParameters;
if (params.isNotEmpty) {
var templateParams = jj.Template(kTemplateParams);
var paramsString = kEncoder.convert(params);
paramsString = padMultilineString(paramsString, kParamsPadding);
result += templateParams.render({"params": paramsString});
}
}
var method = requestModel.method;
var requestBody = requestModel.requestBody;
if (kMethodsWithBody.contains(method) && requestBody != null) {
var contentLength = utf8.encode(requestBody).length;
if (contentLength > 0) {
hasBody = true;
var templateBody = jj.Template(kTemplateBody);
result += templateBody.render({"body": requestBody});
}
}
var headersList = requestModel.requestHeaders;
if (headersList != null || hasBody) {
var headers = rowsToMap(requestModel.requestHeaders) ?? {};
if (headers.isNotEmpty || hasBody) {
hasHeaders = true;
if (hasBody) {
headers[HttpHeaders.contentTypeHeader] =
kContentTypeMap[requestModel.requestBodyContentType] ?? "";
}
var headersString = kEncoder.convert(headers);
headersString = padMultilineString(headersString, kHeadersPadding);
var templateHeaders = jj.Template(kTemplateHeaders);
result += templateHeaders.render({"headers": headersString});
}
}
var templateConnection = jj.Template(kTemplateConnection);
result += templateConnection.render({
"isHttps": uri.scheme == "https" ? "S" : "",
"authority": uri.authority
});
var templateRequest = jj.Template(kTemplateRequest);
result += templateRequest.render({
"method": method.name.toUpperCase(),
"path": uri.path,
"queryParamsStr": (uri.hasQuery && uri.queryParameters.isNotEmpty)
? " + queryParamsStr"
: "",
});
if (hasBody) {
result += kStringRequestBody;
}
if (hasHeaders) {
result += kStringRequestHeaders;
}
result += kStringRequestEnd;
}
return result;
} catch (e) {
return null;
}
for (final header in requestModel.requestHeaders!) {
result += """'${header.name}':'${header.value}',\n""";
}
return result;
}
String addQueryParams(RequestModel requestModel) {
String result = "";
if (requestModel.requestParams == null) {
return result;
}
result += "?";
for (final queryParam in requestModel.requestParams!) {
result +=
"${queryParam.name.toString().replaceAll(" ", "%20")}=${queryParam.value.toString().replaceAll(" ", "%20")}&";
}
return result.substring(0, result.length - 1);
}
Map<String, String> getUrl(RequestModel requestModel) {
String result = "";
if (requestModel.url.startsWith('http://') ||
requestModel.url.startsWith('https://')) {
result = requestModel.url.substring(requestModel.url.indexOf('://') + 3);
} else {
result = requestModel.url;
}
Map<String, String> resultMap = {};
if (result.contains(":")) {
resultMap["host"] = result.substring(0, result.indexOf(':'));
resultMap["port"] =
",${result.substring(result.indexOf(':') + 1, result.contains('/') ? result.indexOf('/') : result.length)}";
resultMap["endpoint"] =
"/${result.substring(result.contains('/') ? result.indexOf('/') + 1 : result.length)}";
} else {
resultMap["host"] = result.contains("/")
? result.substring(0, result.indexOf('/'))
: result;
resultMap["port"] = "";
resultMap["endpoint"] =
"/${result.substring(result.contains('/') ? result.indexOf('/') + 1 : result.length)}";
}
return resultMap;
}
}