Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
io.github.ydq.jquery.JQuery Maven / Gradle / Ivy
package io.github.ydq.jquery;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.Charset;
import java.security.cert.X509Certificate;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
public class JQuery {
private static final String EMPTY = "";
public enum Method {
GET, POST, PUT, DELETE
}
@AllArgsConstructor
public enum ContentType {
FORMDATA("application/x-www-form-urlencoded"), JSON("application/json"), XML("application/xml");
@Getter
String meta;
}
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
public static class JQueryResponse {
@Getter
@Setter
Integer code;
@Getter
Boolean status;
@Getter
byte[] data;
@Getter
@Setter
Map> headers;
@Getter
String error;
public JQueryResponse(Boolean status,Integer code, byte[] data,Map> headers) {
this.status = status;
this.code = code;
this.data = data;
this.headers = headers;
}
public JQueryResponse(Boolean status, String error) {
this.status = status;
this.error = error;
}
public String content() {
return content(Charset.forName(CHARSET.get()));
}
public String content(Charset charset) {
if (this.data == null) {
return null;
}
return new String(this.data, charset);
}
public Map cookie() {
if (this.headers != null) {
List cookieStrs = headers.get("Set-Cookie");
if (cookieStrs != null && cookieStrs.size() > 0) {
var cookie = new HashMap();
cookieStrs.stream().filter(JQuery::isNotBlank).forEach(str -> {
var cookieKV = str.split(";")[0].trim().split("=");
cookie.put(cookieKV[0], cookieKV[1]);
});
return cookie;
}
}
return Collections.emptyMap();
}
public void then(@NonNull Consumer consumer) {
consumer.accept(this);
}
public R then(@NonNull Function func) {
return func.apply(this);
}
}
private static ThreadLocal CHARSET = ThreadLocal.withInitial(() -> "UTF-8");
private static ThreadLocal USER_AGENT = ThreadLocal.withInitial(() -> "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko");
private static ThreadLocal TIMEOUT = ThreadLocal.withInitial(() -> 5000);
private static ThreadLocal METHOD = ThreadLocal.withInitial(() -> Method.GET);
private static ThreadLocal CONTENT_TYPE = ThreadLocal.withInitial(() -> ContentType.FORMDATA);
private static ThreadLocal> HEADER = ThreadLocal.withInitial(HashMap::new);
private static ThreadLocal> COOKIE = ThreadLocal.withInitial(HashMap::new);
private static ThreadLocal DEBUG = ThreadLocal.withInitial(() -> Boolean.FALSE);
private static Boolean isBlank(CharSequence cs) {
int csLen;
if (cs == null || (csLen = cs.length()) == 0) {
return Boolean.TRUE;
}
for (int i = 0; i < csLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return Boolean.FALSE;
}
}
return Boolean.TRUE;
}
private static Boolean isNotBlank(CharSequence cs) {
return !isBlank(cs);
}
public static class $ {
public static JQueryResponse get(@NonNull String url) {
return get(url, EMPTY, null);
}
public static JQueryResponse get(@NonNull String url, @NonNull FormData formData) {
return get(url, formData.toString(), null);
}
public static JQueryResponse get(@NonNull String url, @NonNull FormData formData, Consumer consumer) {
return get(url, formData.toString(), consumer);
}
public static JQueryResponse get(@NonNull String url, String data) {
return get(url, data, null);
}
public static JQueryResponse get(@NonNull String url, Consumer consumer) {
return get(url, EMPTY, consumer);
}
public static JQueryResponse get(@NonNull String url, String data, Consumer consumer) {
return ajax(url, data, consumer);
}
public static JQueryResponse post(@NonNull String url) {
return post(url, EMPTY, null);
}
public static JQueryResponse post(@NonNull String url, @NonNull FormData formData) {
return post(url, formData.toString(), null);
}
public static JQueryResponse post(@NonNull String url, @NonNull FormData formData, Consumer consumer) {
return post(url, formData.toString(), consumer);
}
public static JQueryResponse post(@NonNull String url, String data) {
return post(url, data, null);
}
public static JQueryResponse post(@NonNull String url, Consumer consumer) {
return post(url, EMPTY, consumer);
}
public static JQueryResponse post(@NonNull String url, String data, Consumer consumer) {
method(Method.POST);
return ajax(url, data, consumer);
}
public static JQueryResponse ajax(String url, FormData data, Consumer consumer) {
contentType(ContentType.FORMDATA);
return ajax(url, data.toString(), consumer);
}
public static JQueryResponse ajax(@NonNull String url, String data, Consumer consumer) {
if (METHOD.get() == Method.GET && !isBlank(data)) {
url += url.indexOf("?") < 0 ? "?" : "&" + data;
}
JQueryResponse response = null;
try {
response = request(url, data);
} catch (URISyntaxException | IOException | InterruptedException e) {
e.printStackTrace();
response = new JQueryResponse(Boolean.FALSE, e.getMessage());
}
if (consumer != null) {
consumer.accept(response);
}
return response;
}
private static JQueryResponse request(String url, String data) throws URISyntaxException, IOException, InterruptedException {
debug(url, data);
var reqBuilder = HttpRequest.newBuilder(new URI(url));
reqBuilder.timeout(Duration.ofMillis(TIMEOUT.get()));
reqBuilder.header("User-Agent", USER_AGENT.get());
reqBuilder.header("Accept", "text/html,application/xhtml+xml,application/xml,application/json;q=0.9,image/webp,*/*;q=0.8");
reqBuilder.header("Accept-Charset", CHARSET.get());
HEADER.get().forEach(reqBuilder::header);
if (COOKIE.get().size() > 0) {
reqBuilder.header("Cookie", COOKIE.get().entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).collect(Collectors.joining("; ")));
}
if (METHOD.get() == Method.POST || METHOD.get() == Method.PUT) {
reqBuilder.header("Content-Type", CONTENT_TYPE.get().meta + ";charset=" + CHARSET.get());
var bodyPublisher = HttpRequest.BodyPublishers.noBody();
if (!isBlank(data)) {
bodyPublisher = HttpRequest.BodyPublishers.ofByteArray(data.getBytes(CHARSET.get()));
}
if(METHOD.get() == Method.POST){
reqBuilder.POST(bodyPublisher);
} else {
reqBuilder.PUT(bodyPublisher);
}
} else {
reqBuilder.header("Content-Type", "text/html,application/xml,application/json,text/json,image/png,image/jpeg,*/*;charset=" + CHARSET.get());
if(METHOD.get() == Method.GET){
reqBuilder.GET();
} else {
reqBuilder.DELETE();
}
}
var client = HttpClient.newHttpClient();
var resp = client.send(reqBuilder.build(), HttpResponse.BodyHandlers.ofByteArray());
String redirect = resp.headers().firstValue("location").orElseGet(() -> EMPTY);
if(!isBlank(redirect)){
if(resp.statusCode() == 301 || resp.statusCode() ==302 || resp.statusCode() == 303){
$.method(Method.GET);
return request(redirect,EMPTY);
}
if(resp.statusCode() == 307){
return request(redirect,data);
}
}
return new JQueryResponse(Boolean.TRUE,resp.statusCode(),resp.body(),resp.headers().map());
}
public static void charset(String charset) {
CHARSET.set(charset);
}
public static void useragent(String useragent) {
USER_AGENT.set(useragent);
}
public static void timeout(Integer timeout) {
TIMEOUT.set(timeout);
}
public static void method(Method method) {
METHOD.set(method);
}
public static void contentType(ContentType contentType) {
CONTENT_TYPE.set(contentType);
}
public static void header(String name, String value) {
HEADER.get().put(name, value);
}
public static void header(Map header) {
HEADER.get().putAll(header);
}
public static void cookie(String name, String value) {
COOKIE.get().put(name, value);
}
public static void cookie(Map cookie) {
COOKIE.get().putAll(cookie);
}
public static void cookie(String cookieStr) {
if (!isBlank(cookieStr)) {
Arrays.asList(cookieStr.split(";")).forEach(ck -> {
var cookieKV = ck.trim().split("=");
COOKIE.get().put(cookieKV[0], cookieKV[1]);
});
}
}
public static Map cookie() {
return COOKIE.get();
}
public static void debug(Boolean debug) {
DEBUG.set(debug);
}
private static void debug(String url, String data) {
if (DEBUG.get()) {
System.out.println(String.format("\n\n\n>>>>>> URL:\t\t\t%s\n>>>>>> Method:\t\t\t%s\n>>>>>> Param:\t\t\t%s\n>>>>>> Cookie:\t\t\t%s\n>>>>>> ContentType:\t%s\n>>>>>> UserAgent:\t\t%s\n>>>>>> Timeout:\t\t%s\n>>>>>> Header:\t\t\t%s\n\n", url, METHOD.get(), data, COOKIE.get(), CONTENT_TYPE.get().meta, USER_AGENT.get(), TIMEOUT.get(), HEADER.get()));
}
}
}
public static FormData data(String key, Object val) {
return new FormData().append(key, val);
}
public static FormData data(String k1, Object v1, String k2, Object v2) {
return new FormData().append(k1, v1, k2, v2);
}
public static FormData data(String k1, Object v1, String k2, Object v2, String k3, Object v3) {
return new FormData().append(k1, v1, k2, v2, k3, v3);
}
public static FormData data(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4) {
return new FormData().append(k1, v1, k2, v2, k3, v3, k4, v4);
}
public static FormData data(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5) {
return new FormData().append(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5);
}
public static FormData data(Map data) {
return new FormData().append(data);
}
public static class FormData {
private List datas = new ArrayList<>();
public FormData append(String key, Object val) {
if (key != null && key.length() > 0)
datas.add(new Data(key, val));
return this;
}
public FormData append(String k1, Object v1, String k2, Object v2) {
return append(k1, v1).append(k2, v2);
}
public FormData append(String k1, Object v1, String k2, Object v2, String k3, Object v3) {
return append(k1, v1, k2, v2).append(k3, v3);
}
public FormData append(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4) {
return append(k1, v1, k2, v2, k3, v3).append(k4, v4);
}
public FormData append(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5) {
return append(k1, v1, k2, v2, k3, v3, k4, v4).append(k5, v5);
}
public FormData append(Map data) {
data.entrySet().forEach(entry -> append(entry.getKey(), entry.getKey()));
return this;
}
public String toString() {
return datas.size() > 0 ? datas.stream().map(Data::toString).collect(Collectors.joining("&")) : JQuery.EMPTY;
}
@AllArgsConstructor
public class Data {
private String key;
private Object val;
public String toString() {
return key + "=" + (val == null ? "" : val.toString());
}
}
}
private static class SSLTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
}