http - Groovy Curl 意外行为
问题描述
我有一个行为怪异的 groovy 脚本。我的要求是通过点击服务器然后再次点击服务器以使用身份验证令牌提交部署文件来生成身份验证令牌。我通过编写单独的文件测试了两个 api,一个生成了令牌,然后我手动将该令牌复制到第二个文件并将文件提交到服务器进行部署。当我将此功能组合在一个文件中时,代码不起作用。我使用 url post 生成令牌和 curl 调用来提交文件。以下是我的脚本:
import groovy.io.FileType
import groovy.json.JsonSlurper
import groovy.json.JsonOutput;
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLEngine
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.TrustManager
import javax.net.ssl.X509ExtendedTrustManager
import java.security.cert.CertificateException
import java.security.cert.X509Certificate
String LINE_FEED = "\r\n";
class UnsafeTrustManager extends X509ExtendedTrustManager {
@Override
void checkClientTrusted(X509Certificate[] x509Certificates, String s, Socket socket) throws CertificateException {}
@Override
void checkServerTrusted(X509Certificate[] x509Certificates, String s, Socket socket) throws CertificateException {}
@Override
void checkClientTrusted(X509Certificate[] x509Certificates, String s, SSLEngine sslEngine) throws CertificateException {}
@Override
void checkServerTrusted(X509Certificate[] x509Certificates, String s, SSLEngine sslEngine) throws CertificateException {}
@Override
void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}
@Override
void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}
@Override
X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0]
}
}
def upload(def auth,def nameSpace)
{
def sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, new TrustManager[]{new UnsafeTrustManager()}, null)
def sslSocketFactory = sslContext.getSocketFactory()
def postRC=""
def post
def postResponse
def auth1=""
post = (HttpsURLConnection) new URL("https://gateway.com:8443/tokens").openConnection();
post.setSSLSocketFactory(sslSocketFactory)
def message = '{"username":"user", "password":"pass"}'
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
post.getOutputStream().write(message.getBytes("UTF-8"));
postRC = post.getResponseCode();
if(postRC.equals(200))
{
postResponse=post.getInputStream().getText();
def slurper = new JsonSlurper()
def resultMap = slurper.parseText(postResponse)
auth1=resultMap["authToken"]
}
def filePath = nameSpace+"/test.yaml";
def command = "curl --location -w '%{http_code}' --request POST 'https://gateway.com:8443/cloudgateway/environments/'"+
" --header 'Content-Type: multipart/form-data'"+
" --header 'Authorization:"+auth +"\'" +
" --form 'request=@\""+filePath+"\"'"
println(" Curl command Generated for namepsace : ${nameSpace},command : ${command}")
StringBuffer out = new StringBuffer(4096)
StringBuffer err = new StringBuffer(4096)
def initialSize = 4096
def process = [ 'bash', '-c', command].execute()
process.consumeProcessOutput(out, err)
println(" Waiting curl command response for namepsace : ${nameSpace}")
process.waitFor()
if (process.exitValue()) {
println " erro "
println err
// println err
} else {
println " output is"
println out
}
}
upload("mytoken"
,"abc/def")
当我通过将执行此文件之前生成的令牌传递给它来调用上传函数时,它工作正常。我通过邮递员/(我在第一条语句中提到的另一个 groovy 文件)获取令牌。但是如果我在上传中生成令牌api,然后 curl 命令执行成功,但它没有给出任何输出。UnsafeTrustManager 类是在我的本地禁用 SSL 验证。所以 curl 看起来如下所示:
curl --location -w '%{http_code}' --request POST 'https://gateway.com:8443/environments/' --header 'Content-Type: multipart/form-data' --header 'Authorization:token' --form 'request=@"abc/def/myfile.yaml"'
为什么会这样,如果我动态生成令牌,curl 会给出空响应。但是如果删除代码以生成令牌并手动提供它可以工作。即使生成令牌的代码在那里但我使用传入参数的令牌,它仍然是不工作。但是如果我在终端上执行相同的卷曲它工作正常。我花了几个小时来调试。有人可以发光吗?
解决方案
推荐阅读
- xml - XSLT。复制节点并修改名称匹配变量值的子节点
- javascript - 使用反引号,在多行中编写代码,但仍然在同一行打印字符串
- symfony - 与现有实体的多对一关系
- c# - 在 Blazor 项目中使用 api 的网格中的特定行出现问题
- python - opencv中是否有可以检测下图中曲线的功能?
- android - 如何设置 Firebase OTP 数字的限制,例如 6 到 4?
- c# - 为什么我在打开然后关闭窗口上的菜单时收到 InvalidCastException?
- python - 在 __init__ raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
- augmented-reality - ArSession_update 需要很多时间
- node.js - 意外的令牌o