![JAR search and dependency download from the Maven repository](/logo.png)
org.bdware.ypkdeploy.HTTPTool Maven / Gradle / Ivy
The newest version!
package org.bdware.ypkdeploy;
import com.google.gson.*;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.bdware.client.ResultCallback;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.zz.gmhelper.SM2KeyPair;
import org.zz.gmhelper.SM2Util;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class HTTPTool {
final static String TAG = "[HTTPTool] ";
static class DeployConfig {
public boolean asDebug;
String agentAddress;
// common config
JsonElement createParam;
String killBeforeStart;
String privateKey;
String publicKey;
String ypkPath;
int remoteDebugPort;
int chunkSize;
}
public static void deployWithYpk(String deployConfigPath, String ypkPath) {
DeployConfig config = null;
try {
config = new Gson().fromJson(new FileReader(deployConfigPath), DeployConfig.class);
} catch (Exception e) {
e.printStackTrace();
System.out.println(TAG + " parse config failed!");
}
config.ypkPath = ypkPath;
deployUseHttp(config);
restart(config);
}
public static void deploy(String path) {
DeployConfig config = null;
File f = new File(path);
try {
if (f.isDirectory()) {
File[] files = f.listFiles((f2) -> f2.getName().endsWith(".json"));
if (files != null) for (File file : files)
deploy(file.getAbsolutePath());
return;
} else {
config = new Gson().fromJson(new FileReader(path), DeployConfig.class);
deployUseHttp(config);
restart(config);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(TAG + " parse config failed!");
}
}
private static void restart(DeployConfig config) {
SM2KeyPair keyPair = SM2KeyPair.fromJson(new Gson().toJson(config));
SmartContractClientExt ext = new SmartContractClientExt(String.format("ws://%s/SCIDE/SCExecutor", config.agentAddress), keyPair);
ext.waitForConnect();
ext.login();
for (; !ext.isLoggedIn; )
Thread.yield();
AtomicInteger counter = new AtomicInteger(0);
try {
if (config.killBeforeStart != null) ext.kill(config.killBeforeStart, new ResultCallback() {
@Override
public void onResult(JsonObject r) {
System.out.println(TAG + r);
counter.incrementAndGet();
}
});
for (; counter.get() == 0; )
Thread.yield();
;
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
File f = new File(config.ypkPath);
List fileNames = new ArrayList<>();
String contractName = f.getName().replaceAll(".zip", "").replaceAll(".ypk", "");
ext.listProjects(true, new ResultCallback() {
@Override
public void onResult(JsonObject r) {
JsonArray array = JsonParser.parseString(r.get("data").getAsString()).getAsJsonArray();
for (JsonElement je : array) {
String fileName = je.getAsString();
if (fileName.startsWith(contractName)) fileNames.add(fileName);
}
counter.incrementAndGet();
}
});
for (; counter.get() == 1; )
Thread.yield();
Collections.sort(fileNames, new Comparator() {
@Override
public int compare(String o1, String o2) {
return getCount(o2, contractName) - getCount(o1, contractName);
}
});
System.out.println(TAG + "startContract:" + fileNames.get(0));
if (config.asDebug) {
ext.startContractAsDebug(fileNames.get(0), config.createParam, config.remoteDebugPort, new ResultCallback() {
@Override
public void onResult(JsonObject r) {
System.out.println(TAG + r);
counter.incrementAndGet();
}
});
} else {
ext.startContract(fileNames.get(0), config.createParam, config.remoteDebugPort, new ResultCallback() {
@Override
public void onResult(JsonObject r) {
System.out.println(TAG + r);
System.out.println(TAG + "access: " + config.agentAddress);
counter.incrementAndGet();
}
});
}
for (; counter.get() == 2; )
Thread.yield();
}
public static int getCount(String dirName, String contractName) {
String sub = dirName.substring(contractName.length());
if (sub.startsWith("_")) {
return Integer.valueOf(sub.substring(1));
} else return -1;
}
public static void deployUseHttp(DeployConfig config) {
String url = "http://%s/Upload?%s&sign=%s";
File file = new File(config.ypkPath);
String argWithoutSig = "path=%s&fileName=%s&isPrivate=true&order=%d&count=%d&pubKey=%s";
SM2KeyPair keyPair;
try {
keyPair = SM2KeyPair.fromJson(String.format("{\"publicKey\":\"%s\",\"privateKey\":\"%s\"}", config.publicKey, config.privateKey));
} catch (Exception e) {
System.out.println("[HttpTool] parse key error:\n" + String.format("{\"publicKey\":\"%s\",\"privateKey\":\"%s\"}", config.publicKey, config.privateKey));
e.printStackTrace();
return;
}
String pubKey = keyPair.getPublicKeyStr();
int trunc = 1000 * 1024;
if (config.chunkSize > 10)
trunc = config.chunkSize;
byte[] buff = new byte[trunc];
int order = 0;
int count = (int) ((file.length() - 1) / (trunc)) + 1;
CloseableHttpClient client = HttpClients.createDefault();
try {
FileInputStream fin = new FileInputStream(file);
for (int len = 0; (len = fin.read(buff)) > 0; order++) {
String arg = String.format(argWithoutSig, "./", file.getName(), order, count, pubKey);
String sign = ByteUtils.toHexString(SM2Util.sign(keyPair.getPrivateKeyParameter(), arg.getBytes(StandardCharsets.UTF_8)));
String urlStr = String.format(url, config.agentAddress, arg, sign);
HttpPost httpPost = new HttpPost(urlStr);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
if (len == trunc)
builder.addBinaryBody("file", buff, ContentType.APPLICATION_OCTET_STREAM, file.getName());
else {
byte[] bu = new byte[len];
System.arraycopy(buff, 0, bu, 0, len);
builder.addBinaryBody("file", bu, ContentType.APPLICATION_OCTET_STREAM, file.getName());
}
HttpEntity multipart = builder.build();
httpPost.setEntity(multipart);
CloseableHttpResponse response = client.execute(httpPost);
ByteArrayOutputStream bo = new ByteArrayOutputStream();
response.getEntity().writeTo(bo);
System.out.println(TAG + +order + "/" + count + " " + bo);
}
} catch (IOException | CryptoException e) {
e.printStackTrace();
} finally {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy