首页 > 解决方案 > 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 会给出空响应。但是如果删除代码以生成令牌并手动提供它可以工作。即使生成令牌的代码在那里但我使用传入参数的令牌,它仍然是不工作。但是如果我在终端上执行相同的卷曲它工作正常。我花了几个小时来调试。有人可以发光吗?

标签: httpcurlgroovygroovy-console

解决方案


推荐阅读