From 03ebf798ead550e0258851a4eba988c495d0e191 Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Mon, 17 Jun 2024 17:22:00 +0800 Subject: [PATCH 01/20] fix http --- .../java/org/miaixz/bus/core/data/CIN.java | 2 +- .../java/org/miaixz/bus/core/data/ID.java | 3 +- .../java/org/miaixz/bus/core/data/Pid.java | 2 +- .../bus/core/io/source/InflaterSource.java | 32 +- .../miaixz/bus/core/io/source/PeekSource.java | 7 +- .../miaixz/bus/core/io/source/RealSource.java | 3 - .../org/miaixz/bus/core/io/source/Source.java | 4 +- .../bus/core/io/timout/AssignTimeout.java | 2 +- .../bus/core/io/timout/AsyncTimeout.java | 113 +++---- .../miaixz/bus/core/io/timout/Timeout.java | 111 +++---- .../bus/core/io/watch/WatchMonitor.java | 1 - .../java/org/miaixz/bus/core/lang/Symbol.java | 6 + .../bus/core/lang/thread/BlockPolicy.java | 1 - .../core/lang/thread/ConcurrencyTester.java | 5 +- .../bus/core/lang/thread/ExecutorBuilder.java | 2 +- .../core/lang/thread/NamedThreadFactory.java | 179 +++++++--- .../core/lang/thread/SemaphoreRunnable.java | 1 - .../lang/thread/ThreadExecutorBuilder.java | 92 ++++++ .../lang/thread/ThreadFactoryBuilder.java | 4 +- .../thread/threadlocal/EnhanceThread.java | 138 ++++++++ .../thread/threadlocal/FastThreadLocal.java | 251 ++++++++++++++ .../thread/threadlocal/NamedThreadLocal.java | 55 ---- .../thread/threadlocal/ThreadLocalMap.java | 305 ++++++++++++++++++ .../org/miaixz/bus/core/xyz/ClassKit.java | 2 +- .../org/miaixz/bus/core/xyz/ThreadKit.java | 3 +- .../main/java/org/miaixz/bus/http/Httpd.java | 4 +- .../java/org/miaixz/bus/http/RealCall.java | 3 +- .../bus/http/accord/ConnectInterceptor.java | 3 +- .../bus/http/accord/ExchangeFinder.java | 4 +- .../bus/http/accord/RealConnection.java | 4 +- .../miaixz/bus/http/accord/Transmitter.java | 4 +- .../bus/http/cache/CacheInterceptor.java | 3 +- .../miaixz/bus/http/metric/Interceptor.java | 49 +-- .../org/miaixz/bus/http/metric/NewChain.java | 94 +++++- .../http/metric/http/BridgeInterceptor.java | 3 +- .../metric/http/CallServerInterceptor.java | 3 +- .../miaixz/bus/http/metric/http/Hpack.java | 1 - .../bus/http/metric/http/Http2Codec.java | 6 +- .../metric/http/RealInterceptorChain.java | 11 +- .../http/metric/http/RetryAndFollowUp.java | 3 +- .../http/plugin/httpz/FileInterceptor.java | 3 +- 41 files changed, 1180 insertions(+), 342 deletions(-) create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ThreadExecutorBuilder.java create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/EnhanceThread.java create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/FastThreadLocal.java delete mode 100644 bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/NamedThreadLocal.java create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/ThreadLocalMap.java rename bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/NamedInheritableThreadLocal.java => bus-http/src/main/java/org/miaixz/bus/http/metric/NewChain.java (54%) diff --git a/bus-core/src/main/java/org/miaixz/bus/core/data/CIN.java b/bus-core/src/main/java/org/miaixz/bus/core/data/CIN.java index 21b5592c4c..097bb5c00e 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/data/CIN.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/data/CIN.java @@ -269,7 +269,7 @@ private static char getVerifyCode18(final int iSum) { case 3: return '9'; case 2: - return 'X'; + return Symbol.C_X; case 1: return '0'; case 0: diff --git a/bus-core/src/main/java/org/miaixz/bus/core/data/ID.java b/bus-core/src/main/java/org/miaixz/bus/core/data/ID.java index a13ba17a92..3d4d66d5b7 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/data/ID.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/data/ID.java @@ -31,7 +31,6 @@ import org.miaixz.bus.core.lang.Assert; import org.miaixz.bus.core.lang.exception.InternalException; import org.miaixz.bus.core.net.ip.IPv4; -import org.miaixz.bus.core.xyz.RuntimeKit; /** * ID生成器工具类,此工具类中主要封装: @@ -226,7 +225,7 @@ public static long getWorkerId(final long datacenterId, final long maxWorkerId) final StringBuilder mpid = new StringBuilder(); mpid.append(datacenterId); try { - mpid.append(RuntimeKit.getPid()); + mpid.append(Pid.INSTANCE.get()); } catch (final InternalException igonre) { //ignore } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/data/Pid.java b/bus-core/src/main/java/org/miaixz/bus/core/data/Pid.java index f3e656b761..df02463833 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/data/Pid.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/data/Pid.java @@ -59,7 +59,7 @@ public enum Pid { * @return 进程ID * @throws InternalException 进程名称为空 */ - private static int getPid() throws InternalException { + public static int getPid() throws InternalException { final String processName = ManagementFactory.getRuntimeMXBean().getName(); if (StringKit.isBlank(processName)) { throw new InternalException("Process name is blank!"); diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/source/InflaterSource.java b/bus-core/src/main/java/org/miaixz/bus/core/io/source/InflaterSource.java index 04d31160f6..9ea06839f3 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/source/InflaterSource.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/source/InflaterSource.java @@ -39,8 +39,7 @@ import java.util.zip.Inflater; /** - * A source that uses DEFLATE - * to decompress data read from another source. + * 使用DEFLATE 解压缩从另一个源读取的数据的源。 * * @author Kimi Liu * @since Java 17+ @@ -51,9 +50,7 @@ public final class InflaterSource implements Source { private final Inflater inflater; /** - * When we call Inflater.setInput(), the inflater keeps our byte array until - * it needs input again. This tracks how many bytes the inflater is currently - * holding on to. + * 当调用 Inflater.setInput() 时,inflater 会保留字节数组,直到再次需要输入。 */ private int bufferBytesHeldByInflater; private boolean closed; @@ -63,9 +60,11 @@ public InflaterSource(Source source, Inflater inflater) { } /** - * This package-private constructor shares a buffer with its trusted caller. - * In general we can't share a BufferedSource because the inflater holds input - * bytes until they are inflated. + * 此包私有构造函数与其受信任的调用者共享一个缓冲区。 + * 一般来说,我们不能共享 BufferedSource,因为 inflater 会保留输入字节,直到它们被溢出为止。 + * + * @param source 缓冲源 + * @param inflater 缓冲区 */ InflaterSource(BufferSource source, Inflater inflater) { if (source == null) throw new IllegalArgumentException("source == null"); @@ -84,7 +83,7 @@ public long read( while (true) { boolean sourceExhausted = refill(); - // Decompress the inflater's compressed data into the sink. + // 将缓冲区的压缩数据解压到接收器中 try { SectionBuffer tail = sink.writableSegment(1); int toRead = (int) Math.min(byteCount, SectionBuffer.SIZE - tail.limit); @@ -111,9 +110,8 @@ public long read( } /** - * Refills the inflater with compressed data if it needs input. (And only if - * it needs input). Returns true if the inflater required input but the source - * was exhausted. + * 如果需要输入,则用压缩数据重新填充缓冲区。(并且仅在需要输入时才有效) + * 如果缓冲区需要输入但源已耗尽,则返回 true。 */ public boolean refill() throws IOException { if (!inflater.needsInput()) return false; @@ -121,10 +119,12 @@ public boolean refill() throws IOException { releaseInflatedBytes(); if (inflater.getRemaining() != 0) throw new IllegalStateException("?"); - // If there are compressed bytes in the source, assign them to the inflater. - if (source.exhausted()) return true; + // 如果源中有压缩字节,则将它们分配给缓冲区 + if (source.exhausted()) { + return true; + } - // Assign buffer bytes to the inflater. + // 将缓冲区字节分配给缓冲区 SectionBuffer head = source.getBuffer().head; bufferBytesHeldByInflater = head.limit - head.pos; inflater.setInput(head.data, head.pos, bufferBytesHeldByInflater); @@ -132,7 +132,7 @@ public boolean refill() throws IOException { } /** - * When the inflater has processed compressed data, remove it from the buffer. + * 当缓冲区处理完压缩数据后,将其从缓冲区中移除。 */ private void releaseInflatedBytes() throws IOException { if (bufferBytesHeldByInflater == 0) return; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/source/PeekSource.java b/bus-core/src/main/java/org/miaixz/bus/core/io/source/PeekSource.java index 9fd7c53cf5..f8413cb311 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/source/PeekSource.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/source/PeekSource.java @@ -66,8 +66,7 @@ public long read(Buffer sink, long byteCount) throws IOException { if (byteCount < 0) throw new IllegalArgumentException("byteCount < 0: " + byteCount); if (closed) throw new IllegalStateException("closed"); - // Source becomes invalid if there is an expected SectionBuffer and it and the expected position - // do not match the current head and head position of the upstream buffer + // 如果存在 SectionBuffer,并且它的位置与缓冲区的位置不匹配,则源将变为无效 if (expectedSegment != null && (expectedSegment != buffer.head || expectedPos != buffer.head.pos)) { throw new IllegalStateException("Peek source is invalid because upstream source was used"); @@ -76,9 +75,7 @@ public long read(Buffer sink, long byteCount) throws IOException { if (!upstream.request(pos + 1)) return -1L; if (expectedSegment == null && buffer.head != null) { - // Only once the buffer actually holds data should an expected SectionBuffer and position be - // recorded. This allows reads from the peek source to repeatedly return -1 and for data to be - // added later. Unit tests depend on this behavior. + // 只有当缓冲区实际保存数据时,才应记录预期的 SectionBuffer 和位置。 expectedSegment = buffer.head; expectedPos = buffer.head.pos; } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/source/RealSource.java b/bus-core/src/main/java/org/miaixz/bus/core/io/source/RealSource.java index 89193b1439..b561fcacef 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/source/RealSource.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/source/RealSource.java @@ -139,10 +139,8 @@ public int select(SegmentBuffer segmentBuffer) throws IOException { int index = buffer.selectPrefix(segmentBuffer, true); if (index == -1) return -1; if (index == -2) { - // We need to grow the buffer. Do that, then try it all again. if (source.read(buffer, SectionBuffer.SIZE) == -1L) return -1; } else { - // We matched a full byte string: consume it and return it. int selectedSize = segmentBuffer.byteStrings[index].size(); buffer.skip(selectedSize); return index; @@ -172,7 +170,6 @@ public void readFully(byte[] sink) throws IOException { try { require(sink.length); } catch (EOFException e) { - // The underlying source is exhausted. Copy the bytes we got before rethrowing. int offset = 0; while (buffer.size > 0) { int read = buffer.read(sink, offset, (int) buffer.size); diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/source/Source.java b/bus-core/src/main/java/org/miaixz/bus/core/io/source/Source.java index 6b886848fa..a216b0442b 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/source/Source.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/source/Source.java @@ -50,7 +50,7 @@ public interface Source extends Closeable { * @param sink 缓冲 * @param byteCount 长度大小 * @return the long - * @throws IOException {@link IOException} IOException. + * @throws IOException 异常 */ long read(Buffer sink, long byteCount) throws IOException; @@ -65,7 +65,7 @@ public interface Source extends Closeable { * 关闭此源并释放此源持有的资源. * 读取闭源是一个错误。多次关闭源是安全的. * - * @throws IOException {@link IOException} IOException. + * @throws IOException 异常 */ @Override void close() throws IOException; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/timout/AssignTimeout.java b/bus-core/src/main/java/org/miaixz/bus/core/io/timout/AssignTimeout.java index a1c9617d24..f49b8120d4 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/timout/AssignTimeout.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/timout/AssignTimeout.java @@ -48,7 +48,7 @@ public AssignTimeout(Timeout delegate) { } /** - * {@link Timeout} instance to which this instance is currently delegating. + * {@link Timeout} 此实例当前正在委托给的实例 */ public final Timeout delegate() { return delegate; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/timout/AsyncTimeout.java b/bus-core/src/main/java/org/miaixz/bus/core/io/timout/AsyncTimeout.java index 34b637c1d5..4c8f078d29 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/timout/AsyncTimeout.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/timout/AsyncTimeout.java @@ -48,46 +48,41 @@ public class AsyncTimeout extends Timeout { /** - * Don't write more than 64 KiB of data at a time, give or take a segment. Otherwise slow - * connections may suffer timeouts even when they're making (slow) progress. Without this, writing - * a single 1 MiB buffer may never succeed on a sufficiently slow connection. + * 每次写入的数据不得超过 64 KiB,无论大小。 + * 否则,慢速连接即使正在(缓慢)进行,也可能会超时。 + * 如果不这样做,在速度足够慢的连接上,写入单个 1 MiB 缓冲区可能永远不会成功。 */ private static final int TIMEOUT_WRITE_SIZE = 64 * 1024; /** - * Duration for the watchdog thread to be idle before it shuts itself down. + * 守护线程在关闭之前处于空闲状态的持续时间 */ private static final long IDLE_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(60); private static final long IDLE_TIMEOUT_NANOS = TimeUnit.MILLISECONDS.toNanos(IDLE_TIMEOUT_MILLIS); /** - * The watchdog thread processes a linked list of pending timeouts, sorted in the order to be - * triggered. This class synchronizes on AsyncTimeout.class. This lock guards the queue. - * - *
Head's 'next' points to the first element of the linked list. The first element is the next - * node to time out, or null if the queue is empty. The head is null until the watchdog thread is - * started and also after being idle for {@link #IDLE_TIMEOUT_MILLIS}. + * 守护线程处理待处理超时的链接列表,按触发顺序排序。 */ static AsyncTimeout head; /** - * True if this node is currently in the queue. + * 如果此节点当前在队列中,则为 True。 */ private boolean inQueue; /** - * The next node in the linked list. + * 链接列表中的下一个节点。 */ private AsyncTimeout next; /** - * If scheduled, this is the time that the watchdog should time this out. + * 如果已安排好,这是守护线程应该超时的时间。 */ private long timeoutAt; private static synchronized void scheduleTimeout( AsyncTimeout node, long timeoutNanos, boolean hasDeadline) { - // Start the watchdog thread and create the head node when the first timeout is scheduled. + // 在第一次超时安排时启动守护线程并创建头节点 if (head == null) { head = new AsyncTimeout(); new Watchdog().start(); @@ -95,8 +90,7 @@ private static synchronized void scheduleTimeout( long now = System.nanoTime(); if (timeoutNanos != 0 && hasDeadline) { - // Compute the earliest event; either timeout or deadline. Because nanoTime can wrap around, - // Math.min() is undefined for absolute values, but meaningful for relative ones. + // 计算最早的事件;超时或截止时间。由于 nanoTime 可以循环,因此 Math.min() 对于绝对值是未定义的,但对于相对值是有意义的。 node.timeoutAt = now + Math.min(timeoutNanos, node.deadlineNanoTime() - now); } else if (timeoutNanos != 0) { node.timeoutAt = now + timeoutNanos; @@ -106,14 +100,15 @@ private static synchronized void scheduleTimeout( throw new AssertionError(); } - // Insert the node in sorted order. + // 按排序顺序插入节点 long remainingNanos = node.remainingNanos(now); for (AsyncTimeout prev = head; true; prev = prev.next) { if (prev.next == null || remainingNanos < prev.next.remainingNanos(now)) { node.next = prev.next; prev.next = node; if (prev == head) { - AsyncTimeout.class.notify(); // Wake up the watchdog when inserting at the front. + // 前端插入时唤醒守护线程 + AsyncTimeout.class.notify(); } break; } @@ -121,10 +116,13 @@ private static synchronized void scheduleTimeout( } /** - * Returns true if the timeout occurred. + * 如果发生超时则返回 true + * + * @param node + * @return the true/false */ private static synchronized boolean cancelScheduledTimeout(AsyncTimeout node) { - // Remove the node from the linked list. + // 从链接列表中删除该节点 for (AsyncTimeout prev = head; prev != null; prev = prev.next) { if (prev.next == node) { prev.next = node.next; @@ -132,44 +130,40 @@ private static synchronized boolean cancelScheduledTimeout(AsyncTimeout node) { return false; } } - - // The node wasn't found in the linked list: it must have timed out! + // 链接列表中未找到该节点:一定是超时了! return true; } /** - * Removes and returns the node at the head of the list, waiting for it to time out if necessary. - * This returns {@link #head} if there was no node at the head of the list when starting, and - * there continues to be no node after waiting {@code IDLE_TIMEOUT_NANOS}. It returns null if a - * new node was inserted while waiting. Otherwise this returns the node being waited on that has - * been removed. + * 删除并返回列表头部的节点,必要时等待其超时。 + * 如果启动时列表头部没有节点,则返回 {@link #head},并且在等待 {@code IDLE_TIMEOUT_NANOS} 后仍然没有节点。 + * 如果在等待期间插入了新节点,则返回 null。否则,返回正在等待的已被删除的节点。 */ static AsyncTimeout awaitTimeout() throws InterruptedException { - // Get the next eligible node. + // 获取下一个合格节点 AsyncTimeout node = head.next; - // The queue is empty. Wait until either something is enqueued or the idle timeout elapses. + // 队列为空。等待,直到有内容入队或空闲超时结束。 if (node == null) { long startNanos = System.nanoTime(); AsyncTimeout.class.wait(IDLE_TIMEOUT_MILLIS); return head.next == null && (System.nanoTime() - startNanos) >= IDLE_TIMEOUT_NANOS - ? head // The idle timeout elapsed. - : null; // The situation has changed. + ? head // 空闲超时已过 + : null; // 情况已经发生了变化 } long waitNanos = node.remainingNanos(System.nanoTime()); - // The head of the queue hasn't timed out yet. Await that. + // 队头尚未超时。请等待 if (waitNanos > 0) { - // Waiting is made complicated by the fact that we work in nanoseconds, - // but the API wants (millis, nanos) in two arguments. + // 由于我们以纳秒为单位进行工作,因此等待变得复杂,但 API 需要两个参数(毫秒,纳秒)。 long waitMillis = waitNanos / 1000000L; waitNanos -= (waitMillis * 1000000L); AsyncTimeout.class.wait(waitMillis, (int) waitNanos); return null; } - // The head of the queue has timed out. Remove it. + // 队列头部已超时。请将其移除 head.next = node.next; node.next = null; return node; @@ -180,14 +174,17 @@ public final void enter() { long timeoutNanos = timeoutNanos(); boolean hasDeadline = hasDeadline(); if (timeoutNanos == 0 && !hasDeadline) { - return; // No timeout and no deadline? Don't bother with the queue. + // 没有超时和截止期限?不用排队 + return; } inQueue = true; scheduleTimeout(this, timeoutNanos, hasDeadline); } /** - * Returns true if the timeout occurred. + * 如果发生超时则返回 true + * + * @return the true/false */ public final boolean exit() { if (!inQueue) return false; @@ -196,32 +193,29 @@ public final boolean exit() { } /** - * Returns the amount of time left until the time out. This will be negative if the timeout has - * elapsed and the timeout should occur immediately. + * 返回距离超时还剩多少时间。如果超时已过且超时应立即发生,则该值为负数。 */ private long remainingNanos(long now) { return timeoutAt - now; } /** - * Invoked by the watchdog thread when the time between calls to {@link #enter()} and {@link - * #exit()} has exceeded the timeout. + * 当调用 {@link #enter()} 和 {@link #exit()} 之间的时间超出超时时,由守护线程调用。 */ protected void timedOut() { } /** - * Returns a new sink that delegates to {@code sink}, using this to implement timeouts. This works - * best if {@link #timedOut} is overridden to interrupt {@code sink}'s current operation. + * 返回一个委托给 {@code sink} 的新接收器,使用它来实现超时。 + * 如果覆盖 {@link #timedOut} 以中断 {@code sink} 的当前操作,则效果最佳。 */ public final Sink sink(final Sink sink) { return new Sink() { @Override public void write(Buffer source, long byteCount) throws IOException { IoKit.checkOffsetAndCount(source.size, 0, byteCount); - while (byteCount > 0L) { - // Count how many bytes to write. This loop guarantees we split on a segment boundary. + // 计算要写入的字节数。此循环保证我们在段边界上进行分割。 long toWrite = 0L; for (SectionBuffer s = source.head; toWrite < TIMEOUT_WRITE_SIZE; s = s.next) { int segmentSize = s.limit - s.pos; @@ -232,7 +226,7 @@ public void write(Buffer source, long byteCount) throws IOException { } } - // Emit one write. Only this section is subject to the timeout. + // 发出一次写入。只有此部分受超时限制。 boolean throwOnTimeout = false; enter(); try { @@ -288,8 +282,8 @@ public String toString() { } /** - * Returns a new source that delegates to {@code source}, using this to implement timeouts. This - * works best if {@link #timedOut} is overridden to interrupt {@code sink}'s current operation. + * 返回一个委托给 {@code source} 的新源,使用它来实现超时。 + * 如果覆盖 {@link #timedOut} 以中断 {@code sink} 的当前操作,则效果最佳。 */ public final Source source(final Source source) { return new Source() { @@ -335,8 +329,8 @@ public String toString() { } /** - * Throws an IOException if {@code throwOnTimeout} is {@code true} and a timeout occurred. See - * {@link #newTimeoutException(IOException)} for the type of exception thrown. + * 如果 {@code throwOnTimeout} 为 {@code true} 且发生超时,则抛出 IOException。 + * 请参阅 {@link #newTimeoutException(IOException)} 以了解抛出的异常类型。 */ final void exit(boolean throwOnTimeout) throws IOException { boolean timedOut = exit(); @@ -344,9 +338,8 @@ final void exit(boolean throwOnTimeout) throws IOException { } /** - * Returns either {@code cause} or an IOException that's caused by {@code cause} if a timeout - * occurred. See {@link #newTimeoutException(IOException)} for the type of exception - * returned. + * 如果发生超时,则返回 {@code cause} 或由 {@code cause} 引起的 IOException。 + * 有关返回的异常类型,请参阅 {@link #newTimeoutException(IOException)}。 */ final IOException exit(IOException cause) throws IOException { if (!exit()) return cause; @@ -354,9 +347,8 @@ final IOException exit(IOException cause) throws IOException { } /** - * Returns an {@link IOException} to represent a timeout. By default this method returns {@link - * InterruptedIOException}. If {@code cause} is non-null it is set as the cause of the - * returned exception. + * 返回一个 {@link IOException} 来表示超时。默认情况下,此方法返回 {@link InterruptedIOException}。 + * 如果 {@code cause} 非空,则将其设置为返回异常的原因。 */ protected IOException newTimeoutException(IOException cause) { InterruptedIOException e = new InterruptedIOException("timeout"); @@ -368,7 +360,7 @@ protected IOException newTimeoutException(IOException cause) { private static final class Watchdog extends Thread { Watchdog() { - super("Okio Watchdog"); + super("Watchdog"); setDaemon(true); } @@ -379,18 +371,17 @@ public void run() { synchronized (AsyncTimeout.class) { timedOut = awaitTimeout(); - // Didn't find a node to interrupt. Try again. + // 未找到要中断的节点。请重试 if (timedOut == null) continue; - // The queue is completely empty. Let this thread exit and let another watchdog thread - // get created on the next call to scheduleTimeout(). + // 队列完全为空。让此线程退出,并在下次调用 scheduleTimeout() 时创建另一个守护线程。 if (timedOut == head) { head = null; return; } } - // Close the timed out node. + // 关闭超时节点 timedOut.timedOut(); } catch (InterruptedException ignored) { } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/timout/Timeout.java b/bus-core/src/main/java/org/miaixz/bus/core/io/timout/Timeout.java index 48f5de04fa..4755fc9804 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/timout/Timeout.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/timout/Timeout.java @@ -45,7 +45,7 @@ public class Timeout { /** * 既不跟踪也不检测超时的空超时。在不需要超时 - * 的情况下使用它,例如在操作不会阻塞的实现中. + * 的情况下使用它,例如在操作不会阻塞的实现中 */ public static final Timeout NONE = new Timeout() { @Override @@ -61,34 +61,36 @@ public Timeout deadlineNanoTime(long deadlineNanoTime) { @Override public void throwIfReached() { } - }; /** - * True if {@code deadlineNanoTime} is defined. There is no equivalent to null - * or 0 for {@link System#nanoTime}. + * 如果定义了 {@code deadlineNanoTime},则为 True。 + * 对于 {@link System#nanoTime},没有与 null 或 0 等价的值 */ private boolean hasDeadline; + /** + * 截止时间 + */ private long deadlineNanoTime; + /** + * 超时时间 + */ private long timeoutNanos; + /** + * 构建 + */ public Timeout() { - } - static long minTimeout(long aNanos, long bNanos) { - if (aNanos == 0L) return bNanos; - if (bNanos == 0L) return aNanos; - if (aNanos < bNanos) return aNanos; - return bNanos; } /** - * Wait at most {@code timeout} time before aborting an operation. Using a - * per-operation timeout means that as long as forward progress is being made, - * no sequence of operations will fail. + * 最多等待 {@code timeout} 时间,然后中止操作。 + * 使用每个操作超时意味着只要向前推进,任何操作序列都不会失败。 * - *
If {@code timeout == 0}, operations will run indefinitely. (Operating - * system timeouts may still apply.) + * @param timeout 超时时间 + * @param unit 时间单位 + * @return {@link Timeout} */ public Timeout timeout(long timeout, TimeUnit unit) { if (timeout < 0) throw new IllegalArgumentException("timeout < 0: " + timeout); @@ -98,24 +100,23 @@ public Timeout timeout(long timeout, TimeUnit unit) { } /** - * Returns the timeout in nanoseconds, or {@code 0} for no timeout. + * 返回以纳秒为单位的超时时间,或 {@code 0} 表示无超时。 */ public long timeoutNanos() { return timeoutNanos; } /** - * Returns true if a deadline is enabled. + * 如果启用了截止期限,则返回 true */ public boolean hasDeadline() { return hasDeadline; } /** - * Returns the {@linkplain System#nanoTime() nano time} when the deadline will - * be reached. + * 返回截止期限的 {@linkplain System#nanoTime()} * - * @throws IllegalStateException if no deadline is set. + * @throws IllegalStateException 如果没有设定截止时间 */ public long deadlineNanoTime() { if (!hasDeadline) throw new IllegalStateException("No deadline"); @@ -123,9 +124,8 @@ public long deadlineNanoTime() { } /** - * Sets the {@linkplain System#nanoTime() nano time} when the deadline will be - * reached. All operations must complete before this time. Use a deadline to - * set a maximum bound on the time spent on a sequence of operations. + * 设置达到截止期限的 {@linkplain System#nanoTime()} + * 所有操作必须在此时间之前完成。使用截止期限来设置一系列操作所花费时间的最大限度。 */ public Timeout deadlineNanoTime(long deadlineNanoTime) { this.hasDeadline = true; @@ -134,7 +134,11 @@ public Timeout deadlineNanoTime(long deadlineNanoTime) { } /** - * Set a deadline of now plus {@code duration} time. + * 设定现在加上{@code duration} 时间的截止时间 + * + * @param duration 期间 + * @param unit 时间单位 + * @return {@link Timeout} */ public final Timeout deadline(long duration, TimeUnit unit) { if (duration <= 0) throw new IllegalArgumentException("duration <= 0: " + duration); @@ -143,7 +147,7 @@ public final Timeout deadline(long duration, TimeUnit unit) { } /** - * Clears the timeout. Operating system timeouts may still apply. + * 清除超时 */ public Timeout clearTimeout() { this.timeoutNanos = 0; @@ -151,7 +155,7 @@ public Timeout clearTimeout() { } /** - * Clears the deadline. + * 清除最后期限 */ public Timeout clearDeadline() { this.hasDeadline = false; @@ -159,13 +163,13 @@ public Timeout clearDeadline() { } /** - * Throws an {@link InterruptedIOException} if the deadline has been reached or if the current - * thread has been interrupted. This method doesn't detect timeouts; that should be implemented to - * asynchronously abort an in-progress operation. + * 如果已达到截止时间或当前线程已中断,则抛出 {@link InterruptedIOException}。 + * 此方法不检测超时;应实施超时以异步中止正在进行的操作 */ public void throwIfReached() throws IOException { if (Thread.interrupted()) { - Thread.currentThread().interrupt(); // Retain interrupted status. + // 保留中断状态 + Thread.currentThread().interrupt(); throw new InterruptedIOException("interrupted"); } @@ -175,40 +179,12 @@ public void throwIfReached() throws IOException { } /** - * Waits on {@code monitor} until it is notified. Throws {@link InterruptedIOException} if either - * the thread is interrupted or if this timeout elapses before {@code monitor} is notified. The - * caller must be synchronized on {@code monitor}. - * - *
Here's a sample class that uses {@code waitUntilNotified()} to await a specific state. Note - * that the call is made within a loop to avoid unnecessary waiting and to mitigate spurious - * notifications.
{@code - * - * class Dice { - * Random random = new Random(); - * int latestTotal; - * - * public synchronized void roll() { - * latestTotal = 2 + random.nextInt(6) + random.nextInt(6); - * System.out.println("Rolled " + latestTotal); - * notifyAll(); - * } - * - * public void rollAtFixedRate(int period, TimeUnit timeUnit) { - * Executors.newScheduledThreadPool(0).scheduleAtFixedRate(new Runnable() { - * public void run() { - * roll(); - * } - * }, 0, period, timeUnit); - * } + * 等待 {@code monitor} 直到收到通知。 + * 如果线程中断或在 {@code monitor} 收到通知之前超时,则抛出 {@link InterruptedIOException}。 + * 调用者必须在 {@code monitor} 上同步。 * - * public synchronized void awaitTotal(Timeout timeout, int total) - * throws InterruptedIOException { - * while (latestTotal != total) { - * timeout.waitUntilNotified(this); - * } - * } - * } - * }+ * @param monitor 监视器 + * @throws InterruptedIOException 异常 */ public final void waitUntilNotified(Object monitor) throws InterruptedIOException { try { @@ -216,11 +192,12 @@ public final void waitUntilNotified(Object monitor) throws InterruptedIOExceptio long timeoutNanos = timeoutNanos(); if (!hasDeadline && timeoutNanos == 0L) { - monitor.wait(); // There is no timeout: wait forever. + // 没有超时:永远等待 + monitor.wait(); return; } - // Compute how long we'll wait. + // 计算一下要等待多久 long waitNanos; long start = System.nanoTime(); if (hasDeadline && timeoutNanos != 0) { @@ -232,7 +209,7 @@ public final void waitUntilNotified(Object monitor) throws InterruptedIOExceptio waitNanos = timeoutNanos; } - // Attempt to wait that long. This will break out early if the monitor is notified. + // 尝试等待那么长时间。如果监视器收到通知,这将提前触发 long elapsedNanos = 0L; if (waitNanos > 0L) { long waitMillis = waitNanos / 1000000L; @@ -240,7 +217,7 @@ public final void waitUntilNotified(Object monitor) throws InterruptedIOExceptio elapsedNanos = System.nanoTime() - start; } - // Throw if the timeout elapsed before the monitor was notified. + // 如果在监视器收到通知之前已经超时,则抛出 if (elapsedNanos >= waitNanos) { throw new InterruptedIOException("timeout"); } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/watch/WatchMonitor.java b/bus-core/src/main/java/org/miaixz/bus/core/io/watch/WatchMonitor.java index d3bbe15007..564814b14d 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/watch/WatchMonitor.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/watch/WatchMonitor.java @@ -40,7 +40,6 @@ /** * 路径监听器 - *
* 监听器可监听目录或文件 * 如果监听的Path不存在,则递归创建空目录然后监听此空目录 * 递归监听目录时,并不会监听新创建的目录 diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/Symbol.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/Symbol.java index 635899c1c5..02e925fb30 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/Symbol.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/Symbol.java @@ -141,6 +141,12 @@ public class Symbol { public static final char C_U_TEN = '拾'; public static final String U_TEN = Normal.EMPTY + C_U_TEN; + /** + * 符号: X + */ + public static final char C_X = 'X'; + public static final String X = Normal.EMPTY + C_X; + /** * 符号: 逗号 */ diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/BlockPolicy.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/BlockPolicy.java index f9d9383caf..aa3addd8a2 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/BlockPolicy.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/BlockPolicy.java @@ -78,7 +78,6 @@ public void rejectedExecution(final Runnable r, final ThreadPoolExecutor e) { // 当设置了关闭时候的处理 handlerwhenshutdown.accept(r); } - // 线程池关闭后,丢弃任务 } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ConcurrencyTester.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ConcurrencyTester.java index 8c03239bbb..1976fd5d1d 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ConcurrencyTester.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ConcurrencyTester.java @@ -36,13 +36,11 @@ * 高并发测试工具类 * *
- * ps: - * //模拟1000个线程并发 + * 模拟1000个线程并发 * ConcurrencyTester ct = new ConcurrencyTester(1000); * ct.test(() -> { * // 需要并发测试的业务代码 * }); - * * Console.logger(ct.getInterval()); * ct.close(); *@@ -51,6 +49,7 @@ * @since Java 17+ */ public class ConcurrencyTester implements Closeable { + private final SyncFinisher sf; private final StopWatch timeInterval; private long interval; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ExecutorBuilder.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ExecutorBuilder.java index 8a32df1c1c..8bb9364cb8 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ExecutorBuilder.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ExecutorBuilder.java @@ -47,11 +47,11 @@ */ public class ExecutorBuilder implements Builder
* 1. 自定义线程命名前缀 * 2. 自定义是否守护线程 @@ -48,25 +51,40 @@ public class NamedThreadFactory implements ThreadFactory { /** - * 命名前缀 + * 线程名称前缀 */ - private final String prefix; + protected final String prefix; /** * 线程组 */ - private final ThreadGroup group; + protected final ThreadGroup group; /** - * 线程组 + * 是否守护线程 */ - private final AtomicInteger threadNumber = new AtomicInteger(1); + protected final boolean daemon; /** - * 是否守护线程 + * 线程的优先级 */ - private final boolean isDaemon; + protected final int priority; + /** + * 线程池中的线程ID + */ + protected final AtomicInteger nextId = new AtomicInteger(1); /** * 无法捕获的异常统一处理 */ - private final UncaughtExceptionHandler handler; + protected final UncaughtExceptionHandler handler; + + /** + * 构造 + */ + public NamedThreadFactory() { + this(null, null, Thread.NORM_PRIORITY); + } + + public NamedThreadFactory(Class> clazz) { + this(clazz, null, Thread.NORM_PRIORITY); + } /** * 构造 @@ -74,72 +92,147 @@ public class NamedThreadFactory implements ThreadFactory { * @param prefix 线程名前缀 */ public NamedThreadFactory(String prefix) { - this(prefix, true); + this(null, prefix, Thread.NORM_PRIORITY); + } + + /** + * 构造 + * + * @param prefix 线程名前缀 + * @param priority 优先级 + */ + public NamedThreadFactory(final Class> clazz, String prefix, int priority) { + this(clazz, prefix, true, priority); + } + + /** + * 构造 + * + * @param prefix 线程名前缀 + * @param daemon 是否守护线程 + */ + public NamedThreadFactory(final String prefix, final boolean daemon) { + this(null, prefix, null, daemon, Thread.NORM_PRIORITY); } /** * 构造 * * @param prefix 线程名前缀 - * @param isDaemon 是否守护线程 + * @param daemon 是否守护线程 + * @param priority 优先级 */ - public NamedThreadFactory(final String prefix, final boolean isDaemon) { - this(prefix, null, isDaemon); + public NamedThreadFactory(final Class> clazz, final String prefix, final boolean daemon, int priority) { + this(clazz, prefix, null, daemon, priority); } /** * 构造 * - * @param prefix 线程名前缀 - * @param threadGroup 线程组,可以为null - * @param isDaemon 是否守护线程 + * @param prefix 线程名前缀 + * @param group 线程组,可以为null + * @param daemon 是否守护线程 */ - public NamedThreadFactory(final String prefix, final ThreadGroup threadGroup, final boolean isDaemon) { - this(prefix, threadGroup, isDaemon, null); + public NamedThreadFactory(final String prefix, final ThreadGroup group, final boolean daemon) { + this(null, prefix, group, daemon, Thread.NORM_PRIORITY, null); } /** * 构造 * - * @param prefix 线程名前缀 - * @param threadGroup 线程组,可以为null - * @param isDaemon 是否守护线程 - * @param handler 未捕获异常处理 - */ - public NamedThreadFactory(final String prefix, ThreadGroup threadGroup, final boolean isDaemon, final UncaughtExceptionHandler handler) { - this.prefix = StringKit.isBlank(prefix) ? "X" : prefix; - if (null == threadGroup) { - threadGroup = ThreadKit.currentThreadGroup(); + * @param prefix 线程名前缀 + * @param group 线程组,可以为null + * @param daemon 是否守护线程 + * @param priority 优先级 + */ + public NamedThreadFactory(final Class> clazz, final String prefix, final ThreadGroup group, final boolean daemon, int priority) { + this(clazz, prefix, group, daemon, priority, null); + } + + /** + * 构造 + * + * @param prefix 线程名前缀 + * @param group 线程组,可以为null + * @param daemon 是否守护线程 + * @param handler 未捕获异常处理 + */ + public NamedThreadFactory(final String prefix, ThreadGroup group, final boolean daemon, final UncaughtExceptionHandler handler) { + this(null, prefix, group, daemon, Thread.NORM_PRIORITY, handler); + } + + /** + * 构造 + * + * @param prefix 线程名前缀 + * @param group 线程组,可以为null + * @param daemon 是否守护线程 + * @param priority 优先级 + * @param handler 未捕获异常处理 + */ + public NamedThreadFactory(final Class> clazz, final String prefix, ThreadGroup group, final boolean daemon, int priority, final UncaughtExceptionHandler handler) { + if (priority < Thread.MIN_PRIORITY || priority > Thread.MAX_PRIORITY) { + throw new IllegalArgumentException( + "priority: " + priority + " (expected: Thread.MIN_PRIORITY <= priority <= Thread.MAX_PRIORITY)"); + } + + if (ObjectKit.isEmpty(clazz) && StringKit.isEmpty(prefix)) { + // 线程前缀,两者都为空使用默认值 + this.prefix = Symbol.X; + } else { + // 线程前缀,默认使用prefix,反之使用clazz + this.prefix = StringKit.isBlank(prefix) ? ClassKit.getClassName(clazz, true) : prefix; } - this.group = threadGroup; - this.isDaemon = isDaemon; + + if (null == group) { + // 当前线程组 + group = Thread.currentThread().getThreadGroup(); + } + this.group = group; + this.daemon = daemon; + this.priority = priority; this.handler = handler; } + /** + * 构造一个新的未启动线程来运行给定的可运行对象 + * + * @param r 由新线程实例执行的可运行对象 + * @return 新新线程信息 + */ @Override public Thread newThread(final Runnable r) { - final Thread t = new Thread(this.group, r, StringKit.format("{}{}", prefix, threadNumber.getAndIncrement())); - - //守护线程 + final Thread t = this.newThread(r, StringKit.format("{}{}", this.prefix, this.nextId.getAndIncrement())); + // 守护线程 if (!t.isDaemon()) { - if (isDaemon) { + if (this.daemon) { // 原线程为非守护则设置为守护 t.setDaemon(true); } - } else if (!isDaemon) { + } else if (!this.daemon) { // 原线程为守护则还原为非守护 t.setDaemon(false); } - //异常处理 - if (null != this.handler) { - t.setUncaughtExceptionHandler(handler); + if (t.getPriority() != this.priority) { + t.setPriority(this.priority); } - //优先级 - if (Thread.NORM_PRIORITY != t.getPriority()) { - // 标准优先级 - t.setPriority(Thread.NORM_PRIORITY); + + // 异常处理 + if (null != this.handler) { + t.setUncaughtExceptionHandler(this.handler); } return t; } + /** + * 构造一个新的未启动线程来运行给定的可运行对象 + * + * @param r 由新线程实例执行的可运行对象 + * @param name 线程名称 + * @return 新新线程信息 + */ + protected Thread newThread(Runnable r, String name) { + return new EnhanceThread(this.group, r, name); + } + } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/SemaphoreRunnable.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/SemaphoreRunnable.java index 41f8aa758c..ddb648b434 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/SemaphoreRunnable.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/SemaphoreRunnable.java @@ -31,7 +31,6 @@ /** * 带有信号量控制的{@link Runnable} 接口抽象实现 - * ** 通过设置信号量,可以限制可以访问某些资源(物理或逻辑的)线程数目。 * 例如:设置信号量为2,表示最多有两个线程可以同时执行方法逻辑,其余线程等待,直到此线程逻辑执行完毕 diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ThreadExecutorBuilder.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ThreadExecutorBuilder.java new file mode 100644 index 0000000000..f5cb58a4c4 --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ThreadExecutorBuilder.java @@ -0,0 +1,92 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +package org.miaixz.bus.core.lang.thread; + +import java.util.concurrent.*; + +/** + * 类比 {@link java.util.concurrent.Executors} + * + * @author Kimi Liu + * @since Java 17+ + */ +public class ThreadExecutorBuilder { + + /** + * 创建一个线程数固定(corePoolSize==maximumPoolSize)的线程池 + * 核心线程会一直存在,不被回收 + * 如果一个核心线程由于异常跪了,会新创建一个线程 + * 无界队列LinkedBlockingQueue + * + * @param corePoolSize 要保留在池中的线程数,即使它们是空闲的 + * @param prefix 线程名前缀 + */ + public static Executor newFixedFastThread(final int corePoolSize, final String prefix) { + return new ThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(), new NamedThreadFactory(prefix)); + } + + /** + * corePoolSize==0 + * maximumPoolSize==Integer.MAX_VALUE + * 队列:SynchronousQueue + * 创建一个线程池:当池中的线程都处于忙碌状态时,会立即新建一个线程来处理新来的任务 + * 这种池将会在执行许多耗时短的异步任务的时候提高程序的性能 + * 60秒钟内没有使用的线程将会被中止,并且从线程池中移除,因此几乎不必担心耗费资源 + * + * @param prefix 线程名前缀 + */ + public static Executor newCachedFastThread(final String prefix) { + return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>(), + new NamedThreadFactory(prefix)); + } + + /** + * 用给定的初始参数创建一个新的Executor + * + * @param corePoolSize 要保留在池中的线程数,即使它们是空闲的 + * @param maximumPoolSize 池中允许的最大线程数 + * @param keepAliveTime 当线程数大于核心时,这是多余空闲线程在终止前等待新任务的最大时间。 + * @param unit keepAliveTime参数的时间单位 + * @param workQueue 任务执行之前用于保存任务的队列。此队列将仅保存由execute方法提交的可运行任务。 + * @param prefix 线程名前缀 + * @param handler 由于达到线程边界和队列容量而阻塞执行时使用的处理程序 + * @return {@link Executor} + */ + public static Executor newLimitedFastThread(final int corePoolSize, + final int maximumPoolSize, + final long keepAliveTime, + final TimeUnit unit, + final BlockingQueue
workQueue, + final String prefix, + final RejectedExecutionHandler handler) { + return new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, + new NamedThreadFactory(prefix), handler); + } + +} \ No newline at end of file diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ThreadFactoryBuilder.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ThreadFactoryBuilder.java index a6c5fff3b4..bd20c6e095 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ThreadFactoryBuilder.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/ThreadFactoryBuilder.java @@ -83,8 +83,8 @@ public static ThreadFactoryBuilder of() { * @return {@link ThreadFactory} */ private static ThreadFactory build(final ThreadFactoryBuilder builder) { - final ThreadFactory backingThreadFactory = (null != builder.backingThreadFactory)// - ? builder.backingThreadFactory // + final ThreadFactory backingThreadFactory = (null != builder.backingThreadFactory) + ? builder.backingThreadFactory : Executors.defaultThreadFactory(); final String namePrefix = builder.namePrefix; final Boolean daemon = builder.daemon; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/EnhanceThread.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/EnhanceThread.java new file mode 100644 index 0000000000..ed413c6bca --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/EnhanceThread.java @@ -0,0 +1,138 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +package org.miaixz.bus.core.lang.thread.threadlocal; + +/** + * 特殊的 {@link Thread},提供对 {@link FastThreadLocal} 变量的快速访问。 + * + * @author Kimi Liu + * @since Java 17+ + */ +public class EnhanceThread extends Thread { + + /** + * 变量数据结构 + */ + private ThreadLocalMap threadLocalMap; + + /** + * 构造 + */ + public EnhanceThread() { + } + + /** + * 构造 + * + * @param name 线程名称 + */ + public EnhanceThread(String name) { + super(name); + } + + /** + * 构造 + * + * @param r 由新线程实例执行的可运行对象 + */ + public EnhanceThread(Runnable r) { + super(r); + } + + /** + * 构造 + * + * @param r 由新线程实例执行的可运行对象 + * @param name 线程名称 + */ + public EnhanceThread(Runnable r, String name) { + super(r, name); + } + + /** + * 构造 + * + * @param group 线程组 + * @param name 线程名称 + */ + public EnhanceThread(ThreadGroup group, String name) { + super(group, name); + } + + /** + * 构造 + * + * @param group 线程组 + * @param r 由新线程实例执行的可运行对象 + */ + public EnhanceThread(ThreadGroup group, Runnable r) { + super(group, r); + } + + /** + * 构造 + * + * @param group 线程组 + * @param r 由新线程实例执行的可运行对象 + * @param name 线程名称 + */ + public EnhanceThread(ThreadGroup group, Runnable r, String name) { + super(group, r, name); + } + + /** + * 构造 + * + * @param group 线程组 + * @param r 由新线程实例执行的可运行对象 + * @param name 线程名称 + * @param stackSize 线程所需的堆栈大小 + */ + public EnhanceThread(ThreadGroup group, Runnable r, String name, long stackSize) { + super(group, r, name, stackSize); + } + + /** + * 返回将线程局部变量绑定到此线程的内部数据结构。 + * 请注意,此方法仅供内部使用,因此随时可能发生变化。 + */ + public final ThreadLocalMap getThreadLocalMap() { + return threadLocalMap; + } + + /** + * 设置将线程局部变量绑定到此线程的内部数据结构。 + * 请注意,此方法仅供内部使用,因此随时可能发生变化。 + * + * @param threadLocalMap 变量数据结构 + */ + public final void setThreadLocalMap(ThreadLocalMap threadLocalMap) { + this.threadLocalMap = threadLocalMap; + } + +} \ No newline at end of file diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/FastThreadLocal.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/FastThreadLocal.java new file mode 100644 index 0000000000..59f3359600 --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/FastThreadLocal.java @@ -0,0 +1,251 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +package org.miaixz.bus.core.lang.thread.threadlocal; + +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.Set; + +/** + * {@link ThreadLocal} 的一个特殊变体 + * 当从 {@link EnhanceThread} 访问时,可产生更高的访问性能。 + * {@link EnhanceThread} 使用数组中的常量索引(而不是使用哈希码和哈希表)来查找变量。 + * 虽然看似非常微妙,但它比使用哈希表具有轻微的性能优势,并且在频繁访问时很有用。 + * + * @author Kimi Liu + * @since Java 17+ + */ +public class FastThreadLocal { + + /** + * 索引 + */ + private final int index; + + /** + * 构造 + */ + public FastThreadLocal() { + index = ThreadLocalMap.nextVariableIndex(); + } + + /** + * 返回绑定到当前线程的线程局部变量的数量 + */ + public static int size() { + ThreadLocalMap threadLocalMap = ThreadLocalMap.getIfSet(); + if (threadLocalMap == null) { + return 0; + } else { + return threadLocalMap.size(); + } + } + + /** + * 删除与当前线程绑定的所有 {@link FastThreadLocal} 变量。 + * 当处于容器环境中,并且不想将线程局部变量留在未管理的线程中时,此操作非常有用 + */ + public static void removeAll() { + // 1. 获取当前线程的ThreadLocalMap,如果当前的ThreadLocalMap为null,则直接返回 + ThreadLocalMap threadLocalMap = ThreadLocalMap.getIfSet(); + if (threadLocalMap == null) { + return; + } + + try { + // 2. 从indexedVariable[VARIABLES_TO_REMOVE_INDEX]获取目前ThreadLocalMap存储的有效的FastThreadLocal的值,之后遍历Set,进行remove操作 + // 注意:这也是为什么会将有效的FastThreadLocal存储在一个Set中的原因(另外,如果没有Set >这个集合的话,我们需要直接去遍历整个indexedVariables数组,可能其中有效的并不多,影响效率) + Object v = threadLocalMap.indexedVariable(ThreadLocalMap.VARIABLES_TO_REMOVE_INDEX); + if (v != null && v != ThreadLocalMap.UNSET) { + Set > variablesToRemove = (Set >) v; + // 这里为什么需要将set先转换为数组? + // 因为set的for-remove模式会报并发修改异常,array不会 + FastThreadLocal>[] variablesToRemoveArray = + variablesToRemove.toArray(new FastThreadLocal[variablesToRemove.size()]); + for (FastThreadLocal> tlv : variablesToRemoveArray) { + tlv.remove(threadLocalMap); + } + } + } finally { + // 3. 删除当前线程的 ThreadLocalMap + ThreadLocalMap.remove(); + } + } + + /** + * 销毁保存所有从非 {@link EnhanceThread} 访问的 {@link FastThreadLocal} 变量的数据结构 + * 当处于容器环境中,并且不想将线程局部变量留在未管理的线程中时,此操作非常有用。 + * 当应用程序从容器中卸载时,请调用此方法。 + */ + public static void destroy() { + ThreadLocalMap.destroy(); + } + + /** + * 将当前的FastThreadLocal添加到indexedVariable[variableToRemoveIndex]位置上的Set >中 + * + * @param threadLocalMap 内部数据结构 + * @param variable 环境变量 + */ + private static void addToVariablesToRemove(ThreadLocalMap threadLocalMap, FastThreadLocal> variable) { + // 1、首先从InternalThreadLocalMap获取Set,如果存在,直接往Set里添加值FastThreadLocal; + // 如果不存在,则先创建一个Set,然后将创建的Set添加到InternalThreadLocalMap中,最后将FastThreadLocal添加到这个Set中 + Object v = threadLocalMap.indexedVariable(ThreadLocalMap.VARIABLES_TO_REMOVE_INDEX); + // Set中的FastThreadLocal可能有多个类型,所以此处的泛型使用?,而不是用指定的V + Set > variablesToRemove; + if (v == ThreadLocalMap.UNSET || v == null) { + variablesToRemove = Collections.newSetFromMap(new IdentityHashMap<>()); + threadLocalMap.setIndexedVariable(ThreadLocalMap.VARIABLES_TO_REMOVE_INDEX, variablesToRemove); + } else { + variablesToRemove = (Set >) v; + } + + variablesToRemove.add(variable); + } + + /** + * 从要移除的变量中删除数据 + * + * @param threadLocalMap 内部数据结构 + * @param variable 环境变量 + */ + private static void removeFromVariablesToRemove(ThreadLocalMap threadLocalMap, FastThreadLocal> variable) { + Object v = threadLocalMap.indexedVariable(ThreadLocalMap.VARIABLES_TO_REMOVE_INDEX); + + if (v == ThreadLocalMap.UNSET || v == null) { + return; + } + + Set > variablesToRemove = (Set >) v; + variablesToRemove.remove(variable); + } + + /** + * 获取当前线程的ThreadLocalMap中的当前线程的value + */ + public final V get() { + // 1. 获取ThreadLocalMap + ThreadLocalMap threadLocalMap = ThreadLocalMap.get(); + // 2. 从ThreadLocalMap获取索引为index的value,如果该索引处的value是有效值,不是占位值,则直接返回 + Object v = threadLocalMap.indexedVariable(index); + if (v != ThreadLocalMap.UNSET) { + return (V) v; + } + // 3. indexedVariable[index]没有设置有效值,执行初始化操作,获取初始值 + return initialize(threadLocalMap); + } + + /** + * 设置当前线程的值 + * + * @param value 线程值 + */ + public final void set(V value) { + // 如果value是UNSET,表示删除当前的ThreadLocal对应的value; + // 如果不是UNSET,则可能是修改,也可能是新增; + // 如果是修改,修改value结束后返回, + // 如果是新增,则先新增value,然后新增ThreadLocal到Set中,最后注册Cleaner清除线程 + if (value == null || value == ThreadLocalMap.UNSET) { + // 如果设置的值是UNSET,表示清除该FastThreadLocal的value + remove(); + } else { + ThreadLocalMap threadLocalMap = ThreadLocalMap.get(); + if (threadLocalMap.setIndexedVariable(index, value)) { + addToVariablesToRemove(threadLocalMap, this); + } + } + } + + /** + * 清除当前的ThreadLocal + */ + public final void remove() { + remove(ThreadLocalMap.getIfSet()); + } + + /** + * 将指定线程本地映射的值设置为未初始化 + * 对 get() 的继续调用将触发对 initialValue() 的调用 + * 指定的线程本地映射必须适用于当前线程。 + */ + public final void remove(ThreadLocalMap threadLocalMap) { + if (threadLocalMap == null) { + return; + } + // 1. 从 ThreadLocalMap 中删除当前的FastThreadLocal对应的value + Object v = threadLocalMap.removeIndexedVariable(index); + // 2. 从 ThreadLocalMap 中的Set >中删除当前的FastThreadLocal + removeFromVariablesToRemove(threadLocalMap, this); + // 3. 如果删除的是有效值,则进行onRemove方法的回调 + if (v != ThreadLocalMap.UNSET) { + try { + onRemoval((V) v); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + /** + * 初始化参数 + * 由子类重写 + */ + protected V initialValue() { + return null; + } + + /** + * 当此线程局部变量被{@link #remove()}删除时的回调 + * 由子类重写 + */ + protected void onRemoval(V value) { + + } + + /** + * 初始化 + * + * @param threadLocalMap 内部数据结构 + * @return 当前线程的值 + */ + private V initialize(ThreadLocalMap threadLocalMap) { + V v; + try { + // 1. 获取初始值 + v = initialValue(); + } catch (Exception e) { + throw new RuntimeException(e); + } + // 2. 设置value到InternalThreadLocalMap中 + threadLocalMap.setIndexedVariable(index, v); + // 3. 添加当前的FastThreadLocal到ThreadLocalMap的Set >中 + addToVariablesToRemove(threadLocalMap, this); + return v; + } + +} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/NamedThreadLocal.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/NamedThreadLocal.java deleted file mode 100644 index 4034bb9eaa..0000000000 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/NamedThreadLocal.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - ~ ~ - ~ The MIT License (MIT) ~ - ~ ~ - ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ - ~ ~ - ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ - ~ of this software and associated documentation files (the "Software"), to deal ~ - ~ in the Software without restriction, including without limitation the rights ~ - ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ - ~ copies of the Software, and to permit persons to whom the Software is ~ - ~ furnished to do so, subject to the following conditions: ~ - ~ ~ - ~ The above copyright notice and this permission notice shall be included in ~ - ~ all copies or substantial portions of the Software. ~ - ~ ~ - ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ - ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ - ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ - ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ - ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ - ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ - ~ THE SOFTWARE. ~ - ~ ~ - ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - */ -package org.miaixz.bus.core.lang.thread.threadlocal; - -/** - * 带有Name标识的 {@link ThreadLocal},调用toString返回name - * - * @param 值类型 - * @author Kimi Liu - * @since Java 17+ - */ -public class NamedThreadLocal extends ThreadLocal { - - private final String name; - - /** - * 构造 - * - * @param name 名字 - */ - public NamedThreadLocal(final String name) { - this.name = name; - } - - @Override - public String toString() { - return this.name; - } - -} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/ThreadLocalMap.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/ThreadLocalMap.java new file mode 100644 index 0000000000..9d6f038115 --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/ThreadLocalMap.java @@ -0,0 +1,305 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +package org.miaixz.bus.core.lang.thread.threadlocal; + +import org.miaixz.bus.core.lang.Normal; + +import java.util.Arrays; +import java.util.BitSet; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 存储所有 {@link EnhanceThread} 的 {@link ThreadLocal} 变量的内部数据结构。 + * 请注意,此类仅供内部使用。除非知道自己在做什么,否则请使用 {@link EnhanceThread} + * + * @author Kimi Liu + * @since Java 17+ + */ +public final class ThreadLocalMap { + + /** + * 无效的value值(占位符),不使用null做无效值的原因是因为netty认为null也是一个有效值, + * 例如:假设没有重写FastThreadLocal的initialValue()方法,则该方法返回为null,会将null作为有效值直接存储起来 + */ + public static final Object UNSET = new Object(); + /** + * 线程缓存 + */ + private static final ThreadLocal SLOW_THREAD_LOCAL_MAP = new ThreadLocal<>(); + /** + * 下一索引 + */ + private static final AtomicInteger NEXT_INDEX = new AtomicInteger(); + /** + * 要删除的变量索引 + */ + public static final int VARIABLES_TO_REMOVE_INDEX = nextVariableIndex(); + /** + * 索引变量 {@link FastThreadLocal} + * index就是FastThreadLocal的唯一索引index + * value是相对应的FastThreadLocal所要存储的值 + */ + private Object[] indexedVariables; + /** + * BitSet简要原理: + * BitSet默认底层数据结构是一个long[]数组,开始时长度为1,即只有long[0],而一个long有64bit。 + * 当BitSet.set(1)的时候,表示将long[0]的第二位设置为true,即0000 0000 ... 0010(64bit),则long[0]==2 + * 当BitSet.get(1)的时候,第二位为1,则表示true;如果是0,则表示false + * 当BitSet.set(64)的时候,表示设置第65位,此时long[0]已经不够用了,扩容处long[1]来,进行存储 + * + * 存储类似 {index:boolean} 键值对,用于防止一个FastThreadLocal多次启动清理线程 + * 将index位置的bit设为true,表示该InternalThreadLocalMap中对该FastThreadLocal已经启动了清理线程 + */ + private BitSet cleanerFlags; + + /** + * 构造 + * 创建indexedVariables数组,并将每一个元素初始化为UNSET + */ + private ThreadLocalMap() { + indexedVariables = newIndexedVariableTable(); + } + + /** + * 获取ThreadLocalMap实例 + * + * @return {@link ThreadLocalMap} + */ + public static ThreadLocalMap get() { + Thread thread = Thread.currentThread(); + if (thread instanceof EnhanceThread) { + return fastGet((EnhanceThread) thread); + } else { + return slowGet(); + } + } + + /** + * 获取hreadLocalMap实例,如果为null会创建新的;如果不为null,也直接返回 + * + * @param thread 快速访问变量 + * @return {@link ThreadLocalMap} + */ + private static ThreadLocalMap fastGet(EnhanceThread thread) { + ThreadLocalMap threadLocalMap = thread.getThreadLocalMap(); + if (threadLocalMap == null) { + thread.setThreadLocalMap(threadLocalMap = new ThreadLocalMap()); + } + return threadLocalMap; + } + + /** + * 获取当前线程信息 + * + * @return {@link ThreadLocalMap} + */ + private static ThreadLocalMap slowGet() { + ThreadLocalMap ret = SLOW_THREAD_LOCAL_MAP.get(); + if (ret == null) { + ret = new ThreadLocalMap(); + SLOW_THREAD_LOCAL_MAP.set(ret); + } + return ret; + } + + /** + * 获取当前线程信息 + * + * @return {@link ThreadLocalMap} + */ + public static ThreadLocalMap getIfSet() { + Thread thread = Thread.currentThread(); + if (thread instanceof EnhanceThread) { + return ((EnhanceThread) thread).getThreadLocalMap(); + } + return SLOW_THREAD_LOCAL_MAP.get(); + } + + /** + * 删除当前线程的ThreadLocalMap + */ + public static void remove() { + Thread thread = Thread.currentThread(); + if (thread instanceof EnhanceThread) { + ((EnhanceThread) thread).setThreadLocalMap(null); + } else { + SLOW_THREAD_LOCAL_MAP.remove(); + } + } + + /** + * 销毁线程信息 + */ + public static void destroy() { + SLOW_THREAD_LOCAL_MAP.remove(); + } + + /** + * 获取FastThreadLocal的唯一索引 + * + * @return the int + */ + public static int nextVariableIndex() { + int index = NEXT_INDEX.getAndIncrement(); + if (index < 0) { + NEXT_INDEX.decrementAndGet(); + throw new IllegalStateException("too many thread-local indexed variables"); + } + return index; + } + + /** + * 新的索引变量表 + * + * @return the object + */ + private static Object[] newIndexedVariableTable() { + Object[] array = new Object[Normal._32]; + Arrays.fill(array, UNSET); + return array; + } + + /** + * 当前线程大小 + * + * @return the int + */ + public int size() { + int count = 0; + Object v = indexedVariable(VARIABLES_TO_REMOVE_INDEX); + if (v != null && v != UNSET) { + Set
> variablesToRemove = (Set >) v; + count += variablesToRemove.size(); + } + return count; + } + + /** + * 是否索引变量集 + * + * @param index 索引 + * @return the true/false + */ + public boolean isIndexedVariableSet(int index) { + Object[] lookup = indexedVariables; + return index < lookup.length && lookup[index] != UNSET; + } + + /** + * 获取指定位置的元素 + * + * @param index 索引 + * @return the object + */ + public Object indexedVariable(int index) { + Object[] lookup = indexedVariables; + return index < lookup.length ? lookup[index] : UNSET; + } + + /** + * 设置索引变量 + * + * @param index 索引 + * @param value 变量值 + * @return @code true} 当且仅当创建了新的线程局部变量时 + */ + public boolean setIndexedVariable(int index, Object value) { + Object[] lookup = indexedVariables; + if (index < lookup.length) { + Object oldValue = lookup[index]; + lookup[index] = value; + return oldValue == UNSET; + } else { + expandIndexedVariableTableAndSet(index, value); + return true; + } + } + + /** + * 删除指定位置的对象 + * + * @param index 索引 + * @return the object + */ + public Object removeIndexedVariable(int index) { + Object[] lookup = indexedVariables; + if (index < lookup.length) { + Object v = lookup[index]; + lookup[index] = UNSET; + return v; + } else { + return UNSET; + } + } + + /** + * 设置当前索引位置index(FastThreadLocal)的bit为1 + */ + public void setCleanerFlags(int index) { + if (cleanerFlags == null) { + cleanerFlags = new BitSet(); + } + cleanerFlags.set(index); + } + + /** + * 获取 当前index的bit值,1表示true,0表示false(默认值) + */ + public boolean isCleanerFlags(int index) { + return cleanerFlags != null && cleanerFlags.get(index); + } + + /** + * 展开索引变量表和集合 + * + * @param index 索引 + * @param value 索引值 + */ + private void expandIndexedVariableTableAndSet(int index, Object value) { + Object[] oldArray = indexedVariables; + final int oldCapacity = oldArray.length; + int newCapacity = index; + newCapacity |= newCapacity >>> 1; + newCapacity |= newCapacity >>> 2; + newCapacity |= newCapacity >>> 4; + newCapacity |= newCapacity >>> 8; + newCapacity |= newCapacity >>> 16; + newCapacity++; + + // 创建新数组并拷贝旧数组的元素到新数组 + Object[] newArray = Arrays.copyOf(oldArray, newCapacity); + // 初始化扩容出来的部分的元素 + Arrays.fill(newArray, oldCapacity, newArray.length, UNSET); + // 设置变量 + newArray[index] = value; + // 将新数组设置给成员变量 + indexedVariables = newArray; + } + +} \ No newline at end of file diff --git a/bus-core/src/main/java/org/miaixz/bus/core/xyz/ClassKit.java b/bus-core/src/main/java/org/miaixz/bus/core/xyz/ClassKit.java index 51ac146ee6..d1d4de3cdd 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/xyz/ClassKit.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/xyz/ClassKit.java @@ -146,7 +146,7 @@ public static String getClassName(final Object obj, final boolean isSimple) { * 例如:ClassKit这个类 * * - * isSimple为false: "reflect.core.org.miaixz.bus.ClassKit" + * isSimple为false: "org.miaixz.bus.ClassKit" * isSimple为true: "ClassKit" ** diff --git a/bus-core/src/main/java/org/miaixz/bus/core/xyz/ThreadKit.java b/bus-core/src/main/java/org/miaixz/bus/core/xyz/ThreadKit.java index 40ba271aeb..ac18ba6b68 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/xyz/ThreadKit.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/xyz/ThreadKit.java @@ -655,8 +655,7 @@ public static Thread getMainThread() { * @return 线程组 */ public static ThreadGroup currentThreadGroup() { - final SecurityManager s = System.getSecurityManager(); - return (null != s) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); + return Thread.currentThread().getThreadGroup(); } /** diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Httpd.java b/bus-http/src/main/java/org/miaixz/bus/http/Httpd.java index 8b401ec4bc..2196882c9f 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Httpd.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Httpd.java @@ -141,7 +141,7 @@ public Exchange exchange(Response response) { final Listinterceptors; /** * 返回观察单个网络请求和响应的不可变拦截器列表。这些拦截器必须 - * 调用{@link Interceptor.Chain#proceed} 只执行一次:网络拦截器短路或重复网络请求是错误的 + * 调用{@link NewChain#proceed} 只执行一次:网络拦截器短路或重复网络请求是错误的 */ final List networkInterceptors; final EventListener.Factory eventListenerFactory; @@ -897,7 +897,7 @@ public Builder addInterceptor(Interceptor interceptor) { /** * 返回观察单个网络请求和响应的可修改的拦截器列表。 - * 这些拦截器必须调用{@link Interceptor.Chain#proceed} + * 这些拦截器必须调用{@link NewChain#proceed} * 只执行一次:网络拦截器短路或重复网络请求是错误的 * * @return 构造器 diff --git a/bus-http/src/main/java/org/miaixz/bus/http/RealCall.java b/bus-http/src/main/java/org/miaixz/bus/http/RealCall.java index a0158fc100..571f3d4b68 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/RealCall.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/RealCall.java @@ -35,6 +35,7 @@ import org.miaixz.bus.http.cache.CacheInterceptor; import org.miaixz.bus.http.metric.Interceptor; import org.miaixz.bus.http.metric.NamedRunnable; +import org.miaixz.bus.http.metric.NewChain; import org.miaixz.bus.http.metric.http.BridgeInterceptor; import org.miaixz.bus.http.metric.http.CallServerInterceptor; import org.miaixz.bus.http.metric.http.RealInterceptorChain; @@ -172,7 +173,7 @@ public Response getResponseWithInterceptorChain() throws IOException { } interceptors.add(new CallServerInterceptor(forWebSocket)); - Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter, null, 0, + NewChain chain = new RealInterceptorChain(interceptors, transmitter, null, 0, originalRequest, this, client.connectTimeoutMillis(), client.readTimeoutMillis(), client.writeTimeoutMillis()); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java index 90ef973f60..dfe130d440 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java @@ -32,6 +32,7 @@ import org.miaixz.bus.http.Request; import org.miaixz.bus.http.Response; import org.miaixz.bus.http.metric.Interceptor; +import org.miaixz.bus.http.metric.NewChain; import org.miaixz.bus.http.metric.http.RealInterceptorChain; import java.io.IOException; @@ -51,7 +52,7 @@ public ConnectInterceptor(Httpd httpd) { } @Override - public Response intercept(Chain chain) throws IOException { + public Response intercept(NewChain chain) throws IOException { RealInterceptorChain realChain = (RealInterceptorChain) chain; Request request = realChain.request(); Transmitter transmitter = realChain.transmitter(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/ExchangeFinder.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/ExchangeFinder.java index f49b1f06f0..b63d7140b6 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/ExchangeFinder.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/ExchangeFinder.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.metric.EventListener; -import org.miaixz.bus.http.metric.Interceptor; +import org.miaixz.bus.http.metric.NewChain; import org.miaixz.bus.http.metric.http.HttpCodec; import java.io.IOException; @@ -83,7 +83,7 @@ final class ExchangeFinder { } public HttpCodec find( - Httpd client, Interceptor.Chain chain, boolean doExtensiveHealthChecks) { + Httpd client, NewChain chain, boolean doExtensiveHealthChecks) { int connectTimeout = chain.connectTimeoutMillis(); int readTimeout = chain.readTimeoutMillis(); int writeTimeout = chain.writeTimeoutMillis(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java index 52936f878c..cbd62ca6cd 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java @@ -39,8 +39,8 @@ import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.platform.Platform; import org.miaixz.bus.http.metric.EventListener; -import org.miaixz.bus.http.metric.Interceptor; import org.miaixz.bus.http.metric.Internal; +import org.miaixz.bus.http.metric.NewChain; import org.miaixz.bus.http.metric.http.*; import org.miaixz.bus.http.secure.CertificatePinner; import org.miaixz.bus.http.socket.Handshake; @@ -555,7 +555,7 @@ public boolean supportsUrl(UnoUrl url) { return true; } - HttpCodec newCodec(Httpd client, Interceptor.Chain chain) throws SocketException { + HttpCodec newCodec(Httpd client, NewChain chain) throws SocketException { if (http2Connection != null) { return new Http2Codec(client, this, chain, http2Connection); } else { diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/Transmitter.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/Transmitter.java index d5cd0adc2e..f6252ecdbb 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/Transmitter.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/Transmitter.java @@ -33,8 +33,8 @@ import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.platform.Platform; import org.miaixz.bus.http.metric.EventListener; -import org.miaixz.bus.http.metric.Interceptor; import org.miaixz.bus.http.metric.Internal; +import org.miaixz.bus.http.metric.NewChain; import org.miaixz.bus.http.metric.http.HttpCodec; import org.miaixz.bus.http.secure.CertificatePinner; @@ -162,7 +162,7 @@ private Address createAddress(UnoUrl url) { /** * Returns a new exchange to carry a new request and response. */ - Exchange newExchange(Interceptor.Chain chain, boolean doExtensiveHealthChecks) { + Exchange newExchange(NewChain chain, boolean doExtensiveHealthChecks) { synchronized (connectionPool) { if (noMoreExchanges) { throw new IllegalStateException("released"); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java index 742e8e885e..fd3d1a2036 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java @@ -41,6 +41,7 @@ import org.miaixz.bus.http.bodys.RealResponseBody; import org.miaixz.bus.http.metric.Interceptor; import org.miaixz.bus.http.metric.Internal; +import org.miaixz.bus.http.metric.NewChain; import org.miaixz.bus.http.metric.http.HttpCodec; import java.io.IOException; @@ -129,7 +130,7 @@ static boolean isContentSpecificHeader(String fieldName) { } @Override - public Response intercept(Chain chain) throws IOException { + public Response intercept(NewChain chain) throws IOException { Response cacheCandidate = null != cache ? cache.get(chain.request()) : null; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/Interceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/Interceptor.java index 1989bd4f9c..a9b929b76d 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/Interceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/Interceptor.java @@ -27,13 +27,9 @@ */ package org.miaixz.bus.http.metric; -import org.miaixz.bus.http.NewCall; -import org.miaixz.bus.http.Request; import org.miaixz.bus.http.Response; -import org.miaixz.bus.http.accord.Connection; import java.io.IOException; -import java.util.concurrent.TimeUnit; /** * 观察、修改和潜在的短路请求,并返回相应的响应 @@ -44,38 +40,21 @@ */ public interface Interceptor { - Response intercept(Chain chain) throws IOException; + /** + * 网络请求拦截 + * + * @param chain 网络调用链 + * @return {@link Response} + * @throws IOException 异常 + */ + Response intercept(NewChain chain) throws IOException; + + /** + * 说明该拦截器实现的作用 + * 方便其他业务场景或者服务使用,例如链路追踪等 + */ + default void instructions() { - interface Chain { - - /** - * @return 网络请求 - */ - Request request(); - - Response proceed(Request request) throws IOException; - - /** - * 返回将执行请求的连接。这只在网络拦截器链中可用; - * 对于应用程序拦截器,这总是null - * - * @return 连接信息 - */ - Connection connection(); - - NewCall call(); - - int connectTimeoutMillis(); - - Chain withConnectTimeout(int timeout, TimeUnit unit); - - int readTimeoutMillis(); - - Chain withReadTimeout(int timeout, TimeUnit unit); - - int writeTimeoutMillis(); - - Chain withWriteTimeout(int timeout, TimeUnit unit); } } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/NamedInheritableThreadLocal.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/NewChain.java similarity index 54% rename from bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/NamedInheritableThreadLocal.java rename to bus-http/src/main/java/org/miaixz/bus/http/metric/NewChain.java index f5187e4c7f..d8230a2d94 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/NamedInheritableThreadLocal.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/NewChain.java @@ -25,31 +25,97 @@ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */ -package org.miaixz.bus.core.lang.thread.threadlocal; +package org.miaixz.bus.http.metric; + +import org.miaixz.bus.http.NewCall; +import org.miaixz.bus.http.Request; +import org.miaixz.bus.http.Response; +import org.miaixz.bus.http.accord.Connection; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; /** - * 带有Name标识的 {@link InheritableThreadLocal},调用toString返回name + * 网络调用链 * - * @param 值类型 * @author Kimi Liu * @since Java 17+ */ -public class NamedInheritableThreadLocal extends InheritableThreadLocal { +public interface NewChain { + + /** + * @return 网络请求 + */ + Request request(); + + /** + * @param request 网络请求 + * @return {@link Response} + * @throws IOException 异常 + */ + Response proceed(Request request) throws IOException; + + /** + * 返回将执行请求的连接。这只在网络拦截器链中可用; + * 对于应用程序拦截器,这总是null + * + * @return 连接信息 + */ + Connection connection(); + + /** + * 实际调用准备执行的请求 + * + * @return {@link NewCall} + */ + NewCall call(); + + /** + * 连接超时时间 + * + * @return the int + */ + int connectTimeoutMillis(); - private final String name; + /** + * 设置连接超时时间 + * + * @param timeout 超时时间 + * @param unit 单位 + * @return {@link NewChain} + */ + NewChain withConnectTimeout(int timeout, TimeUnit unit); /** - * 构造 + * 读操作超时时间 * - * @param name 名字 + * @return the int */ - public NamedInheritableThreadLocal(final String name) { - this.name = name; - } + int readTimeoutMillis(); - @Override - public String toString() { - return this.name; - } + /** + * 配置读操作超时时间 + * + * @param timeout 超时时间 + * @param unit 单位 + * @return {@link NewChain} + */ + NewChain withReadTimeout(int timeout, TimeUnit unit); + + /** + * 写操作超时时间 + * + * @return the int + */ + int writeTimeoutMillis(); + + /** + * 配置写操作超时时间 + * + * @param timeout 超时时间 + * @param unit 单位 + * @return {@link NewChain} + */ + NewChain withWriteTimeout(int timeout, TimeUnit unit); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java index 88b32209e0..fcdd9649f7 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java @@ -38,6 +38,7 @@ import org.miaixz.bus.http.bodys.RequestBody; import org.miaixz.bus.http.metric.CookieJar; import org.miaixz.bus.http.metric.Interceptor; +import org.miaixz.bus.http.metric.NewChain; import java.io.IOException; import java.util.List; @@ -58,7 +59,7 @@ public BridgeInterceptor(CookieJar cookieJar) { } @Override - public Response intercept(Chain chain) throws IOException { + public Response intercept(NewChain chain) throws IOException { Request request = chain.request(); Request.Builder requestBuilder = request.newBuilder(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java index 3b723a87a6..400d4f9ba9 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java @@ -36,6 +36,7 @@ import org.miaixz.bus.http.Response; import org.miaixz.bus.http.accord.Exchange; import org.miaixz.bus.http.metric.Interceptor; +import org.miaixz.bus.http.metric.NewChain; import java.io.IOException; import java.net.ProtocolException; @@ -56,7 +57,7 @@ public CallServerInterceptor(boolean forWebSocket) { } @Override - public Response intercept(Chain chain) throws IOException { + public Response intercept(NewChain chain) throws IOException { RealInterceptorChain realChain = (RealInterceptorChain) chain; Exchange exchange = realChain.exchange(); Request request = realChain.request(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java index 2fe39d80fb..056cc55528 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java @@ -44,7 +44,6 @@ /** * 读写HPACK v10. - * * 这个实现为动态表使用一个数组,为索引条目使用一个列表。 * 动态条目被添加到数组中,从最后一个位置开始向前移动。当数组填满时,它被加倍. * diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java index 1dfb48c48b..763ed4857d 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java @@ -34,8 +34,8 @@ import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.RealConnection; -import org.miaixz.bus.http.metric.Interceptor; import org.miaixz.bus.http.metric.Internal; +import org.miaixz.bus.http.metric.NewChain; import java.io.IOException; import java.net.ProtocolException; @@ -77,7 +77,7 @@ public class Http2Codec implements HttpCodec { Header.ENCODING, Header.UPGRADE); - private final Interceptor.Chain chain; + private final NewChain chain; private final RealConnection realConnection; private final Http2Connection connection; private final Protocol protocol; @@ -85,7 +85,7 @@ public class Http2Codec implements HttpCodec { private volatile boolean canceled; public Http2Codec(Httpd client, RealConnection realConnection, - Interceptor.Chain chain, Http2Connection connection) { + NewChain chain, Http2Connection connection) { this.realConnection = realConnection; this.chain = chain; this.connection = connection; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RealInterceptorChain.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RealInterceptorChain.java index f7fc07c782..d3f19f81c4 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RealInterceptorChain.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RealInterceptorChain.java @@ -35,6 +35,7 @@ import org.miaixz.bus.http.accord.Exchange; import org.miaixz.bus.http.accord.Transmitter; import org.miaixz.bus.http.metric.Interceptor; +import org.miaixz.bus.http.metric.NewChain; import java.io.IOException; import java.util.List; @@ -42,12 +43,12 @@ /** * 承载整个拦截器链的具体拦截器链: - * 所有应用程序拦截器、Httpd核心、所有网络拦截器,最后是网络调用者. + * 所有应用程序拦截器、Http核心、所有网络拦截器,最后是网络调用者. * * @author Kimi Liu * @since Java 17+ */ -public class RealInterceptorChain implements Interceptor.Chain { +public class RealInterceptorChain implements NewChain { private final List
interceptors; private final Transmitter transmitter; @@ -85,7 +86,7 @@ public int connectTimeoutMillis() { } @Override - public Interceptor.Chain withConnectTimeout(int timeout, TimeUnit unit) { + public NewChain withConnectTimeout(int timeout, TimeUnit unit) { int millis = Builder.checkDuration("timeout", timeout, unit); return new RealInterceptorChain(interceptors, transmitter, exchange, index, request, call, millis, readTimeout, writeTimeout); @@ -97,7 +98,7 @@ public int readTimeoutMillis() { } @Override - public Interceptor.Chain withReadTimeout(int timeout, TimeUnit unit) { + public NewChain withReadTimeout(int timeout, TimeUnit unit) { int millis = Builder.checkDuration("timeout", timeout, unit); return new RealInterceptorChain(interceptors, transmitter, exchange, index, request, call, connectTimeout, millis, writeTimeout); @@ -109,7 +110,7 @@ public int writeTimeoutMillis() { } @Override - public Interceptor.Chain withWriteTimeout(int timeout, TimeUnit unit) { + public NewChain withWriteTimeout(int timeout, TimeUnit unit) { int millis = Builder.checkDuration("timeout", timeout, unit); return new RealInterceptorChain(interceptors, transmitter, exchange, index, request, call, connectTimeout, readTimeout, millis); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java index 8b8e57fe3a..75ad6c4e3b 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java @@ -37,6 +37,7 @@ import org.miaixz.bus.http.bodys.RequestBody; import org.miaixz.bus.http.metric.Interceptor; import org.miaixz.bus.http.metric.Internal; +import org.miaixz.bus.http.metric.NewChain; import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.SSLPeerUnverifiedException; @@ -70,7 +71,7 @@ public RetryAndFollowUp(Httpd httpd) { } @Override - public Response intercept(Chain chain) throws IOException { + public Response intercept(NewChain chain) throws IOException { Request request = chain.request(); RealInterceptorChain realChain = (RealInterceptorChain) chain; Transmitter transmitter = realChain.transmitter(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/FileInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/FileInterceptor.java index d619c5419f..1cee6f4ba1 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/FileInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/FileInterceptor.java @@ -36,6 +36,7 @@ import org.miaixz.bus.http.Response; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.metric.Interceptor; +import org.miaixz.bus.http.metric.NewChain; import java.io.IOException; @@ -48,7 +49,7 @@ public abstract class FileInterceptor implements Interceptor, ProgressListener { @Override - public Response intercept(Chain chain) throws IOException { + public Response intercept(NewChain chain) throws IOException { Response rsp = chain.proceed(chain.request()); return rsp.newBuilder() .body(new DownloadFileProgressResponseBody(rsp.body(), this)) From 2c66d17ddc3290ffb06b3c6ec0696556feecf6fd Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Tue, 18 Jun 2024 10:15:32 +0800 Subject: [PATCH 02/20] fix ThreadLocal --- .../thread/threadlocal/FastThreadLocal.java | 8 ++++---- ...{EnhanceThread.java => SpecificThread.java} | 18 +++++++++--------- .../thread/threadlocal/ThreadLocalMap.java | 18 +++++++++--------- 3 files changed, 22 insertions(+), 22 deletions(-) rename bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/{EnhanceThread.java => SpecificThread.java} (89%) diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/FastThreadLocal.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/FastThreadLocal.java index 59f3359600..8dc89f5c7e 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/FastThreadLocal.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/FastThreadLocal.java @@ -33,8 +33,8 @@ /** * {@link ThreadLocal} 的一个特殊变体 - * 当从 {@link EnhanceThread} 访问时,可产生更高的访问性能。 - * {@link EnhanceThread} 使用数组中的常量索引(而不是使用哈希码和哈希表)来查找变量。 + * 当从 {@link SpecificThread} 访问时,可产生更高的访问性能。 + * {@link SpecificThread} 使用数组中的常量索引(而不是使用哈希码和哈希表)来查找变量。 * 虽然看似非常微妙,但它比使用哈希表具有轻微的性能优势,并且在频繁访问时很有用。 * * @author Kimi Liu @@ -51,7 +51,7 @@ public class FastThreadLocal { * 构造 */ public FastThreadLocal() { - index = ThreadLocalMap.nextVariableIndex(); + this.index = ThreadLocalMap.nextVariableIndex(); } /** @@ -98,7 +98,7 @@ public static void removeAll() { } /** - * 销毁保存所有从非 {@link EnhanceThread} 访问的 {@link FastThreadLocal} 变量的数据结构 + * 销毁保存所有从非 {@link SpecificThread} 访问的 {@link FastThreadLocal} 变量的数据结构 * 当处于容器环境中,并且不想将线程局部变量留在未管理的线程中时,此操作非常有用。 * 当应用程序从容器中卸载时,请调用此方法。 */ diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/EnhanceThread.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/SpecificThread.java similarity index 89% rename from bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/EnhanceThread.java rename to bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/SpecificThread.java index ed413c6bca..4b1a57ee74 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/EnhanceThread.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/SpecificThread.java @@ -33,7 +33,7 @@ * @author Kimi Liu * @since Java 17+ */ -public class EnhanceThread extends Thread { +public class SpecificThread extends Thread { /** * 变量数据结构 @@ -43,7 +43,7 @@ public class EnhanceThread extends Thread { /** * 构造 */ - public EnhanceThread() { + public SpecificThread() { } /** @@ -51,7 +51,7 @@ public EnhanceThread() { * * @param name 线程名称 */ - public EnhanceThread(String name) { + public SpecificThread(String name) { super(name); } @@ -60,7 +60,7 @@ public EnhanceThread(String name) { * * @param r 由新线程实例执行的可运行对象 */ - public EnhanceThread(Runnable r) { + public SpecificThread(Runnable r) { super(r); } @@ -70,7 +70,7 @@ public EnhanceThread(Runnable r) { * @param r 由新线程实例执行的可运行对象 * @param name 线程名称 */ - public EnhanceThread(Runnable r, String name) { + public SpecificThread(Runnable r, String name) { super(r, name); } @@ -80,7 +80,7 @@ public EnhanceThread(Runnable r, String name) { * @param group 线程组 * @param name 线程名称 */ - public EnhanceThread(ThreadGroup group, String name) { + public SpecificThread(ThreadGroup group, String name) { super(group, name); } @@ -90,7 +90,7 @@ public EnhanceThread(ThreadGroup group, String name) { * @param group 线程组 * @param r 由新线程实例执行的可运行对象 */ - public EnhanceThread(ThreadGroup group, Runnable r) { + public SpecificThread(ThreadGroup group, Runnable r) { super(group, r); } @@ -101,7 +101,7 @@ public EnhanceThread(ThreadGroup group, Runnable r) { * @param r 由新线程实例执行的可运行对象 * @param name 线程名称 */ - public EnhanceThread(ThreadGroup group, Runnable r, String name) { + public SpecificThread(ThreadGroup group, Runnable r, String name) { super(group, r, name); } @@ -113,7 +113,7 @@ public EnhanceThread(ThreadGroup group, Runnable r, String name) { * @param name 线程名称 * @param stackSize 线程所需的堆栈大小 */ - public EnhanceThread(ThreadGroup group, Runnable r, String name, long stackSize) { + public SpecificThread(ThreadGroup group, Runnable r, String name, long stackSize) { super(group, r, name, stackSize); } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/ThreadLocalMap.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/ThreadLocalMap.java index 9d6f038115..d46b1265c3 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/ThreadLocalMap.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/threadlocal/ThreadLocalMap.java @@ -35,8 +35,8 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * 存储所有 {@link EnhanceThread} 的 {@link ThreadLocal} 变量的内部数据结构。 - * 请注意,此类仅供内部使用。除非知道自己在做什么,否则请使用 {@link EnhanceThread} + * 存储所有 {@link SpecificThread} 的 {@link ThreadLocal} 变量的内部数据结构。 + * 请注意,此类仅供内部使用。除非知道自己在做什么,否则请使用 {@link SpecificThread} * * @author Kimi Liu * @since Java 17+ @@ -93,8 +93,8 @@ private ThreadLocalMap() { */ public static ThreadLocalMap get() { Thread thread = Thread.currentThread(); - if (thread instanceof EnhanceThread) { - return fastGet((EnhanceThread) thread); + if (thread instanceof SpecificThread) { + return fastGet((SpecificThread) thread); } else { return slowGet(); } @@ -106,7 +106,7 @@ public static ThreadLocalMap get() { * @param thread 快速访问变量 * @return {@link ThreadLocalMap} */ - private static ThreadLocalMap fastGet(EnhanceThread thread) { + private static ThreadLocalMap fastGet(SpecificThread thread) { ThreadLocalMap threadLocalMap = thread.getThreadLocalMap(); if (threadLocalMap == null) { thread.setThreadLocalMap(threadLocalMap = new ThreadLocalMap()); @@ -135,8 +135,8 @@ private static ThreadLocalMap slowGet() { */ public static ThreadLocalMap getIfSet() { Thread thread = Thread.currentThread(); - if (thread instanceof EnhanceThread) { - return ((EnhanceThread) thread).getThreadLocalMap(); + if (thread instanceof SpecificThread) { + return ((SpecificThread) thread).getThreadLocalMap(); } return SLOW_THREAD_LOCAL_MAP.get(); } @@ -146,8 +146,8 @@ public static ThreadLocalMap getIfSet() { */ public static void remove() { Thread thread = Thread.currentThread(); - if (thread instanceof EnhanceThread) { - ((EnhanceThread) thread).setThreadLocalMap(null); + if (thread instanceof SpecificThread) { + ((SpecificThread) thread).setThreadLocalMap(null); } else { SLOW_THREAD_LOCAL_MAP.remove(); } From 94284208b9a0a6e0bdaefa132b76156bfeaeb143 Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Tue, 18 Jun 2024 13:29:00 +0800 Subject: [PATCH 03/20] fix ThreadLocal --- .../miaixz/bus/core/beans/BeanDescCache.java | 14 +- .../core/cache/provider/AbstractCache.java | 14 +- .../core/center/date/format/FormatPeriod.java | 53 ++- .../map/reference/ReferenceConcurrentMap.java | 55 ++- .../map/reference/WeakKeyConcurrentMap.java | 77 ++++ .../miaixz/bus/core/io/file/PathMover.java | 12 +- .../miaixz/bus/core/io/file/PathResolve.java | 28 ++ .../bus/core/io/source/BufferSource.java | 346 +++++++++++------- .../miaixz/bus/core/io/source/GzipSource.java | 62 +--- .../bus/core/io/source/InflaterSource.java | 2 +- .../core/lang/thread/NamedThreadFactory.java | 4 +- .../java/org/miaixz/bus/core/xyz/FileKit.java | 40 +- 12 files changed, 474 insertions(+), 233 deletions(-) create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/center/map/reference/WeakKeyConcurrentMap.java diff --git a/bus-core/src/main/java/org/miaixz/bus/core/beans/BeanDescCache.java b/bus-core/src/main/java/org/miaixz/bus/core/beans/BeanDescCache.java index 3c68580b3d..763927788b 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/beans/BeanDescCache.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/beans/BeanDescCache.java @@ -27,9 +27,10 @@ */ package org.miaixz.bus.core.beans; -import org.miaixz.bus.core.center.function.SupplierX; import org.miaixz.bus.core.center.map.reference.WeakConcurrentMap; +import java.util.function.Supplier; + /** * Bean属性缓存 * 缓存用于防止多次反射造成的性能问题 @@ -44,17 +45,18 @@ public enum BeanDescCache { */ INSTANCE; - private final WeakConcurrentMap , StrictBeanDesc> bdCache = new WeakConcurrentMap<>(); + private final WeakConcurrentMap , BeanDesc> bdCache = new WeakConcurrentMap<>(); /** - * 获得属性名和{@link StrictBeanDesc}Map映射 + * 获得属性名和{@link BeanDesc}Map映射 * * @param beanClass Bean的类 * @param supplier 对象不存在时创建对象的函数 - * @return 属性名和 {@link StrictBeanDesc}映射 + * @param BeanDesc子类 + * @return 属性名和 {@link BeanDesc}映射 */ - public StrictBeanDesc getBeanDesc(final Class> beanClass, final SupplierX supplier) { - return bdCache.computeIfAbsent(beanClass, (key) -> supplier.get()); + public T getBeanDesc(final Class> beanClass, final Supplier supplier) { + return (T) bdCache.computeIfAbsent(beanClass, (key) -> supplier.get()); } /** diff --git a/bus-core/src/main/java/org/miaixz/bus/core/cache/provider/AbstractCache.java b/bus-core/src/main/java/org/miaixz/bus/core/cache/provider/AbstractCache.java index 010e63495e..b431e34cb7 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/cache/provider/AbstractCache.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/cache/provider/AbstractCache.java @@ -111,10 +111,18 @@ protected void putWithoutLock(final K key, final V object, final long timeout) { if (timeout != 0) { existCustomTimeout = true; } - if (isFull()) { - pruneCache(); + final MutableObject mKey = MutableObject.of(key); + + // 对于替换的键值对,不做满队列检查和清除 + if (cacheMap.containsKey(mKey)) { + // 存在相同key,覆盖之 + cacheMap.put(mKey, co); + } else { + if (isFull()) { + pruneCache(); + } + cacheMap.put(mKey, co); } - cacheMap.put(MutableObject.of(key), co); } /** diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/format/FormatPeriod.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/format/FormatPeriod.java index fb9bb409ec..cdd7ff615d 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/format/FormatPeriod.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/format/FormatPeriod.java @@ -28,9 +28,11 @@ package org.miaixz.bus.core.center.date.format; import org.miaixz.bus.core.center.date.culture.en.Units; +import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.xyz.StringKit; import java.io.Serializable; +import java.util.function.Function; /** * 时长格式化器,用于格式化输出两个日期相差的时长 @@ -47,6 +49,7 @@ public class FormatPeriod implements Serializable { private static final long serialVersionUID = -1L; + /** * 格式化级别的最大个数 */ @@ -59,11 +62,20 @@ public class FormatPeriod implements Serializable { * 格式化级别 */ private Level level; + /** + * 格式化器 + */ + private Function formatter = Level::getName; /** * 是否为简化模式,此标记用于自定义是否输出各个位数中间为0的部分 * 如为{@code true},输出 1小时3秒,为{@code false}输出 1小时0分3秒 */ private boolean simpleMode = true; + /** + * 分隔符,默认为"" + * 通过{@link #setSeparator(String)}进行调整 + */ + private String separator = Normal.EMPTY; /** * 构造 @@ -122,14 +134,14 @@ public String format() { // 天 if (isLevelCountValid(levelCount) && day > 0) { - sb.append(day).append(Level.DAY.name); + sb.append(day).append(formatter.apply(Level.DAY)).append(separator); levelCount++; } // 时 if (isLevelCountValid(levelCount) && level >= Level.HOUR.ordinal()) { if (hour > 0 || (!this.simpleMode && StringKit.isNotEmpty(sb))) { - sb.append(hour).append(Level.HOUR.name); + sb.append(hour).append(formatter.apply(Level.HOUR)).append(separator); levelCount++; } } @@ -137,7 +149,7 @@ public String format() { // 分 if (isLevelCountValid(levelCount) && level >= Level.MINUTE.ordinal()) { if (minute > 0 || (!this.simpleMode && StringKit.isNotEmpty(sb))) { - sb.append(minute).append(Level.MINUTE.name); + sb.append(minute).append(formatter.apply(Level.MINUTE)).append(separator); levelCount++; } } @@ -145,23 +157,24 @@ public String format() { // 秒 if (isLevelCountValid(levelCount) && level >= Level.SECOND.ordinal()) { if (second > 0 || (!this.simpleMode && StringKit.isNotEmpty(sb))) { - sb.append(second).append(Level.SECOND.name); + sb.append(second).append(formatter.apply(Level.SECOND)).append(separator); levelCount++; } } // 毫秒 if (isLevelCountValid(levelCount) && millisecond > 0 && level >= Level.MILLISECOND.ordinal()) { - sb.append(millisecond).append(Level.MILLISECOND.name); - // levelCount++; + sb.append(millisecond).append(formatter.apply(Level.MILLISECOND)).append(separator); } } if (StringKit.isEmpty(sb)) { - sb.append(0).append(this.level.name); + sb.append(0).append(formatter.apply(this.level)); + } else if (StringKit.isNotEmpty(separator)) { + sb.delete(sb.length() - separator.length(), sb.length()); } - - return sb.toString(); + // 自定义实现最后可能存在空格 + return sb.toString().trim(); } /** @@ -216,6 +229,28 @@ public FormatPeriod setSimpleMode(final boolean simpleMode) { return this; } + /** + * 设置级别格式化器 + * + * @param formatter 级别格式化器 + * @return this + */ + public FormatPeriod setFormatter(final Function formatter) { + this.formatter = formatter; + return this; + } + + /** + * 设置分隔符 + * + * @param separator 分割符 + * @return this + */ + public FormatPeriod setSeparator(final String separator) { + this.separator = StringKit.emptyIfNull(separator); + return this; + } + @Override public String toString() { return format(); diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/map/reference/ReferenceConcurrentMap.java b/bus-core/src/main/java/org/miaixz/bus/core/center/map/reference/ReferenceConcurrentMap.java index f8b061aad1..b9c44465d3 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/map/reference/ReferenceConcurrentMap.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/map/reference/ReferenceConcurrentMap.java @@ -161,18 +161,40 @@ public void replaceAll(final BiFunction super K, ? super V, ? extends V> funct @Override public V computeIfAbsent(final K key, final Function super K, ? extends V> mappingFunction) { - this.purgeStale(); - final Ref vReference = this.raw.computeIfAbsent(wrapKey(key), - kReference -> wrapValue(mappingFunction.apply(unwrap(kReference)))); - return unwrap(vReference); + V result = null; + while(null == result){ + this.purgeStale(); + final Ref vReference = this.raw.computeIfAbsent(wrapKey(key), + kReference -> wrapValue(mappingFunction.apply(unwrap(kReference)))); + + // 如果vReference在此时被GC回收,则unwrap后为null,需要循环计算 + // 但是当用户提供的值本身为null,则直接返回之 + if(NullRef.NULL == vReference){ + // 用户提供的值本身为null + return null; + } + result = unwrap(vReference); + } + return result; } @Override public V computeIfPresent(final K key, final BiFunction super K, ? super V, ? extends V> remappingFunction) { - this.purgeStale(); - final Ref vReference = this.raw.computeIfPresent(wrapKey(key), - (kReference, vReference1) -> wrapValue(remappingFunction.apply(unwrap(kReference), unwrap(vReference1)))); - return unwrap(vReference); + V result = null; + while(null == result){ + this.purgeStale(); + final Ref vReference = this.raw.computeIfPresent(wrapKey(key), + (kReference, vReference1) -> wrapValue(remappingFunction.apply(unwrap(kReference), unwrap(vReference1)))); + + // 如果vReference在此时被GC回收,则unwrap后为null,需要循环计算 + // 但是当用户提供的值本身为null,则直接返回之 + if(NullRef.NULL == vReference){ + // 用户提供的值本身为null + return null; + } + result = unwrap(vReference); + } + return result; } @Override @@ -255,11 +277,11 @@ public int size() { public Set > entrySet() { this.purgeStale(); final Set , Ref >> referenceEntrySet = this.raw.entrySet(); - return new AbstractSet >() { + return new AbstractSet<>() { @Override public Iterator > iterator() { final Iterator , Ref >> referenceIter = referenceEntrySet.iterator(); - return new Iterator >() { + return new Iterator<>() { @Override public boolean hasNext() { return referenceIter.hasNext(); @@ -268,7 +290,7 @@ public boolean hasNext() { @Override public Entry next() { final Entry, Ref > next = referenceIter.next(); - return new Entry () { + return new Entry<>() { @Override public K getKey() { return unwrap(next.getKey()); @@ -382,4 +404,15 @@ private Ref wrapValue(final Object value) { return wrapValue((V) value, this.lastValueQueue); } + private static class NullRef implements Ref { + + public static final Object NULL = new NullRef(); + + @Override + public Object get() { + return null; + } + + } + } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/map/reference/WeakKeyConcurrentMap.java b/bus-core/src/main/java/org/miaixz/bus/core/center/map/reference/WeakKeyConcurrentMap.java new file mode 100644 index 0000000000..0d234e9d2d --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/map/reference/WeakKeyConcurrentMap.java @@ -0,0 +1,77 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +package org.miaixz.bus.core.center.map.reference; + +import org.miaixz.bus.core.center.map.concurrent.SafeConcurrentHashMap; +import org.miaixz.bus.core.lang.ref.Ref; +import org.miaixz.bus.core.lang.ref.StrongObject; +import org.miaixz.bus.core.lang.ref.WeakObject; + +import java.lang.ref.ReferenceQueue; +import java.util.concurrent.ConcurrentMap; + +/** + * 线程安全的WeakMap实现 + * 键为Weak引用,即,在GC时发现弱引用会回收其对象 + * + * @param 键类型 + * @param 值类型 + * @author Kimi Liu + * @since Java 17+ + */ +public class WeakKeyConcurrentMap extends ReferenceConcurrentMap { + + private static final long serialVersionUID = 1L; + + /** + * 构造 + */ + public WeakKeyConcurrentMap() { + this(new SafeConcurrentHashMap<>()); + } + + /** + * 构造 + * + * @param raw {@link ConcurrentMap}实现 + */ + public WeakKeyConcurrentMap(final ConcurrentMap, Ref > raw) { + super(raw); + } + + @Override + Ref wrapKey(final K key, final ReferenceQueue super K> queue) { + return new WeakObject<>(key, queue); + } + + @Override + Ref wrapValue(final V value, final ReferenceQueue super V> queue) { + return new StrongObject<>(value); + } + +} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/file/PathMover.java b/bus-core/src/main/java/org/miaixz/bus/core/io/file/PathMover.java index 9001a890c0..a6598f956a 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/file/PathMover.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/file/PathMover.java @@ -127,7 +127,7 @@ public Path move() throws IllegalArgumentException { final CopyOption[] options = this.options; if (PathResolve.isSub(src, target)) { - if (Files.exists(target) && PathResolve.equals(src, target)) { + if(PathResolve.equals(src, target)){ // 当用户传入目标路径与源路径一致时,直接返回,否则会导致删除风险。 return target; } @@ -174,15 +174,11 @@ public Path move() throws IllegalArgumentException { */ public Path moveContent() { final Path src = this.src; - if (PathResolve.isExistsAndNotDirectory(target, false)) { - // 文件移动调用move方法 - return move(); - } - final Path target = this.target; + + // 文件移动调用move方法 if (PathResolve.isExistsAndNotDirectory(target, false)) { - // 目标不能为文件 - throw new IllegalArgumentException("Can not move dir content to a file"); + return move(); } // target 不存在导致NoSuchFileException diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/file/PathResolve.java b/bus-core/src/main/java/org/miaixz/bus/core/io/file/PathResolve.java index 51957148e8..67a28f7da5 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/file/PathResolve.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/file/PathResolve.java @@ -34,6 +34,7 @@ import org.miaixz.bus.core.lang.exception.InternalException; import org.miaixz.bus.core.xyz.ArrayKit; import org.miaixz.bus.core.xyz.IoKit; +import org.miaixz.bus.core.xyz.ObjectKit; import java.io.*; import java.nio.file.*; @@ -608,6 +609,33 @@ public static Path moveContent(final Path src, final Path target, final boolean * @see Files#isSameFile(Path, Path) */ public static boolean equals(final Path file1, final Path file2) throws InternalException { + // 两者都为null判定为相同 + if (null == file1 || null == file2) { + return null == file1 && null == file2; + } + + final boolean exists1 = exists(file1, false); + final boolean exists2 = exists(file2, false); + + + if (exists1 && exists2) { + return isSameFile(file1, file2); + } + + return ObjectKit.equals(file1, file2); + } + + /** + * 检查两个文件是否是同一个文件 + * 所谓文件相同,是指Path对象是否指向同一个文件或文件夹 + * + * @param file1 文件1,必须存在 + * @param file2 文件2,必须存在 + * @return 是否相同 + * @throws InternalException IO异常 + * @see Files#isSameFile(Path, Path) + */ + public static boolean isSameFile(final Path file1, final Path file2) throws InternalException { try { return Files.isSameFile(file1, file2); } catch (final IOException e) { diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/source/BufferSource.java b/bus-core/src/main/java/org/miaixz/bus/core/io/source/BufferSource.java index c74d058e6e..9e3fc2f713 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/source/BufferSource.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/source/BufferSource.java @@ -47,36 +47,51 @@ public interface BufferSource extends Source, ReadableByteChannel { /** - * This source's internal buffer. + * 该源的内部缓冲区 + * + * @return {@link Buffer} */ Buffer getBuffer(); /** - * Returns true if there are no more bytes in this source. This will block until there are bytes - * to read or the source is definitely exhausted. + * 如果此源中没有更多字节,则返回 true。 + * 这将阻塞,直到有字节可读取或源确实已耗尽 + * + * @return the true/false + * @throws IOException 异常 */ boolean exhausted() throws IOException; /** - * Returns when the buffer contains at least {@code byteCount} bytes. Throws an - * {@link java.io.EOFException} if the source is exhausted before the required bytes can be read. + * 当缓冲区至少包含 {@code byteCount} 个字节时返回。 + * 如果在读取所需字节之前源已耗尽,则抛出 {@link java.io.EOFException}。 + * + * @param byteCount 字节数 + * @throws IOException 异常 */ void require(long byteCount) throws IOException; /** - * Returns true when the buffer contains at least {@code byteCount} bytes, expanding it as - * necessary. Returns false if the source is exhausted before the requested bytes can be read. + * 如果缓冲区至少包含 {@code byteCount} 个字节,则返回 true,并根据需要对其进行扩展。 + * 如果在读取请求的字节之前源已耗尽,则返回 false。 + * + * @param byteCount 字节数 + * @return the true/false + * @throws IOException 异常 */ boolean request(long byteCount) throws IOException; /** - * Removes a byte from this source and returns it. + * 从该源中删除一个字节并返回它 + * + * @return the true/false + * @throws IOException 异常 */ byte readByte() throws IOException; /** - * Removes two bytes from this source and returns a big-endian short. {@code - * + * 从此源中删除两个字节并返回一个短整型 + *{@code * Buffer buffer = new Buffer() * .writeByte(0x7f) * .writeByte(0xff) @@ -90,12 +105,15 @@ public interface BufferSource extends Source, ReadableByteChannel { * assertEquals(15, buffer.readShort()); * assertEquals(0, buffer.size()); * }+ * + * @return the short + * @throws IOException 异常 */ short readShort() throws IOException; /** - * Removes two bytes from this source and returns a little-endian short.{@code - * + * 从此源中删除两个字节并返回一个整型 + *{@code * Buffer buffer = new Buffer() * .writeByte(0xff) * .writeByte(0x7f) @@ -109,12 +127,15 @@ public interface BufferSource extends Source, ReadableByteChannel { * assertEquals(15, buffer.readShortLe()); * assertEquals(0, buffer.size()); * }+ * + * @return the short + * @throws IOException 异常 */ short readShortLe() throws IOException; /** - * Removes four bytes from this source and returns a big-endian int.{@code - * + * 从此源中删除四个字节并返回一个大整数 + *{@code * Buffer buffer = new Buffer() * .writeByte(0x7f) * .writeByte(0xff) @@ -138,8 +159,8 @@ public interface BufferSource extends Source, ReadableByteChannel { int readInt() throws IOException; /** - * Removes four bytes from this source and returns a little-endian int.{@code - * + * 从该源中删除四个字节并返回一个小整数 + *{@code * Buffer buffer = new Buffer() * .writeByte(0xff) * .writeByte(0xff) @@ -163,8 +184,8 @@ public interface BufferSource extends Source, ReadableByteChannel { int readIntLe() throws IOException; /** - * Removes eight bytes from this source and returns a big-endian long.{@code - * + * 该源中删除八个字节并返回一个大长整型 + *{@code * Buffer buffer = new Buffer() * .writeByte(0x7f) * .writeByte(0xff) @@ -196,8 +217,8 @@ public interface BufferSource extends Source, ReadableByteChannel { long readLong() throws IOException; /** - * Removes eight bytes from this source and returns a little-endian long.{@code - * + * 从此源中删除八个字节并返回一个小长整型 + *{@code * Buffer buffer = new Buffer() * .writeByte(0xff) * .writeByte(0xff) @@ -229,9 +250,8 @@ public interface BufferSource extends Source, ReadableByteChannel { long readLongLe() throws IOException; /** - * Reads a long from this source in signed decimal form (i.e., as a string in base 10 with - * optional leading '-'). This will iterate until a non-digit character is found.{@code - * + * 以有符号十进制形式从此源读取一个长整型值(即以十进制为基数的字符串,前导字符可选为“-”)。此操作将不断迭代,直到找到非数字字符。 + *{@code * Buffer buffer = new Buffer() * .writeUtf8("8675309 -123 00001"); * @@ -243,15 +263,13 @@ public interface BufferSource extends Source, ReadableByteChannel { * }* * @return the long - * @throws NumberFormatException if the found digits do not fit into a {@code long} or a decimal - * number was not present. + * @throws NumberFormatException 如果找到的数字不适合 {@code long} 或不存在十进制数。 */ long readDecimalLong() throws IOException; /** - * Reads a long form this source in hexadecimal form (i.e., as a string in base 16). This will - * iterate until a non-hexadecimal character is found.{@code - * + * 以十六进制形式(即以 16 进制表示的字符串)读取此源的长格式。此过程将不断迭代,直到找到非十六进制字符 + *{@code * Buffer buffer = new Buffer() * .writeUtf8("ffff CAFEBABE 10"); * @@ -263,40 +281,40 @@ public interface BufferSource extends Source, ReadableByteChannel { * }* * @return the long - * @throws NumberFormatException if the found hexadecimal does not fit into a {@code long} or - * hexadecimal was not found. + * @throws NumberFormatException 如果找到的十六进制数不适合 {@code long} 或未找到十六进制数。 */ long readHexadecimalUnsignedLong() throws IOException; /** - * Reads and discards {@code byteCount} bytes from this source. Throws an - * {@link java.io.EOFException} if the source is exhausted before the - * requested bytes can be skipped. + * 从此源读取并丢弃 {@code byteCount} 个字节 + * + * @param byteCount 字节数 + * @throws IOException 如果在跳过请求的字节之前源已耗尽,则抛出。 */ void skip(long byteCount) throws IOException; /** - * Removes all bytes bytes from this and returns them as a byte string. + * 从中删除所有字节并将它们作为字节字符串返回 * * @return the {@link ByteString} + * @throws IOException 异常 */ ByteString readByteString() throws IOException; /** - * Removes {@code byteCount} bytes from this and returns them as a byte string. + * 从中删除 {@code byteCount} 个字节并将其作为字节字符串返回。 * * @return the {@link ByteString} + * @throws IOException 异常 */ ByteString readByteString(long byteCount) throws IOException; /** - * Finds the first string in {@code options} that is a prefix of this buffer, consumes it from - * this buffer, and returns its index. If no byte string in {@code options} is a prefix of this - * buffer this returns -1 and no bytes are consumed. - * - *This can be used as an alternative to {@link #readByteString} or even {@link #readUtf8} if - * the set of expected values is known in advance.
{@code + * 在{@code options} 中查找第一个作为此缓冲区前缀的字符串,从此缓冲区中使用它,并返回其索引。 + * 如果 {@code options} 中没有字节字符串是此缓冲区的前缀,则返回 -1,并且不消耗任何字节。 * + *如果事先知道预期值集,则可以将其用作 {@link #readByteString} 甚至 {@link #readUtf8} 的替代。 + *
{@code * Options FIELDS = Options.of( * ByteString.encodeUtf8("depth="), * ByteString.encodeUtf8("height="), @@ -314,58 +332,81 @@ public interface BufferSource extends Source, ReadableByteChannel { * assertEquals('\n', buffer.readByte()); * }* + * @param segmentBuffer 索引值 * @return the int + * @throws IOException 异常 */ int select(SegmentBuffer segmentBuffer) throws IOException; /** - * Removes all bytes from this and returns them as a byte array. + * 从中删除所有字节并将它们作为字节数组返回。 * * @return the byte + * @throws IOException 异常 */ byte[] readByteArray() throws IOException; /** - * Removes {@code byteCount} bytes from this and returns them as a byte array. + * 从中删除 {@code byteCount} 个字节并将其作为字节数组返回。 * * @return the byte + * @throws IOException 异常 */ byte[] readByteArray(long byteCount) throws IOException; /** - * Removes up to {@code sink.length} bytes from this and copies them into {@code sink}. Returns - * the number of bytes read, or -1 if this source is exhausted. + * 从中移除最多 {@code sink.length} 个字节并将其复制到 {@code sink}。 + * 返回读取的字节数,如果此源已耗尽,则返回 -1。 + * + * @param sink 字节集合 + * @return the int + * @throws IOException 异常 */ int read(byte[] sink) throws IOException; /** - * Removes exactly {@code sink.length} bytes from this and copies them into {@code sink}. Throws - * an {@link java.io.EOFException} if the requested number of bytes cannot be read. + * 从中删除恰好 {@code sink.length} 个字节并将其复制到 {@code sink}。 + * 如果无法读取请求的字节数,则抛出 {@link java.io.EOFException}。 + * + * @param sink 字节集合 + * @throws IOException 异常 */ void readFully(byte[] sink) throws IOException; /** - * Removes up to {@code byteCount} bytes from this and copies them into {@code sink} at {@code - * offset}. Returns the number of bytes read, or -1 if this source is exhausted. + * 从此处删除最多 {@code byteCount} 个字节并将其复制到 {@code offset} 处的 {@code sink}。 + * 返回读取的字节数,如果此源已耗尽,则返回 -1。 + * + * @param sink 字节集合 + * @param offset 偏移位 + * @param byteCount 字节数 + * @return the int + * @throws IOException 异常 */ int read(byte[] sink, int offset, int byteCount) throws IOException; /** - * Removes exactly {@code byteCount} bytes from this and appends them to {@code sink}. Throws an - * {@link java.io.EOFException} if the requested number of bytes cannot be read. + * 从中删除精确的 {@code byteCount} 个字节并将其附加到 {@code sink}。 + * 如果无法读取请求的字节数,则抛出 {@link java.io.EOFException}。 + * + * @param sink 字节集合 + * @param byteCount 字节数 + * @throws IOException 异常 */ void readFully(Buffer sink, long byteCount) throws IOException; /** - * Removes all bytes from this and appends them to {@code sink}. Returns the total number of bytes - * written to {@code sink} which will be 0 if this is exhausted. + * 从中删除所有字节并将其附加到 {@code sink}。返回写入 {@code sink} 的总字节数,如果已用尽,则为 0。 + * + * @param sink 字节集合 + * @return the long + * @throws IOException 异常 */ long readAll(Sink sink) throws IOException; /** - * Removes all bytes from this, decodes them as UTF-8, and returns the string. Returns the empty - * string if this source is empty.{@code - * + * 从中删除所有字节,将其解码为 UTF-8,然后返回字符串。如果此源为空,则返回空字符串。 + *{@code * Buffer buffer = new Buffer() * .writeUtf8("Uh uh uh!") * .writeByte(' ') @@ -377,13 +418,15 @@ public interface BufferSource extends Source, ReadableByteChannel { * assertEquals("", buffer.readUtf8()); * assertEquals(0, buffer.size()); * }+ * + * @return the string + * @throws IOException 异常 */ String readUtf8() throws IOException; /** - * Removes {@code byteCount} bytes from this, decodes them as UTF-8, and returns the string. + * 从中删除 {@code byteCount} 个字节,将其解码为 UTF-8,并返回字符串。 *{@code - * * Buffer buffer = new Buffer() * .writeUtf8("Uh uh uh!") * .writeByte(' ') @@ -399,14 +442,17 @@ public interface BufferSource extends Source, ReadableByteChannel { * assertEquals(" magic word!", buffer.readUtf8(12)); * assertEquals(0, buffer.size()); * }+ * + * @param byteCount 字节数 + * @return the string + * @throws IOException 异常 */ String readUtf8(long byteCount) throws IOException; /** - * Removes and returns characters up to but not including the next line break. A line break is - * either {@code "\n"} or {@code "\r\n"}; these characters are not included in the result. + * 删除并返回直到下一个换行符(但不包括该换行符)的字符。 + * 换行符为 {@code "\n"} 或 {@code "\r\n"};这些字符不包含在结果中。 *{@code - * * Buffer buffer = new Buffer() * .writeUtf8("I'm a hacker!\n") * .writeUtf8("That's what I said: you're a nerd.\n") @@ -426,36 +472,27 @@ public interface BufferSource extends Source, ReadableByteChannel { * assertEquals(0, buffer.size()); * }* - *On the end of the stream this method returns null, just like {@link - * java.io.BufferedReader}. If the source doesn't end with a line break then an implicit line - * break is assumed. Null is returned once the source is exhausted. Use this for human-generated - * data, where a trailing line break is optional. + * 在流的末尾,此方法返回 null, 就像 {@link java.io.BufferedReader} 一样。 + * 如果源未以换行符结尾,则假定为隐式换行符。一旦源耗尽,将返回 Null。将此方法用于人工生成的数据,其中尾随换行符是可选的。 + * + * @return the string + * @throws IOException 异常 */ String readUtf8Line() throws IOException; /** - * Removes and returns characters up to but not including the next line break. A line break is - * either {@code "\n"} or {@code "\r\n"}; these characters are not included in the result. + * 删除并返回直到下一个换行符(但不包括该换行符)的字符。 + * 换行符为 {@code "\n"} 或 {@code "\r\n"};这些字符不包含在结果中 * - *
On the end of the stream this method throws. Every call must consume either - * '\r\n' or '\n'. If these characters are absent in the stream, an {@link java.io.EOFException} - * is thrown. Use this for machine-generated data where a missing line break implies truncated - * input. + * @return the string + * @throws IOException 异常 */ String readUtf8LineStrict() throws IOException; /** - * Like {@link #readUtf8LineStrict()}, except this allows the caller to specify the longest - * allowed match. Use this to protect against streams that may not include - * {@code "\n"} or {@code "\r\n"}. - * - *
The returned string will have at most {@code limit} UTF-8 bytes, and the maximum number - * of bytes scanned is {@code limit + 2}. If {@code limit == 0} this will always throw - * an {@code EOFException} because no bytes will be scanned. - * - *
This method is safe. No bytes are discarded if the match fails, and the caller is free - * to try another match:
{@code - * + * 与 {@link #readUtf8LineStrict()} 类似,不同之处在于它允许调用者指定允许的最长匹配。 + * 使用它来防止可能不包含 {@code "\n"} 或 {@code "\r\n"} 的流。 + *{@code * Buffer buffer = new Buffer(); * buffer.writeUtf8("12345\r\n"); * @@ -465,45 +502,57 @@ public interface BufferSource extends Source, ReadableByteChannel { * // No bytes have been consumed so the caller can retry. * assertEquals("12345", buffer.readUtf8LineStrict(5)); * }+ * + * @param limit 限制 + * @return the string + * @throws IOException 异常 */ String readUtf8LineStrict(long limit) throws IOException; /** - * Removes and returns a single UTF-8 code point, reading between 1 and 4 bytes as necessary. - * - *If this source is exhausted before a complete code point can be read, this throws an {@link - * java.io.EOFException} and consumes no input. + * 删除并返回单个 UTF-8 代码点,根据需要读取 1 到 4 个字节。 + *
+ * 如果此源不是以正确编码的 UTF-8 代码点开头,则此方法将删除 1 个或多个非 UTF-8 字节并返回替换字符 ({@code U+FFFD})。 + * 这包括编码问题(输入不是正确编码的 UTF-8)、字符超出范围(超出 Unicode 的 0x10ffff 限制)、UTF-16 代理的代码 + * 点 (U+d800..U+dfff) 和过长编码(例如,修改版 UTF-8 中的 NUL 字符为 {@code 0xc080}) * - *
If this source doesn't start with a properly-encoded UTF-8 code point, this method will - * remove 1 or more non-UTF-8 bytes and return the replacement character ({@code U+FFFD}). This - * covers encoding problems (the input is not properly-encoded UTF-8), characters out of range - * (beyond the 0x10ffff limit of Unicode), code points for UTF-16 surrogates (U+d800..U+dfff) and - * overlong encodings (such as {@code 0xc080} for the NUL character in modified UTF-8). + * @return the int + * @throws IOException 异常 */ int readUtf8CodePoint() throws IOException; /** - * Removes all bytes from this, decodes them as {@code charset}, and returns the string. + * 从中删除所有字节,将其解码为{@code charset},并返回字符串。 + * + * @param charset 字符编码 + * @return the string + * @throws IOException 异常 */ String readString(Charset charset) throws IOException; /** - * Removes {@code byteCount} bytes from this, decodes them as {@code charset}, and returns the - * string. + * 从中删除 {@code byteCount} 个字节,将其解码为 {@code charset},并返回字符串。 + * + * @param byteCount 字节数 + * @param charset 字符编码 + * @return the string + * @throws IOException 异常 */ String readString(long byteCount, Charset charset) throws IOException; /** * Equivalent to {@link #indexOf(byte, long) indexOf(b, 0)}. + * + * @param b + * @return the long + * @throws IOException 异常 */ long indexOf(byte b) throws IOException; /** - * Returns the index of the first {@code b} in the buffer at or after {@code fromIndex}. This - * expands the buffer as necessary until {@code b} is found. This reads an unbounded number of - * bytes into the buffer. Returns -1 if the stream is exhausted before the requested byte is - * found.
{@code - * + * 返回缓冲区中第一个 {@code b} 的索引,位于 {@code fromIndex} 处或之后。 + * 这会根据需要扩展缓冲区,直到找到 {@code b}。这会将无限数量的字节读入缓冲区。如果在找到请求的字节之前流已耗尽,则返回 -1。 + *{@code * Buffer buffer = new Buffer(); * buffer.writeUtf8("Don't move! He can't see us if we don't move."); * @@ -511,112 +560,137 @@ public interface BufferSource extends Source, ReadableByteChannel { * assertEquals(6, buffer.indexOf(m)); * assertEquals(40, buffer.indexOf(m, 12)); * }+ * + * @param b + * @param fromIndex + * @return the long + * @throws IOException 异常 */ long indexOf(byte b, long fromIndex) throws IOException; /** - * Returns the index of {@code b} if it is found in the range of {@code fromIndex} inclusive - * to {@code toIndex} exclusive. If {@code b} isn't found, or if {@code fromIndex == toIndex}, - * then -1 is returned. + * 如果在 {@code fromIndex} 到 {@code toIndex} 范围内找到 {@code b},则返回其索引。 + * 如果未找到 {@code b},或者 {@code fromIndex == toIndex},则返回 -1。 * - *The scan terminates at either {@code toIndex} or the end of the buffer, whichever comes - * first. The maximum number of bytes scanned is {@code toIndex-fromIndex}. + * @param b 字节 + * @param fromIndex 开始索引 + * @param toIndex 目标索引 + * @return the long + * @throws IOException 异常 */ long indexOf(byte b, long fromIndex, long toIndex) throws IOException; /** - * Equivalent to {@link #indexOf(ByteString, long) indexOf(bytes, 0)}. + * 相当于{@link #indexOf(ByteString, long) indexOf(bytes, 0)}。 + * + * @param bytes 字节 + * @return the long + * @throws IOException 异常 */ long indexOf(ByteString bytes) throws IOException; /** - * Returns the index of the first match for {@code bytes} in the buffer at or after {@code - * fromIndex}. This expands the buffer as necessary until {@code bytes} is found. This reads an - * unbounded number of bytes into the buffer. Returns -1 if the stream is exhausted before the - * requested bytes are found.
{@code - * + * 返回缓冲区中 {@code bytes} 的第一个匹配项的索引,位于 {@code fromIndex} 处或之后。 + * 这会根据需要扩展缓冲区,直到找到 {@code bytes}。这会将无限数量的字节读入缓冲区。如果在找到请求的字节之前流已耗尽,则返回 -1。 + *{@code * ByteString MOVE = ByteString.encodeUtf8("move"); - * * Buffer buffer = new Buffer(); * buffer.writeUtf8("Don't move! He can't see us if we don't move."); * * assertEquals(6, buffer.indexOf(MOVE)); * assertEquals(40, buffer.indexOf(MOVE, 12)); * }+ * + * @param bytes 字节 + * @param fromIndex 字节索引 + * @return the long + * @throws IOException 异常 */ long indexOf(ByteString bytes, long fromIndex) throws IOException; /** - * Equivalent to {@link #indexOfElement(ByteString, long) indexOfElement(targetBytes, 0)}. + * 相当于{@link #indexOfElement(ByteString, long) indexOfElement(targetBytes, 0)}。 + * + * @param targetBytes 目标字节 + * @return the long + * @throws IOException 异常 */ long indexOfElement(ByteString targetBytes) throws IOException; /** - * Returns the first index in this buffer that is at or after {@code fromIndex} and that contains - * any of the bytes in {@code targetBytes}. This expands the buffer as necessary until a target - * byte is found. This reads an unbounded number of bytes into the buffer. Returns -1 if the - * stream is exhausted before the requested byte is found.{@code - * + * 返回此缓冲区中位于 {@code fromIndex} 或之后且包含 {@code targetBytes} 中任意字节的第一个索引。 + * 这会根据需要扩展缓冲区,直到找到目标字节。这会将无限数量的字节读入缓冲区。如果在找到请求的字节之前流已耗尽,则返回 -1。 + *{@code * ByteString ANY_VOWEL = ByteString.encodeUtf8("AEOIUaeoiu"); - * * Buffer buffer = new Buffer(); * buffer.writeUtf8("Dr. Alan Grant"); * * assertEquals(4, buffer.indexOfElement(ANY_VOWEL)); // 'A' in 'Alan'. * assertEquals(11, buffer.indexOfElement(ANY_VOWEL, 9)); // 'a' in 'Grant'. * }+ * + * @param targetBytes 目标字节 + * @param fromIndex 开始索引 + * @return the long + * @throws IOException 异常 */ long indexOfElement(ByteString targetBytes, long fromIndex) throws IOException; /** - * Returns true if the bytes at {@code offset} in this source equal {@code bytes}. This expands - * the buffer as necessary until a byte does not match, all bytes are matched, or if the stream - * is exhausted before enough bytes could determine a match.{@code - * + * 如果此源中 {@code offset} 处的字节等于 {@code bytes},则返回 true。 + * 这会根据需要扩展缓冲区,直到某个字节不匹配、所有字节都匹配,或者在足够的字节确定匹配之前流已耗尽。 + *{@code * ByteString simonSays = ByteString.encodeUtf8("Simon says:"); - * * Buffer standOnOneLeg = new Buffer().writeUtf8("Simon says: Stand on one leg."); * assertTrue(standOnOneLeg.rangeEquals(0, simonSays)); * * Buffer payMeMoney = new Buffer().writeUtf8("Pay me $1,000,000."); * assertFalse(payMeMoney.rangeEquals(0, simonSays)); * }+ * + * @param offset 偏移量 + * @param bytes 字节 + * @return + * @throws IOException 异常 */ boolean rangeEquals(long offset, ByteString bytes) throws IOException; /** - * Returns true if {@code byteCount} bytes at {@code offset} in this source equal {@code bytes} - * at {@code bytesOffset}. This expands the buffer as necessary until a byte does not match, all - * bytes are matched, or if the stream is exhausted before enough bytes could determine a match. + * 如果此源中 {@code offset} 处的 {@code byteCount} 个字节等于 {@code bytesOffset} 处的 {@code bytes},则返回 true。 + * 这会根据需要扩展缓冲区,直到某个字节不匹配、所有字节都匹配,或者在足够的字节确定匹配之前流已耗尽。 + * + * @param offset 偏移量 + * @param bytes 字节 + * @param bytesOffset 字节偏移量 + * @param byteCount 字节数 + * @return the true/false + * @throws IOException 异常 */ boolean rangeEquals(long offset, ByteString bytes, int bytesOffset, int byteCount) throws IOException; /** - * Returns a new {@code BufferedSource} that can read data from this {@code BufferedSource} - * without consuming it. The returned source becomes invalid once this source is next read or - * closed. - *- * For example, we can use {@code peek()} to lookahead and read the same data multiple times. - * + * 返回一个新的 {@code BufferedSource},可从此 {@code BufferedSource}读取数据但不使用它。 + * 一旦下次读取或关闭此源,返回的源将变为无效。 *
{@code - * * Buffer buffer = new Buffer(); * buffer.writeUtf8("abcdefghi"); - * * buffer.readUtf8(3) // returns "abc", buffer contains "defghi" * * BufferedSource peek = buffer.peek(); * peek.readUtf8(3); // returns "def", buffer contains "defghi" * peek.readUtf8(3); // returns "ghi", buffer contains "defghi" - * * buffer.readUtf8(3); // returns "def", buffer contains "ghi" * }+ * + * @return {@link BufferSource} */ BufferSource peek(); /** - * Returns an input stream that reads from this source. + * 返回从该源读取的输入流 + * + * @return {@link InputStream} */ InputStream inputStream(); diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/source/GzipSource.java b/bus-core/src/main/java/org/miaixz/bus/core/io/source/GzipSource.java index fa66d64739..22e64259ff 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/source/GzipSource.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/source/GzipSource.java @@ -56,26 +56,24 @@ public class GzipSource implements Source { private static final byte SECTION_DONE = 3; /** - * Our source should yield a GZIP header (which we consume directly), followed - * by deflated bytes (which we consume via an InflaterSource), followed by a - * GZIP trailer (which we also consume directly). + * + * 源压缩字节 */ private final BufferSource source; /** - * The inflater used to decompress the deflated body. + * 用于进行解压的缓冲区 */ private final Inflater inflater; /** - * The inflater source takes care of moving data between compressed source and - * decompressed sink buffers. + * 负责在压缩源缓冲区和解压缩接收缓冲区之间交换数据 */ private final InflaterSource inflaterSource; /** - * Checksum used to check both the GZIP header and decompressed body. + * 用于检查 GZIP 标头和解压缩主体的校验 */ private final CRC32 crc = new CRC32(); /** - * The current section. Always progresses forward. + * 当前部分 */ private int section = SECTION_HEADER; @@ -91,7 +89,7 @@ public long read(Buffer sink, long byteCount) throws IOException { if (byteCount < 0) throw new IllegalArgumentException("byteCount < 0: " + byteCount); if (byteCount == 0) return 0; - // If we haven't consumed the header, we must consume it before anything else. + // 如果还没有使用标题,必须在做其他事情之前使用它。 if (section == SECTION_HEADER) { consumeHeader(); section = SECTION_BODY; @@ -107,17 +105,15 @@ public long read(Buffer sink, long byteCount) throws IOException { section = SECTION_TRAILER; } - // The body is exhausted; time to read the trailer. We always consume the - // trailer before returning a -1 exhausted result; that way if you read to - // the end of a GzipSource you guarantee that the CRC has been checked. + // 主体已耗尽;读取尾部了。总是在返回 -1 耗尽结果之前使用 + // 尾部;这样,如果您读到 GzipSource 的末尾,就可以保证 CRC 已经过检查。 if (section == SECTION_TRAILER) { consumeTrailer(); section = SECTION_DONE; - // Gzip streams self-terminate: they return -1 before their underlying - // source returns -1. Here we attempt to force the underlying stream to - // return -1 which may trigger it to release its resources. If it doesn't - // return -1, then our Gzip data finished prematurely! + // Gzip 流会自行终止:在底层源返回 -1 之前返回 -1。 + // 在这里,尝试强制底层流返回 -1,这可能会触发它释放其资源。 + // 如果它不返回 -1,那么我们的 Gzip 数据就会过早结束! if (!source.exhausted()) { throw new IOException("gzip finished without exhausting source"); } @@ -127,9 +123,8 @@ public long read(Buffer sink, long byteCount) throws IOException { } private void consumeHeader() throws IOException { - // Read the 10-byte header. We peek at the flags byte first so we know if we - // need to CRC the entire header. Then we read the magic ID1ID2 sequence. - // We can skip everything else in the first 10 bytes. + // 读取 10 字节的标头。首先查看标志字节,以便知道是否需要对整个标头进行 CRC 校验。 + // 然后读取神奇的 ID1 ID2 序列。可以跳过前 10 个字节中的所有其他内容。 // +---+---+---+---+---+---+---+---+---+---+ // |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->) // +---+---+---+---+---+---+---+---+---+---+ @@ -142,10 +137,6 @@ private void consumeHeader() throws IOException { checkEqual("ID1ID2", (short) 0x1f8b, id1id2); source.skip(8); - // Skip optional extra fields. - // +---+---+=================================+ - // | XLEN |...XLEN bytes of "extra field"...| (more-->) - // +---+---+=================================+ if (((flags >> FEXTRA) & 1) == 1) { source.require(2); if (fhcrc) updateCrc(source.getBuffer(), 0, 2); @@ -155,10 +146,6 @@ private void consumeHeader() throws IOException { source.skip(xlen); } - // Skip an optional 0-terminated name. - // +=========================================+ - // |...original file name, zero-terminated...| (more-->) - // +=========================================+ if (((flags >> FNAME) & 1) == 1) { long index = source.indexOf((byte) 0); if (index == -1) throw new EOFException(); @@ -166,10 +153,6 @@ private void consumeHeader() throws IOException { source.skip(index + 1); } - // Skip an optional 0-terminated comment. - // +===================================+ - // |...file comment, zero-terminated...| (more-->) - // +===================================+ if (((flags >> FCOMMENT) & 1) == 1) { long index = source.indexOf((byte) 0); if (index == -1) throw new EOFException(); @@ -177,10 +160,6 @@ private void consumeHeader() throws IOException { source.skip(index + 1); } - // Confirm the optional header CRC. - // +---+---+ - // | CRC16 | - // +---+---+ if (fhcrc) { checkEqual("FHCRC", source.readShortLe(), (short) crc.getValue()); crc.reset(); @@ -188,10 +167,6 @@ private void consumeHeader() throws IOException { } private void consumeTrailer() throws IOException { - // Read the eight-byte trailer. Confirm the body's CRC and size. - // +---+---+---+---+---+---+---+---+ - // | CRC32 | ISIZE | - // +---+---+---+---+---+---+---+---+ checkEqual("CRC", source.readIntLe(), (int) crc.getValue()); checkEqual("ISIZE", source.readIntLe(), (int) inflater.getBytesWritten()); } @@ -207,16 +182,16 @@ public void close() throws IOException { } /** - * Updates the CRC with the given bytes. + * 使用给定的字节更新 CRC */ private void updateCrc(Buffer buffer, long offset, long byteCount) { - // Skip segments that we aren't checksumming. + // 跳过我们未进行校验的 SectionBuffer s = buffer.head; for (; offset >= (s.limit - s.pos); s = s.next) { offset -= (s.limit - s.pos); } - // Checksum one segment at a time. + // 每次对一个段进行校验 for (; byteCount > 0; s = s.next) { int pos = (int) (s.pos + offset); int toUpdate = (int) Math.min(s.limit - pos, byteCount); @@ -228,8 +203,7 @@ private void updateCrc(Buffer buffer, long offset, long byteCount) { private void checkEqual(String name, int expected, int actual) throws IOException { if (actual != expected) { - throw new IOException(String.format( - "%s: actual 0x%08x != expected 0x%08x", name, actual, expected)); + throw new IOException(String.format("%s: actual 0x%08x != expected 0x%08x", name, actual, expected)); } } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/io/source/InflaterSource.java b/bus-core/src/main/java/org/miaixz/bus/core/io/source/InflaterSource.java index 9ea06839f3..af5179a2ae 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/io/source/InflaterSource.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/io/source/InflaterSource.java @@ -96,7 +96,7 @@ public long read( if (inflater.finished() || inflater.needsDictionary()) { releaseInflatedBytes(); if (tail.pos == tail.limit) { - // We allocated a tail segment, but didn't end up needing it. Recycle! + // 分配了一个尾段,但最终并不需要它。回收! sink.head = tail.pop(); LifeCycle.recycle(tail); } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/NamedThreadFactory.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/NamedThreadFactory.java index bba08407c8..406b4e7f86 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/NamedThreadFactory.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/lang/thread/NamedThreadFactory.java @@ -28,7 +28,7 @@ package org.miaixz.bus.core.lang.thread; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.lang.thread.threadlocal.EnhanceThread; +import org.miaixz.bus.core.lang.thread.threadlocal.SpecificThread; import org.miaixz.bus.core.xyz.ClassKit; import org.miaixz.bus.core.xyz.ObjectKit; import org.miaixz.bus.core.xyz.StringKit; @@ -232,7 +232,7 @@ public Thread newThread(final Runnable r) { * @return 新新线程信息 */ protected Thread newThread(Runnable r, String name) { - return new EnhanceThread(this.group, r, name); + return new SpecificThread(this.group, r, name); } } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/xyz/FileKit.java b/bus-core/src/main/java/org/miaixz/bus/core/xyz/FileKit.java index b2e8194d37..823af6f5f5 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/xyz/FileKit.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/xyz/FileKit.java @@ -1219,23 +1219,37 @@ public static boolean isFile(final File file) { /** * 检查两个文件是否是同一个文件 - * 所谓文件相同,是指File对象是否指向同一个文件或文件夹 + * 所谓文件相同,是指File对象是否指向同一个文件或文件夹,规则为: + *+ *
* - * @param file1 文件1 - * @param file2 文件2 + * @param file1 文件1,可以为{@code null} + * @param file2 文件2,可以为{@code null} * @return 是否相同 - * @throws InternalException IO异常 */ - public static boolean equals(final File file1, final File file2) throws InternalException { - Assert.notNull(file1); - Assert.notNull(file2); - if (!file1.exists() || !file2.exists()) { - // 两个文件都不存在判断其路径是否相同, 对于一个存在一个不存在的情况,一定不相同 - return !file1.exists()// - && !file2.exists()// - && pathEquals(file1, file2); + public static boolean equals(final File file1, final File file2) { + // 两者都为null判定为相同 + if (null == file1 || null == file2) { + return null == file1 && null == file2; + } + + final boolean exists1 = file1.exists(); + final boolean exists2 = file2.exists(); + + // 当两个文件都存在时,检查是否为同一个文件 + if (exists1 && exists2) { + return PathResolve.isSameFile(file1.toPath(), file2.toPath()); + } + + // 都不存在时,检查路径是否相同 + if (!exists1 && !exists2) { + return pathEquals(file1, file2); } - return equals(file1.toPath(), file2.toPath()); + + return false; } /** From 9da15cd2a177a3c2be34ef9dc0bf2f5c72f859e6 Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Wed, 19 Jun 2024 17:57:29 +0800 Subject: [PATCH 04/20] fix http and https --- .../miaixz/bus/core/{lang => net}/Header.java | 2 +- .../miaixz/bus/core/{lang => net}/Http.java | 3 +- .../bus/core/net/tls/SSLContextBuilder.java | 2 +- .../java/org/miaixz/bus/http/Address.java | 2 +- .../java/org/miaixz/bus/http/Builder.java | 11 +- .../java/org/miaixz/bus/http/Headers.java | 66 +------ .../main/java/org/miaixz/bus/http/Httpv.java | 4 +- .../main/java/org/miaixz/bus/http/Httpx.java | 6 +- .../java/org/miaixz/bus/http/Protocol.java | 2 +- .../java/org/miaixz/bus/http/Request.java | 4 +- .../java/org/miaixz/bus/http/Response.java | 4 +- .../main/java/org/miaixz/bus/http/UnoUrl.java | 2 +- .../bus/http/accord/ConnectInterceptor.java | 2 +- .../bus/http/accord/RealConnection.java | 12 +- .../miaixz/bus/http/bodys/MultipartBody.java | 2 +- .../java/org/miaixz/bus/http/cache/Cache.java | 4 +- .../miaixz/bus/http/cache/CacheControl.java | 2 +- .../bus/http/cache/CacheInterceptor.java | 4 +- .../miaixz/bus/http/cache/CacheStrategy.java | 4 +- .../http/metric/http/BridgeInterceptor.java | 2 +- .../metric/http/CallServerInterceptor.java | 4 +- .../miaixz/bus/http/metric/http/Hpack.java | 163 +++++++++--------- .../bus/http/metric/http/Http1Codec.java | 2 +- .../bus/http/metric/http/Http2Codec.java | 24 +-- .../bus/http/metric/http/Http2Connection.java | 77 ++++----- .../{ErrorCode.java => Http2ErrorCode.java} | 8 +- .../bus/http/metric/http/Http2Header.java | 94 ++++++++++ .../bus/http/metric/http/Http2Reader.java | 26 ++- .../http/Http2Settings.java} | 11 +- .../bus/http/metric/http/Http2Stream.java | 20 +-- .../bus/http/metric/http/Http2Writer.java | 16 +- .../bus/http/metric/http/PushObserver.java | 13 +- .../http/metric/http/RetryAndFollowUp.java | 4 +- .../bus/http/metric/http/StreamException.java | 4 +- .../bus/http/plugin/httpv/CoverCall.java | 2 +- .../bus/http/plugin/httpv/CoverHttp.java | 2 +- .../bus/http/plugin/httpv/CoverTasks.java | 2 +- .../bus/http/plugin/httpv/ResultBody.java | 6 +- .../bus/http/plugin/httpx/HttpProxy.java | 2 +- .../bus/http/plugin/httpz/PostRequest.java | 2 +- .../bus/http/plugin/httpz/PutRequest.java | 2 +- .../bus/http/secure/CertificatePinner.java | 2 +- .../bus/http/secure/NetAuthenticator.java | 2 +- .../miaixz/bus/http/socket/RealWebSocket.java | 4 +- .../java/org/miaixz/bus/image/Device.java | 2 +- .../main/java/org/miaixz/bus/image/Node.java | 2 +- .../java/org/miaixz/bus/image/Option.java | 2 +- .../image/galaxy/media/AbstractStowrs.java | 2 +- .../image/galaxy/media/StowrsSingleFile.java | 2 +- .../bus/image/metric/WebApplication.java | 2 +- .../notify/metric/aliyun/AliyunProvider.java | 2 +- .../metric/dingtalk/DingTalkProvider.java | 2 +- .../notify/metric/emay/EmaySmsProvider.java | 2 +- .../metric/huawei/HuaweiSmsProvider.java | 6 +- .../metric/jdcloud/JdcloudSmsProvider.java | 4 +- .../notify/metric/jpush/JpushSmsProvider.java | 2 +- .../metric/netease/NeteaseProvider.java | 2 +- .../notify/metric/upyun/UpyunSmsProvider.java | 2 +- .../java/org/miaixz/bus/oauth/Checker.java | 2 +- .../oauth/metric/alipay/AlipayProvider.java | 2 +- .../oauth/metric/amazon/AmazonProvider.java | 2 +- .../bus/oauth/metric/eleme/ElemeProvider.java | 2 +- .../metric/linkedin/LinkedinProvider.java | 2 +- .../stackoverflow/StackOverflowProvider.java | 2 +- .../oauth/metric/twitter/TwitterProvider.java | 2 +- .../main/java/org/miaixz/bus/pay/Builder.java | 3 +- .../main/java/org/miaixz/bus/pay/Complex.java | 2 +- .../bus/pay/metric/AbstractProvider.java | 6 +- .../bus/pay/metric/alipay/AliPayProvider.java | 2 +- .../pay/metric/wechat/WechatPayProvider.java | 2 +- .../starter/bridge/BridgeVerticleService.java | 2 +- .../bus/starter/cors/CorsProperties.java | 2 +- .../starter/wrapper/GenieWrapperHandler.java | 2 +- .../starter/wrapper/WrapperConfiguration.java | 2 +- .../bus/storage/metric/AbstractProvider.java | 2 +- 75 files changed, 373 insertions(+), 332 deletions(-) rename bus-core/src/main/java/org/miaixz/bus/core/{lang => net}/Header.java (99%) rename bus-core/src/main/java/org/miaixz/bus/core/{lang => net}/Http.java (99%) rename bus-http/src/main/java/org/miaixz/bus/http/metric/http/{ErrorCode.java => Http2ErrorCode.java} (93%) create mode 100644 bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Header.java rename bus-http/src/main/java/org/miaixz/bus/http/{Settings.java => metric/http/Http2Settings.java} (95%) diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/Header.java b/bus-core/src/main/java/org/miaixz/bus/core/net/Header.java similarity index 99% rename from bus-core/src/main/java/org/miaixz/bus/core/lang/Header.java rename to bus-core/src/main/java/org/miaixz/bus/core/net/Header.java index bb8e34e96b..c3d9ce36b3 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/Header.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/Header.java @@ -25,7 +25,7 @@ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */ -package org.miaixz.bus.core.lang; +package org.miaixz.bus.core.net; /** * Header 常量 diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/Http.java b/bus-core/src/main/java/org/miaixz/bus/core/net/Http.java similarity index 99% rename from bus-core/src/main/java/org/miaixz/bus/core/lang/Http.java rename to bus-core/src/main/java/org/miaixz/bus/core/net/Http.java index 266a5a3a1f..2452ba890b 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/Http.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/Http.java @@ -1,6 +1,7 @@ -package org.miaixz.bus.core.lang; +package org.miaixz.bus.core.net; +import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.xyz.StringKit; /** diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java index 1312f51c52..834b87d0a3 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java @@ -28,9 +28,9 @@ package org.miaixz.bus.core.net.tls; import org.miaixz.bus.core.Builder; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Protocol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.ArrayKit; import org.miaixz.bus.core.xyz.StringKit; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Address.java b/bus-http/src/main/java/org/miaixz/bus/http/Address.java index e79f923472..3d4459f1aa 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Address.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Address.java @@ -27,8 +27,8 @@ */ package org.miaixz.bus.http; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.accord.Connection; import org.miaixz.bus.http.accord.ConnectionSuite; import org.miaixz.bus.http.secure.Authenticator; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Builder.java b/bus-http/src/main/java/org/miaixz/bus/http/Builder.java index 19fa6f6be1..467cd639d6 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Builder.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Builder.java @@ -37,6 +37,7 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.metric.Internal; +import org.miaixz.bus.http.metric.http.Http2Header; import java.io.IOException; import java.io.InterruptedIOException; @@ -597,18 +598,18 @@ private static String inet6AddressToAscii(byte[] address) { return result.readUtf8(); } - public static Headers toHeaders(List- 当两个文件都为{@code null}时,返回{@code true}
+ *- 当两个文件都存在时,检查是否为同一个文件
+ *- 当两个文件都不存在时,检查路径是否一致
+ *headerBlock) { + public static Headers toHeaders(List headerBlock) { Headers.Builder builder = new Headers.Builder(); - for (Headers.Header header : headerBlock) { + for (Http2Header header : headerBlock) { Internal.instance.addLenient(builder, header.name.utf8(), header.value.utf8()); } return builder.build(); } - public static List toHeaderBlock(Headers headers) { - List result = new ArrayList<>(); + public static List toHeaderBlock(Headers headers) { + List result = new ArrayList<>(); for (int i = 0; i < headers.size(); i++) { - result.add(new Headers.Header(headers.name(i), headers.value(i))); + result.add(new Http2Header(headers.name(i), headers.value(i))); } return result; } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Headers.java b/bus-http/src/main/java/org/miaixz/bus/http/Headers.java index 7696853d5a..f503c58673 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Headers.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Headers.java @@ -27,11 +27,10 @@ */ package org.miaixz.bus.http; -import org.miaixz.bus.core.io.ByteString; import org.miaixz.bus.core.io.buffer.Buffer; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.metric.CookieJar; import org.miaixz.bus.http.secure.Challenge; @@ -789,67 +788,4 @@ public Headers build() { } } - /** - * HTTP header: the name is an ASCII string, but the value can be UTF-8. - */ - public static class Header { - - // Special header names defined in HTTP/2 spec. - public static final ByteString PSEUDO_PREFIX = ByteString.encodeUtf8(Symbol.COLON); - public static final ByteString RESPONSE_STATUS = ByteString.encodeUtf8(Http.RESPONSE_STATUS_UTF8); - public static final ByteString TARGET_METHOD = ByteString.encodeUtf8(Http.TARGET_METHOD_UTF8); - public static final ByteString TARGET_PATH = ByteString.encodeUtf8(Http.TARGET_PATH_UTF8); - public static final ByteString TARGET_SCHEME = ByteString.encodeUtf8(Http.TARGET_SCHEME_UTF8); - public static final ByteString TARGET_AUTHORITY = ByteString.encodeUtf8(Http.TARGET_AUTHORITY_UTF8); - - - /** - * Name in case-insensitive ASCII encoding. - */ - public final ByteString name; - /** - * Value in UTF-8 encoding. - */ - public final ByteString value; - public final int hpackSize; - - // TODO: search for toLowerCase and consider moving logic here. - public Header(String name, String value) { - this(ByteString.encodeUtf8(name), ByteString.encodeUtf8(value)); - } - - public Header(ByteString name, String value) { - this(name, ByteString.encodeUtf8(value)); - } - - public Header(ByteString name, ByteString value) { - this.name = name; - this.value = value; - this.hpackSize = 32 + name.size() + value.size(); - } - - @Override - public boolean equals(Object other) { - if (other instanceof Header) { - Header that = (Header) other; - return this.name.equals(that.name) - && this.value.equals(that.value); - } - return false; - } - - @Override - public int hashCode() { - int result = 17; - result = 31 * result + name.hashCode(); - result = 31 * result + value.hashCode(); - return result; - } - - @Override - public String toString() { - return String.format("%s: %s", name.utf8(), value.utf8()); - } - } - } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java b/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java index 50da544801..29f3cbdc4e 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java @@ -27,11 +27,11 @@ */ package org.miaixz.bus.http; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.plugin.httpv.*; import org.miaixz.bus.http.socket.WebSocket; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Httpx.java b/bus-http/src/main/java/org/miaixz/bus/http/Httpx.java index 95bd437082..8ee51ddb25 100755 --- a/bus-http/src/main/java/org/miaixz/bus/http/Httpx.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Httpx.java @@ -27,8 +27,12 @@ */ package org.miaixz.bus.http; -import org.miaixz.bus.core.lang.*; +import org.miaixz.bus.core.lang.Charset; +import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.lang.Normal; +import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.net.tls.SSLContextBuilder; import org.miaixz.bus.core.xyz.ArrayKit; import org.miaixz.bus.core.xyz.MapKit; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java b/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java index 585c79aea8..3b0c5fe9dd 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Http; import java.io.IOException; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Request.java b/bus-http/src/main/java/org/miaixz/bus/http/Request.java index 1fe6bbfd8d..6ebdd75264 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Request.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Request.java @@ -27,10 +27,10 @@ */ package org.miaixz.bus.http; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.bodys.RequestBody; import org.miaixz.bus.http.cache.CacheControl; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Response.java b/bus-http/src/main/java/org/miaixz/bus/http/Response.java index 8a25ccd122..d11da468fc 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Response.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Response.java @@ -29,9 +29,9 @@ import org.miaixz.bus.core.io.buffer.Buffer; import org.miaixz.bus.core.io.source.BufferSource; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.accord.Exchange; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.cache.CacheControl; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java b/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java index 876e397c8b..925d44d8f7 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java @@ -29,9 +29,9 @@ import org.miaixz.bus.core.io.buffer.Buffer; import org.miaixz.bus.core.lang.Charset; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import java.net.MalformedURLException; import java.net.URI; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java index dfe130d440..ee777b7671 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http.accord; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.Httpd; import org.miaixz.bus.http.Request; import org.miaixz.bus.http.Response; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java index cbd62ca6cd..3063581441 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java @@ -30,10 +30,10 @@ import org.miaixz.bus.core.Version; import org.miaixz.bus.core.io.sink.BufferSink; import org.miaixz.bus.core.io.source.BufferSource; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.RevisedException; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.net.tls.TrustAnyHostnameVerifier; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; @@ -634,7 +634,7 @@ public boolean isHealthy(boolean doExtensiveChecks) { */ @Override public void onStream(Http2Stream stream) throws IOException { - stream.close(ErrorCode.REFUSED_STREAM, null); + stream.close(Http2ErrorCode.REFUSED_STREAM, null); } /** @@ -668,15 +668,15 @@ void trackFailure(IOException e) { assert (!Thread.holdsLock(connectionPool)); synchronized (connectionPool) { if (e instanceof StreamException) { - ErrorCode errorCode = ((StreamException) e).errorCode; - if (errorCode == ErrorCode.REFUSED_STREAM) { + Http2ErrorCode errorCode = ((StreamException) e).errorCode; + if (errorCode == Http2ErrorCode.REFUSED_STREAM) { // Retry REFUSED_STREAM errors once on the same connection. refusedStreamCount++; if (refusedStreamCount > 1) { noNewExchanges = true; routeFailureCount++; } - } else if (errorCode != ErrorCode.CANCEL) { + } else if (errorCode != Http2ErrorCode.CANCEL) { // Keep the connection for CANCEL errors. Everything else wants a fresh connection. noNewExchanges = true; routeFailureCount++; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/bodys/MultipartBody.java b/bus-http/src/main/java/org/miaixz/bus/http/bodys/MultipartBody.java index 263289f8ad..dd1e8a05af 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/bodys/MultipartBody.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/bodys/MultipartBody.java @@ -30,9 +30,9 @@ import org.miaixz.bus.core.io.ByteString; import org.miaixz.bus.core.io.buffer.Buffer; import org.miaixz.bus.core.io.sink.BufferSink; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.Headers; import java.io.IOException; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java index 34079ae9d4..741138b1bb 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java @@ -35,10 +35,10 @@ import org.miaixz.bus.core.io.source.AssignSource; import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.io.source.Source; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.net.tls.TlsVersion; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheControl.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheControl.java index f3cb725ce2..0ae4c51984 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheControl.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheControl.java @@ -27,9 +27,9 @@ */ package org.miaixz.bus.http.cache; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.Headers; import java.util.concurrent.TimeUnit; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java index fd3d1a2036..d16ef8d49e 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java @@ -33,9 +33,9 @@ import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.io.source.Source; import org.miaixz.bus.core.io.timout.Timeout; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.bodys.RealResponseBody; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java index 1f3ad81d2f..005a278127 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java @@ -27,8 +27,8 @@ */ package org.miaixz.bus.http.cache; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.Builder; import org.miaixz.bus.http.Headers; import org.miaixz.bus.http.Request; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java index fcdd9649f7..caa9a7ad81 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java @@ -29,9 +29,9 @@ import org.miaixz.bus.core.Version; import org.miaixz.bus.core.io.source.GzipSource; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.bodys.RealResponseBody; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java index 400d4f9ba9..e47eebe807 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java @@ -28,8 +28,8 @@ package org.miaixz.bus.http.metric.http; import org.miaixz.bus.core.io.sink.BufferSink; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.Builder; import org.miaixz.bus.http.Request; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java index 056cc55528..5e9f2b0c2f 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java @@ -31,13 +31,12 @@ import org.miaixz.bus.core.io.buffer.Buffer; import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.io.source.Source; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.core.xyz.StringKit; -import org.miaixz.bus.http.Headers; import java.io.IOException; import java.util.*; @@ -52,68 +51,68 @@ */ class Hpack { - static final Headers.Header[] STATIC_HEADER_TABLE = new Headers.Header[]{ - new Headers.Header(Headers.Header.TARGET_AUTHORITY, Normal.EMPTY), - new Headers.Header(Headers.Header.TARGET_METHOD, Http.GET), - new Headers.Header(Headers.Header.TARGET_METHOD, Http.POST), - new Headers.Header(Headers.Header.TARGET_PATH, Symbol.SLASH), - new Headers.Header(Headers.Header.TARGET_PATH, "/index.html"), - new Headers.Header(Headers.Header.TARGET_SCHEME, Http.HTTP), - new Headers.Header(Headers.Header.TARGET_SCHEME, Http.HTTPS), - new Headers.Header(Headers.Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_OK)), - new Headers.Header(Headers.Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NO_CONTENT)), - new Headers.Header(Headers.Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_PARTIAL)), - new Headers.Header(Headers.Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NOT_MODIFIED)), - new Headers.Header(Headers.Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_BAD_REQUEST)), - new Headers.Header(Headers.Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NOT_FOUND)), - new Headers.Header(Headers.Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_INTERNAL_ERROR)), - new Headers.Header(Header.ACCEPT_CHARSET, Normal.EMPTY), - new Headers.Header(Header.ACCEPT_ENCODING, "gzip, deflate"), - new Headers.Header(Header.ACCEPT_LANGUAGE, Normal.EMPTY), - new Headers.Header(Header.ACCEPT_RANGES, Normal.EMPTY), - new Headers.Header(Header.ACCEPT, Normal.EMPTY), - new Headers.Header(Header.ACCESS_CONTROL_ALLOW_ORIGIN, Normal.EMPTY), - new Headers.Header(Header.AGE, Normal.EMPTY), - new Headers.Header(Header.ALLOW, Normal.EMPTY), - new Headers.Header(Header.AUTHORIZATION, Normal.EMPTY), - new Headers.Header(Header.CACHE_CONTROL, Normal.EMPTY), - new Headers.Header(Header.CONTENT_DISPOSITION, Normal.EMPTY), - new Headers.Header(Header.CONTENT_ENCODING, Normal.EMPTY), - new Headers.Header(Header.CONTENT_LANGUAGE, Normal.EMPTY), - new Headers.Header(Header.CONTENT_LENGTH, Normal.EMPTY), - new Headers.Header(Header.CONTENT_LOCATION, Normal.EMPTY), - new Headers.Header(Header.CONTENT_RANGE, Normal.EMPTY), - new Headers.Header(Header.CONTENT_TYPE, Normal.EMPTY), - new Headers.Header(Header.COOKIE, Normal.EMPTY), - new Headers.Header(Header.DATE, Normal.EMPTY), - new Headers.Header(Header.ETAG, Normal.EMPTY), - new Headers.Header(Header.EXPECT, Normal.EMPTY), - new Headers.Header(Header.EXPIRES, Normal.EMPTY), - new Headers.Header(Header.FROM, Normal.EMPTY), - new Headers.Header(Header.HOST, Normal.EMPTY), - new Headers.Header(Header.IF_MATCH, Normal.EMPTY), - new Headers.Header(Header.IF_MODIFIED_SINCE, Normal.EMPTY), - new Headers.Header(Header.IF_NONE_MATCH, Normal.EMPTY), - new Headers.Header(Header.IF_RANGE, Normal.EMPTY), - new Headers.Header(Header.IF_UNMODIFIED_SINCE, Normal.EMPTY), - new Headers.Header(Header.LAST_MODIFIED, Normal.EMPTY), - new Headers.Header(Header.LINK, Normal.EMPTY), - new Headers.Header(Header.LOCATION, Normal.EMPTY), - new Headers.Header(Header.MAX_FORWARDS, Normal.EMPTY), - new Headers.Header(Header.PROXY_AUTHENTICATE, Normal.EMPTY), - new Headers.Header(Header.PROXY_AUTHORIZATION, Normal.EMPTY), - new Headers.Header(Header.RANGE, Normal.EMPTY), - new Headers.Header(Header.REFERER, Normal.EMPTY), - new Headers.Header(Header.REFRESH, Normal.EMPTY), - new Headers.Header(Header.RETRY_AFTER, Normal.EMPTY), - new Headers.Header(Header.SERVER, Normal.EMPTY), - new Headers.Header(Header.SET_COOKIE, Normal.EMPTY), - new Headers.Header(Header.STRICT_TRANSPORT_SECURITY, Normal.EMPTY), - new Headers.Header(Header.TRANSFER_ENCODING, Normal.EMPTY), - new Headers.Header(Header.USER_AGENT, Normal.EMPTY), - new Headers.Header(Header.VARY, Normal.EMPTY), - new Headers.Header(Header.VIA, Normal.EMPTY), - new Headers.Header(Header.WWW_AUTHENTICATE, Normal.EMPTY) + static final Http2Header[] STATIC_HEADER_TABLE = new Http2Header[]{ + new Http2Header(Http2Header.TARGET_AUTHORITY, Normal.EMPTY), + new Http2Header(Http2Header.TARGET_METHOD, Http.GET), + new Http2Header(Http2Header.TARGET_METHOD, Http.POST), + new Http2Header(Http2Header.TARGET_PATH, Symbol.SLASH), + new Http2Header(Http2Header.TARGET_PATH, "/index.html"), + new Http2Header(Http2Header.TARGET_SCHEME, Http.HTTP), + new Http2Header(Http2Header.TARGET_SCHEME, Http.HTTPS), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_OK)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NO_CONTENT)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_PARTIAL)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NOT_MODIFIED)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_BAD_REQUEST)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NOT_FOUND)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_INTERNAL_ERROR)), + new Http2Header(Header.ACCEPT_CHARSET, Normal.EMPTY), + new Http2Header(Header.ACCEPT_ENCODING, "gzip, deflate"), + new Http2Header(Header.ACCEPT_LANGUAGE, Normal.EMPTY), + new Http2Header(Header.ACCEPT_RANGES, Normal.EMPTY), + new Http2Header(Header.ACCEPT, Normal.EMPTY), + new Http2Header(Header.ACCESS_CONTROL_ALLOW_ORIGIN, Normal.EMPTY), + new Http2Header(Header.AGE, Normal.EMPTY), + new Http2Header(Header.ALLOW, Normal.EMPTY), + new Http2Header(Header.AUTHORIZATION, Normal.EMPTY), + new Http2Header(Header.CACHE_CONTROL, Normal.EMPTY), + new Http2Header(Header.CONTENT_DISPOSITION, Normal.EMPTY), + new Http2Header(Header.CONTENT_ENCODING, Normal.EMPTY), + new Http2Header(Header.CONTENT_LANGUAGE, Normal.EMPTY), + new Http2Header(Header.CONTENT_LENGTH, Normal.EMPTY), + new Http2Header(Header.CONTENT_LOCATION, Normal.EMPTY), + new Http2Header(Header.CONTENT_RANGE, Normal.EMPTY), + new Http2Header(Header.CONTENT_TYPE, Normal.EMPTY), + new Http2Header(Header.COOKIE, Normal.EMPTY), + new Http2Header(Header.DATE, Normal.EMPTY), + new Http2Header(Header.ETAG, Normal.EMPTY), + new Http2Header(Header.EXPECT, Normal.EMPTY), + new Http2Header(Header.EXPIRES, Normal.EMPTY), + new Http2Header(Header.FROM, Normal.EMPTY), + new Http2Header(Header.HOST, Normal.EMPTY), + new Http2Header(Header.IF_MATCH, Normal.EMPTY), + new Http2Header(Header.IF_MODIFIED_SINCE, Normal.EMPTY), + new Http2Header(Header.IF_NONE_MATCH, Normal.EMPTY), + new Http2Header(Header.IF_RANGE, Normal.EMPTY), + new Http2Header(Header.IF_UNMODIFIED_SINCE, Normal.EMPTY), + new Http2Header(Header.LAST_MODIFIED, Normal.EMPTY), + new Http2Header(Header.LINK, Normal.EMPTY), + new Http2Header(Header.LOCATION, Normal.EMPTY), + new Http2Header(Header.MAX_FORWARDS, Normal.EMPTY), + new Http2Header(Header.PROXY_AUTHENTICATE, Normal.EMPTY), + new Http2Header(Header.PROXY_AUTHORIZATION, Normal.EMPTY), + new Http2Header(Header.RANGE, Normal.EMPTY), + new Http2Header(Header.REFERER, Normal.EMPTY), + new Http2Header(Header.REFRESH, Normal.EMPTY), + new Http2Header(Header.RETRY_AFTER, Normal.EMPTY), + new Http2Header(Header.SERVER, Normal.EMPTY), + new Http2Header(Header.SET_COOKIE, Normal.EMPTY), + new Http2Header(Header.STRICT_TRANSPORT_SECURITY, Normal.EMPTY), + new Http2Header(Header.TRANSFER_ENCODING, Normal.EMPTY), + new Http2Header(Header.USER_AGENT, Normal.EMPTY), + new Http2Header(Header.VARY, Normal.EMPTY), + new Http2Header(Header.VIA, Normal.EMPTY), + new Http2Header(Header.WWW_AUTHENTICATE, Normal.EMPTY) }; static final Map NAME_TO_FIRST_INDEX = nameToFirstIndex(); private static final int PREFIX_4_BITS = 0x0f; @@ -150,11 +149,11 @@ static ByteString checkLowercase(ByteString name) throws IOException { static class Reader { - private final List headerList = new ArrayList<>(); + private final List headerList = new ArrayList<>(); private final BufferSource source; private final int headerTableSizeSetting; - Headers.Header[] dynamicTable = new Headers.Header[8]; + Http2Header[] dynamicTable = new Http2Header[8]; int nextHeaderIndex = dynamicTable.length - 1; int headerCount = 0; int dynamicTableByteCount = 0; @@ -240,15 +239,15 @@ void readHeaders() throws IOException { } } - public List getAndResetHeaderList() { - List result = new ArrayList<>(headerList); + public List getAndResetHeaderList() { + List result = new ArrayList<>(headerList); headerList.clear(); return result; } private void readIndexedHeader(int index) throws IOException { if (isStaticHeader(index)) { - Headers.Header staticEntry = STATIC_HEADER_TABLE[index]; + Http2Header staticEntry = STATIC_HEADER_TABLE[index]; headerList.add(staticEntry); } else { int dynamicTableIndex = dynamicTableIndex(index - STATIC_HEADER_TABLE.length); @@ -266,26 +265,26 @@ private int dynamicTableIndex(int index) { private void readLiteralHeaderWithoutIndexingIndexedName(int index) throws IOException { ByteString name = getName(index); ByteString value = readByteString(); - headerList.add(new Headers.Header(name, value)); + headerList.add(new Http2Header(name, value)); } private void readLiteralHeaderWithoutIndexingNewName() throws IOException { ByteString name = checkLowercase(readByteString()); ByteString value = readByteString(); - headerList.add(new Headers.Header(name, value)); + headerList.add(new Http2Header(name, value)); } private void readLiteralHeaderWithIncrementalIndexingIndexedName(int nameIndex) throws IOException { ByteString name = getName(nameIndex); ByteString value = readByteString(); - insertIntoDynamicTable(-1, new Headers.Header(name, value)); + insertIntoDynamicTable(-1, new Http2Header(name, value)); } private void readLiteralHeaderWithIncrementalIndexingNewName() throws IOException { ByteString name = checkLowercase(readByteString()); ByteString value = readByteString(); - insertIntoDynamicTable(-1, new Headers.Header(name, value)); + insertIntoDynamicTable(-1, new Http2Header(name, value)); } private ByteString getName(int index) throws IOException { @@ -308,7 +307,7 @@ private boolean isStaticHeader(int index) { /** * index == -1 when new. */ - private void insertIntoDynamicTable(int index, Headers.Header entry) { + private void insertIntoDynamicTable(int index, Http2Header entry) { headerList.add(entry); int delta = entry.hpackSize; @@ -328,7 +327,7 @@ private void insertIntoDynamicTable(int index, Headers.Header entry) { if (index == -1) { // Adding a value to the dynamic table. if (headerCount + 1 > dynamicTable.length) { // Need to grow the dynamic table. - Headers.Header[] doubled = new Headers.Header[dynamicTable.length * 2]; + Http2Header[] doubled = new Http2Header[dynamicTable.length * 2]; System.arraycopy(dynamicTable, 0, doubled, dynamicTable.length, dynamicTable.length); nextHeaderIndex = dynamicTable.length - 1; dynamicTable = doubled; @@ -400,7 +399,7 @@ static class Writer { int headerTableSizeSetting; int maxDynamicTableByteCount; // Visible for testing. - Headers.Header[] dynamicTable = new Headers.Header[8]; + Http2Header[] dynamicTable = new Http2Header[8]; // Array is populated back to front, so new entries always have lowest index. int nextHeaderIndex = dynamicTable.length - 1; int headerCount = 0; @@ -451,7 +450,7 @@ private int evictToRecoverBytes(int bytesToRecover) { return entriesToEvict; } - private void insertIntoDynamicTable(Headers.Header entry) { + private void insertIntoDynamicTable(Http2Header entry) { int delta = entry.hpackSize; // if the new or replacement header is too big, drop all entries. @@ -465,7 +464,7 @@ private void insertIntoDynamicTable(Headers.Header entry) { evictToRecoverBytes(bytesToRecover); if (headerCount + 1 > dynamicTable.length) { // Need to grow the dynamic table. - Headers.Header[] doubled = new Headers.Header[dynamicTable.length * 2]; + Http2Header[] doubled = new Http2Header[dynamicTable.length * 2]; System.arraycopy(dynamicTable, 0, doubled, dynamicTable.length, dynamicTable.length); nextHeaderIndex = dynamicTable.length - 1; dynamicTable = doubled; @@ -479,7 +478,7 @@ private void insertIntoDynamicTable(Headers.Header entry) { /** * This does not use "never indexed" semantics for sensitive headers. */ - void writeHeaders(List headerBlock) throws IOException { + void writeHeaders(List headerBlock) throws IOException { if (emitDynamicTableSizeUpdate) { if (smallestHeaderTableSizeSetting < maxDynamicTableByteCount) { // Multiple dynamic table size updates! @@ -491,7 +490,7 @@ void writeHeaders(List headerBlock) throws IOException { } for (int i = 0, size = headerBlock.size(); i < size; i++) { - Headers.Header header = headerBlock.get(i); + Http2Header header = headerBlock.get(i); ByteString name = header.name.toAsciiLowercase(); ByteString value = header.value; int headerIndex = -1; @@ -535,7 +534,7 @@ void writeHeaders(List headerBlock) throws IOException { writeByteString(name); writeByteString(value); insertIntoDynamicTable(header); - } else if (name.startsWith(Headers.Header.PSEUDO_PREFIX) && !Headers.Header.TARGET_AUTHORITY.equals(name)) { + } else if (name.startsWith(Http2Header.PSEUDO_PREFIX) && !Http2Header.TARGET_AUTHORITY.equals(name)) { // Follow Chromes lead - only include the :authority pseudo header, but exclude all other // pseudo headers. Literal Header Field without Indexing - Indexed Name. writeInt(headerNameIndex, PREFIX_4_BITS, 0); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http1Codec.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http1Codec.java index 604b0c2377..9e89f68a60 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http1Codec.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http1Codec.java @@ -34,9 +34,9 @@ import org.miaixz.bus.core.io.source.Source; import org.miaixz.bus.core.io.timout.AssignTimeout; import org.miaixz.bus.core.io.timout.Timeout; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.RealConnection; import org.miaixz.bus.http.metric.Internal; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java index 763ed4857d..34f07d0347 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java @@ -29,8 +29,8 @@ import org.miaixz.bus.core.io.sink.Sink; import org.miaixz.bus.core.io.source.Source; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.RealConnection; @@ -94,23 +94,23 @@ public Http2Codec(Httpd client, RealConnection realConnection, : Protocol.HTTP_2; } - public static List http2HeadersList(Request request) { + public static List http2HeadersList(Request request) { Headers headers = request.headers(); - List result = new ArrayList<>(headers.size() + 4); - result.add(new Headers.Header(Headers.Header.TARGET_METHOD, request.method())); - result.add(new Headers.Header(Headers.Header.TARGET_PATH, RequestLine.requestPath(request.url()))); + List result = new ArrayList<>(headers.size() + 4); + result.add(new Http2Header(Http2Header.TARGET_METHOD, request.method())); + result.add(new Http2Header(Http2Header.TARGET_PATH, RequestLine.requestPath(request.url()))); String host = request.header("Host"); if (host != null) { - result.add(new Headers.Header(Headers.Header.TARGET_AUTHORITY, host)); // Optional. + result.add(new Http2Header(Http2Header.TARGET_AUTHORITY, host)); // Optional. } - result.add(new Headers.Header(Headers.Header.TARGET_SCHEME, request.url().scheme())); + result.add(new Http2Header(Http2Header.TARGET_SCHEME, request.url().scheme())); for (int i = 0, size = headers.size(); i < size; i++) { // header names must be lowercase. String name = StringKit.upperFirst(headers.name(i)); if (!HTTP_2_SKIPPED_REQUEST_HEADERS.contains(name) || name.equals(Header.TE) && "trailers".equals(headers.value(i))) { - result.add(new Headers.Header(name, headers.value(i))); + result.add(new Http2Header(name, headers.value(i))); } } return result; @@ -156,12 +156,12 @@ public void writeRequestHeaders(Request request) throws IOException { if (stream != null) return; boolean hasRequestBody = request.body() != null; - List requestHeaders = http2HeadersList(request); + List requestHeaders = http2HeadersList(request); stream = connection.newStream(requestHeaders, hasRequestBody); // We may have been asked to cancel while creating the new stream and sending the request // headers, but there was still no stream to close. if (canceled) { - stream.closeLater(ErrorCode.CANCEL); + stream.closeLater(Http2ErrorCode.CANCEL); throw new IOException("Canceled"); } stream.readTimeout().timeout(chain.readTimeoutMillis(), TimeUnit.MILLISECONDS); @@ -206,7 +206,7 @@ public Headers trailers() throws IOException { @Override public void cancel() { canceled = true; - if (stream != null) stream.closeLater(ErrorCode.CANCEL); + if (stream != null) stream.closeLater(Http2ErrorCode.CANCEL); } } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Connection.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Connection.java index 2a48bd9f7f..9251d6e7a0 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Connection.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Connection.java @@ -31,11 +31,10 @@ import org.miaixz.bus.core.io.buffer.Buffer; import org.miaixz.bus.core.io.sink.BufferSink; import org.miaixz.bus.core.io.source.BufferSource; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.Headers; -import org.miaixz.bus.http.Settings; import org.miaixz.bus.http.metric.NamedRunnable; import org.miaixz.bus.logger.Logger; @@ -100,7 +99,7 @@ public class Http2Connection implements Closeable { /** * 我们从对等点接收设置. */ - final Settings peerSettings = new Settings(); + final Http2Settings peerSettings = new Http2Settings(); final Socket socket; final Http2Writer writer; final ReaderRunnable readerRunnable; @@ -127,7 +126,7 @@ public class Http2Connection implements Closeable { /** * 设置我们与对等点通信 */ - Settings settings = new Settings(); + Http2Settings settings = new Http2Settings(); private boolean shutdown; // Total number of pings send and received of the corresponding types. All guarded by this. private long intervalPingsSent = 0L; @@ -218,7 +217,7 @@ synchronized void updateConnectionFlowControl(long read) { * @return http请求流 * @throws IOException 异常 */ - public Http2Stream pushStream(int associatedStreamId, List requestHeaders, boolean out) + public Http2Stream pushStream(int associatedStreamId, List requestHeaders, boolean out) throws IOException { if (client) throw new IllegalStateException("Client cannot push requests."); return newStream(associatedStreamId, requestHeaders, out); @@ -230,12 +229,12 @@ public Http2Stream pushStream(int associatedStreamId, List reque * @param out true to create an output stream that we can use to send data to the remote peer. * Corresponds to {@code FLAG_FIN}. */ - public Http2Stream newStream(List requestHeaders, boolean out) throws IOException { + public Http2Stream newStream(List requestHeaders, boolean out) throws IOException { return newStream(0, requestHeaders, out); } private Http2Stream newStream( - int associatedStreamId, List requestHeaders, boolean out) throws IOException { + int associatedStreamId, List requestHeaders, boolean out) throws IOException { boolean outFinished = !out; boolean inFinished = false; boolean flushHeaders; @@ -245,7 +244,7 @@ private Http2Stream newStream( synchronized (writer) { synchronized (this) { if (nextStreamId > Integer.MAX_VALUE / 2) { - shutdown(ErrorCode.REFUSED_STREAM); + shutdown(Http2ErrorCode.REFUSED_STREAM); } if (shutdown) { throw new IOException(); @@ -274,7 +273,7 @@ private Http2Stream newStream( return stream; } - void writeHeaders(int streamId, boolean outFinished, List alternating) + void writeHeaders(int streamId, boolean outFinished, List alternating) throws IOException { writer.headers(outFinished, streamId, alternating); } @@ -324,7 +323,7 @@ public void writeData(int streamId, boolean outFinished, Buffer buffer, long byt } } - void writeSynResetLater(final int streamId, final ErrorCode errorCode) { + void writeSynResetLater(final int streamId, final Http2ErrorCode errorCode) { try { writerExecutor.execute(new NamedRunnable("Http %s stream %d", connectionName, streamId) { @Override @@ -341,7 +340,7 @@ public void execute() { } } - void writeSynReset(int streamId, ErrorCode statusCode) throws IOException { + void writeSynReset(int streamId, Http2ErrorCode statusCode) throws IOException { writer.rstStream(streamId, statusCode); } @@ -407,7 +406,7 @@ public void flush() throws IOException { * from the remote peer. Existing streams are not impacted. This is intended to permit an endpoint * to gracefully stop accepting new requests without harming previously established streams. */ - public void shutdown(ErrorCode statusCode) throws IOException { + public void shutdown(Http2ErrorCode statusCode) throws IOException { synchronized (writer) { int lastGoodStreamId; synchronized (this) { @@ -427,10 +426,10 @@ public void shutdown(ErrorCode statusCode) throws IOException { */ @Override public void close() { - close(ErrorCode.NO_ERROR, ErrorCode.CANCEL, null); + close(Http2ErrorCode.NO_ERROR, Http2ErrorCode.CANCEL, null); } - void close(ErrorCode connectionCode, ErrorCode streamCode, IOException cause) { + void close(Http2ErrorCode connectionCode, Http2ErrorCode streamCode, IOException cause) { assert (!Thread.holdsLock(this)); try { shutdown(connectionCode); @@ -472,7 +471,7 @@ void close(ErrorCode connectionCode, ErrorCode streamCode, IOException cause) { } private void failConnection(IOException e) { - close(ErrorCode.PROTOCOL_ERROR, ErrorCode.PROTOCOL_ERROR, e); + close(Http2ErrorCode.PROTOCOL_ERROR, Http2ErrorCode.PROTOCOL_ERROR, e); } /** @@ -502,7 +501,7 @@ void start(boolean sendConnectionPreface) throws IOException { /** * Merges {@code settings} into this peer's settings and sends them to the remote peer. */ - public void setSettings(Settings settings) throws IOException { + public void setSettings(Http2Settings settings) throws IOException { synchronized (writer) { synchronized (this) { if (shutdown) { @@ -560,10 +559,10 @@ boolean pushedStream(int streamId) { return streamId != 0 && (streamId & 1) == 0; } - void pushRequestLater(final int streamId, final List requestHeaders) { + void pushRequestLater(final int streamId, final List requestHeaders) { synchronized (this) { if (currentPushRequests.contains(streamId)) { - writeSynResetLater(streamId, ErrorCode.PROTOCOL_ERROR); + writeSynResetLater(streamId, Http2ErrorCode.PROTOCOL_ERROR); return; } currentPushRequests.add(streamId); @@ -576,7 +575,7 @@ public void execute() { boolean cancel = pushObserver.onRequest(streamId, requestHeaders); try { if (cancel) { - writer.rstStream(streamId, ErrorCode.CANCEL); + writer.rstStream(streamId, Http2ErrorCode.CANCEL); synchronized (Http2Connection.this) { currentPushRequests.remove(streamId); } @@ -590,7 +589,7 @@ public void execute() { } } - void pushHeadersLater(final int streamId, final List requestHeaders, + void pushHeadersLater(final int streamId, final List requestHeaders, final boolean inFinished) { try { pushExecutorExecute(new NamedRunnable( @@ -599,7 +598,7 @@ void pushHeadersLater(final int streamId, final List requestHead public void execute() { boolean cancel = pushObserver.onHeaders(streamId, requestHeaders, inFinished); try { - if (cancel) writer.rstStream(streamId, ErrorCode.CANCEL); + if (cancel) writer.rstStream(streamId, Http2ErrorCode.CANCEL); if (cancel || inFinished) { synchronized (Http2Connection.this) { currentPushRequests.remove(streamId); @@ -629,7 +628,7 @@ void pushDataLater(final int streamId, final BufferSource source, final int byte public void execute() { try { boolean cancel = pushObserver.onData(streamId, buffer, byteCount, inFinished); - if (cancel) writer.rstStream(streamId, ErrorCode.CANCEL); + if (cancel) writer.rstStream(streamId, Http2ErrorCode.CANCEL); if (cancel || inFinished) { synchronized (Http2Connection.this) { currentPushRequests.remove(streamId); @@ -641,7 +640,7 @@ public void execute() { }); } - void pushResetLater(final int streamId, final ErrorCode errorCode) { + void pushResetLater(final int streamId, final Http2ErrorCode errorCode) { pushExecutorExecute(new NamedRunnable("Http %s Push Reset[%s]", connectionName, streamId) { @Override public void execute() { @@ -723,7 +722,7 @@ public abstract static class Listener { public static final Listener REFUSE_INCOMING_STREAMS = new Listener() { @Override public void onStream(Http2Stream stream) throws IOException { - stream.close(ErrorCode.REFUSED_STREAM, null); + stream.close(Http2ErrorCode.REFUSED_STREAM, null); } }; @@ -804,19 +803,19 @@ class ReaderRunnable extends NamedRunnable implements Http2Reader.Handler { @Override protected void execute() { - ErrorCode connectionErrorCode = ErrorCode.INTERNAL_ERROR; - ErrorCode streamErrorCode = ErrorCode.INTERNAL_ERROR; + Http2ErrorCode connectionErrorCode = Http2ErrorCode.INTERNAL_ERROR; + Http2ErrorCode streamErrorCode = Http2ErrorCode.INTERNAL_ERROR; IOException errorException = null; try { reader.readConnectionPreface(this); while (reader.nextFrame(false, this)) { } - connectionErrorCode = ErrorCode.NO_ERROR; - streamErrorCode = ErrorCode.CANCEL; + connectionErrorCode = Http2ErrorCode.NO_ERROR; + streamErrorCode = Http2ErrorCode.CANCEL; } catch (IOException e) { errorException = e; - connectionErrorCode = ErrorCode.PROTOCOL_ERROR; - streamErrorCode = ErrorCode.PROTOCOL_ERROR; + connectionErrorCode = Http2ErrorCode.PROTOCOL_ERROR; + streamErrorCode = Http2ErrorCode.PROTOCOL_ERROR; } finally { close(connectionErrorCode, streamErrorCode, errorException); IoKit.close(reader); @@ -832,7 +831,7 @@ public void data(boolean inFinished, int streamId, BufferSource source, int leng } Http2Stream dataStream = getStream(streamId); if (dataStream == null) { - writeSynResetLater(streamId, ErrorCode.PROTOCOL_ERROR); + writeSynResetLater(streamId, Http2ErrorCode.PROTOCOL_ERROR); updateConnectionFlowControl(length); source.skip(length); return; @@ -845,7 +844,7 @@ public void data(boolean inFinished, int streamId, BufferSource source, int leng @Override public void headers(boolean inFinished, int streamId, int associatedStreamId, - List headerBlock) { + List headerBlock) { if (pushedStream(streamId)) { pushHeadersLater(streamId, headerBlock, inFinished); return; @@ -879,7 +878,7 @@ public void execute() { } catch (IOException e) { Logger.info("Http2Connection.Listener failure for " + connectionName, e); try { - newStream.close(ErrorCode.PROTOCOL_ERROR, e); + newStream.close(Http2ErrorCode.PROTOCOL_ERROR, e); } catch (IOException ignored) { } } @@ -894,7 +893,7 @@ public void execute() { } @Override - public void rstStream(int streamId, ErrorCode errorCode) { + public void rstStream(int streamId, Http2ErrorCode errorCode) { if (pushedStream(streamId)) { pushResetLater(streamId, errorCode); return; @@ -906,7 +905,7 @@ public void rstStream(int streamId, ErrorCode errorCode) { } @Override - public void settings(boolean clearPrevious, Settings settings) { + public void settings(boolean clearPrevious, Http2Settings settings) { try { writerExecutor.execute(new NamedRunnable("Http %s ACK Settings", connectionName) { @Override @@ -919,7 +918,7 @@ public void execute() { } } - void applyAndAckSettings(boolean clearPrevious, Settings settings) { + void applyAndAckSettings(boolean clearPrevious, Http2Settings settings) { long delta = 0; Http2Stream[] streamsToNotify = null; synchronized (writer) { @@ -985,7 +984,7 @@ public void ping(boolean reply, int payload1, int payload2) { } @Override - public void goAway(int lastGoodStreamId, ErrorCode errorCode, ByteString debugData) { + public void goAway(int lastGoodStreamId, Http2ErrorCode errorCode, ByteString debugData) { if (debugData.size() > 0) { // TODO: log the debugData } @@ -998,7 +997,7 @@ public void goAway(int lastGoodStreamId, ErrorCode errorCode, ByteString debugDa for (Http2Stream http2Stream : streamsCopy) { if (http2Stream.getId() > lastGoodStreamId && http2Stream.isLocallyInitiated()) { - http2Stream.receiveRstStream(ErrorCode.REFUSED_STREAM); + http2Stream.receiveRstStream(Http2ErrorCode.REFUSED_STREAM); removeStream(http2Stream.getId()); } } @@ -1027,7 +1026,7 @@ public void priority(int streamId, int streamDependency, int weight, } @Override - public void pushPromise(int streamId, int promisedStreamId, List requestHeaders) { + public void pushPromise(int streamId, int promisedStreamId, List requestHeaders) { pushRequestLater(promisedStreamId, requestHeaders); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/ErrorCode.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2ErrorCode.java similarity index 93% rename from bus-http/src/main/java/org/miaixz/bus/http/metric/http/ErrorCode.java rename to bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2ErrorCode.java index 9acb68b137..42e08d092e 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/ErrorCode.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2ErrorCode.java @@ -33,7 +33,7 @@ * @author Kimi Liu * @since Java 17+ */ -public enum ErrorCode { +public enum Http2ErrorCode { NO_ERROR(0), @@ -59,12 +59,12 @@ public enum ErrorCode { public final int httpCode; - ErrorCode(int httpCode) { + Http2ErrorCode(int httpCode) { this.httpCode = httpCode; } - public static ErrorCode fromHttp2(int code) { - for (ErrorCode errorCode : ErrorCode.values()) { + public static Http2ErrorCode fromHttp2(int code) { + for (Http2ErrorCode errorCode : Http2ErrorCode.values()) { if (errorCode.httpCode == code) return errorCode; } return null; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Header.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Header.java new file mode 100644 index 0000000000..025a32b2da --- /dev/null +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Header.java @@ -0,0 +1,94 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +package org.miaixz.bus.http.metric.http; + +import org.miaixz.bus.core.io.ByteString; +import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; + +/** + * HTTP header: the name is an ASCII string, but the value can be UTF-8. + */ +public class Http2Header { + + // Special header names defined in HTTP/2 spec. + public static final ByteString PSEUDO_PREFIX = ByteString.encodeUtf8(Symbol.COLON); + public static final ByteString RESPONSE_STATUS = ByteString.encodeUtf8(Http.RESPONSE_STATUS_UTF8); + public static final ByteString TARGET_METHOD = ByteString.encodeUtf8(Http.TARGET_METHOD_UTF8); + public static final ByteString TARGET_PATH = ByteString.encodeUtf8(Http.TARGET_PATH_UTF8); + public static final ByteString TARGET_SCHEME = ByteString.encodeUtf8(Http.TARGET_SCHEME_UTF8); + public static final ByteString TARGET_AUTHORITY = ByteString.encodeUtf8(Http.TARGET_AUTHORITY_UTF8); + + /** + * Name in case-insensitive ASCII encoding. + */ + public final ByteString name; + /** + * Value in UTF-8 encoding. + */ + public final ByteString value; + public final int hpackSize; + + // TODO: search for toLowerCase and consider moving logic here. + public Http2Header(String name, String value) { + this(ByteString.encodeUtf8(name), ByteString.encodeUtf8(value)); + } + + public Http2Header(ByteString name, String value) { + this(name, ByteString.encodeUtf8(value)); + } + + public Http2Header(ByteString name, ByteString value) { + this.name = name; + this.value = value; + this.hpackSize = 32 + name.size() + value.size(); + } + + @Override + public boolean equals(Object other) { + if (other instanceof Http2Header) { + Http2Header that = (Http2Header) other; + return this.name.equals(that.name) + && this.value.equals(that.value); + } + return false; + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + name.hashCode(); + result = 31 * result + value.hashCode(); + return result; + } + + @Override + public String toString() { + return String.format("%s: %s", name.utf8(), value.utf8()); + } +} diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Reader.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Reader.java index fa17607b97..d50433e531 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Reader.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Reader.java @@ -32,8 +32,6 @@ import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.io.source.Source; import org.miaixz.bus.core.io.timout.Timeout; -import org.miaixz.bus.http.Headers; -import org.miaixz.bus.http.Settings; import org.miaixz.bus.logger.Logger; import java.io.Closeable; @@ -42,7 +40,7 @@ /** * Reads HTTP/2运输框架 - * 此实现假设我们没有向对等端发送增加的{@link Settings#getMaxFrameSize frame size设置}。 + * 此实现假设我们没有向对等端发送增加的{@link Http2Settings#getMaxFrameSize frame size设置}。 * 因此,我们希望所有帧的最大长度为{@link Http2#INITIAL_MAX_FRAME_SIZE}。 * * @author Kimi Liu @@ -187,12 +185,12 @@ private void readHeaders(Handler handler, int length, byte flags, int streamId) length = lengthWithoutPadding(length, flags, padding); - List headerBlock = readHeaderBlock(length, padding, flags, streamId); + List headerBlock = readHeaderBlock(length, padding, flags, streamId); handler.headers(endStream, streamId, -1, headerBlock); } - private List readHeaderBlock(int length, short padding, byte flags, int streamId) + private List readHeaderBlock(int length, short padding, byte flags, int streamId) throws IOException { continuation.length = continuation.left = length; continuation.padding = padding; @@ -240,7 +238,7 @@ private void readRstStream(Handler handler, int length, byte flags, int streamId if (length != 4) throw Http2.ioException("TYPE_RST_STREAM length: %d != 4", length); if (streamId == 0) throw Http2.ioException("TYPE_RST_STREAM streamId == 0"); int errorCodeInt = source.readInt(); - ErrorCode errorCode = ErrorCode.fromHttp2(errorCodeInt); + Http2ErrorCode errorCode = Http2ErrorCode.fromHttp2(errorCodeInt); if (null == errorCode) { throw Http2.ioException("TYPE_RST_STREAM unexpected error code: %d", errorCodeInt); } @@ -257,7 +255,7 @@ private void readSettings(Handler handler, int length, byte flags, int streamId) } if (length % 6 != 0) throw Http2.ioException("TYPE_SETTINGS length %% 6 != 0: %s", length); - Settings settings = new Settings(); + Http2Settings settings = new Http2Settings(); for (int i = 0; i < length; i += 6) { int id = source.readShort() & 0xFFFF; int value = source.readInt(); @@ -303,7 +301,7 @@ private void readPushPromise(Handler handler, int length, byte flags, int stream int promisedStreamId = source.readInt() & 0x7fffffff; length -= 4; length = lengthWithoutPadding(length, flags, padding); - List headerBlock = readHeaderBlock(length, padding, flags, streamId); + List headerBlock = readHeaderBlock(length, padding, flags, streamId); handler.pushPromise(streamId, promisedStreamId, headerBlock); } @@ -324,7 +322,7 @@ private void readGoAway(Handler handler, int length, byte flags, int streamId) int lastStreamId = source.readInt(); int errorCodeInt = source.readInt(); int opaqueDataLength = length - 8; - ErrorCode errorCode = ErrorCode.fromHttp2(errorCodeInt); + Http2ErrorCode errorCode = Http2ErrorCode.fromHttp2(errorCodeInt); if (null == errorCode) { throw Http2.ioException("TYPE_GOAWAY unexpected error code: %d", errorCodeInt); } @@ -361,11 +359,11 @@ void data(boolean inFinished, int streamId, BufferSource source, int length) * @param headerBlock header信息 */ void headers(boolean inFinished, int streamId, int associatedStreamId, - List headerBlock); + List headerBlock); - void rstStream(int streamId, ErrorCode errorCode); + void rstStream(int streamId, Http2ErrorCode errorCode); - void settings(boolean clearPrevious, Settings settings); + void settings(boolean clearPrevious, Http2Settings settings); /** * HTTP/2 only. @@ -391,7 +389,7 @@ void headers(boolean inFinished, int streamId, int associatedStreamId, * @param errorCode 关闭连接的原因. * @param debugData 只适用于HTTP/2;要发送的不透明调试数据 */ - void goAway(int lastGoodStreamId, ErrorCode errorCode, ByteString debugData); + void goAway(int lastGoodStreamId, Http2ErrorCode errorCode, ByteString debugData); /** * 通知可以在{@code streamId}上发送额外的{@code windowSizeIncrement}字节 @@ -422,7 +420,7 @@ void headers(boolean inFinished, int streamId, int associatedStreamId, * @param requestHeaders 最低限度包括{@code:method}、{@code:scheme}、{@code:authority}和(@code:path}. * @throws IOException 异常信息 */ - void pushPromise(int streamId, int promisedStreamId, List requestHeaders) + void pushPromise(int streamId, int promisedStreamId, List requestHeaders) throws IOException; /** diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Settings.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Settings.java similarity index 95% rename from bus-http/src/main/java/org/miaixz/bus/http/Settings.java rename to bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Settings.java index 090a814bbc..4a884c06d4 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Settings.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Settings.java @@ -25,10 +25,9 @@ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */ -package org.miaixz.bus.http; +package org.miaixz.bus.http.metric.http; -import org.miaixz.bus.core.lang.Http; -import org.miaixz.bus.http.metric.http.Http2Connection; +import org.miaixz.bus.core.net.Http; import java.util.Arrays; @@ -39,7 +38,7 @@ * @author Kimi Liu * @since Java 17+ */ -public class Settings { +public class Http2Settings { /** * 设置总数 @@ -59,7 +58,7 @@ public void clear() { Arrays.fill(values, 0); } - public Settings set(int id, int value) { + public Http2Settings set(int id, int value) { if (id < 0 || id >= values.length) { return this; } @@ -136,7 +135,7 @@ public int getInitialWindowSize() { * * @param other 设置信息 */ - public void merge(Settings other) { + public void merge(Http2Settings other) { for (int i = 0; i < COUNT; i++) { if (!other.isSet(i)) continue; set(i, other.get(i)); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Stream.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Stream.java index 87adb17f47..831a0d80f7 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Stream.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Stream.java @@ -84,7 +84,7 @@ public class Http2Stream { * 这条小溪非正常关闭的原因。如果有多个原因导致异常关闭这个流(例如两个对等点几乎同时关闭它), * 那么这就是这个对等点知道的第一个原因. */ - ErrorCode errorCode = null; + Http2ErrorCode errorCode = null; IOException errorException; /** * 如果已发送或接收响应头,则为 @@ -189,7 +189,7 @@ public synchronized Headers trailers() throws IOException { * Returns the reason why this stream was closed, or null if it closed normally or has not yet * been closed. */ - public synchronized ErrorCode getErrorCode() { + public synchronized Http2ErrorCode getErrorCode() { return errorCode; } @@ -201,7 +201,7 @@ public synchronized ErrorCode getErrorCode() { * @param flushHeaders true to force flush the response headers. This should be true unless the * response body exists and will be written immediately. */ - public void writeHeaders(List responseHeaders, boolean outFinished, boolean flushHeaders) + public void writeHeaders(List responseHeaders, boolean outFinished, boolean flushHeaders) throws IOException { assert (!Thread.holdsLock(Http2Stream.this)); if (responseHeaders == null) { @@ -271,7 +271,7 @@ public Sink getSink() { * Abnormally terminate this stream. This blocks until the {@code RST_STREAM} frame has been * transmitted. */ - public void close(ErrorCode rstStatusCode, IOException errorException) + public void close(Http2ErrorCode rstStatusCode, IOException errorException) throws IOException { if (!closeInternal(rstStatusCode, errorException)) { return; // Already closed. @@ -283,7 +283,7 @@ public void close(ErrorCode rstStatusCode, IOException errorException) * Abnormally terminate this stream. This enqueues a {@code RST_STREAM} frame and returns * immediately. */ - public void closeLater(ErrorCode errorCode) { + public void closeLater(Http2ErrorCode errorCode) { if (!closeInternal(errorCode, null)) { return; // Already closed. } @@ -293,7 +293,7 @@ public void closeLater(ErrorCode errorCode) { /** * Returns true if this stream was closed. */ - private boolean closeInternal(ErrorCode errorCode, IOException errorException) { + private boolean closeInternal(Http2ErrorCode errorCode, IOException errorException) { assert (!Thread.holdsLock(this)); synchronized (this) { if (this.errorCode != null) { @@ -340,7 +340,7 @@ void receiveHeaders(Headers headers, boolean inFinished) { } } - synchronized void receiveRstStream(ErrorCode errorCode) { + synchronized void receiveRstStream(Http2ErrorCode errorCode) { if (this.errorCode == null) { this.errorCode = errorCode; notifyAll(); @@ -360,7 +360,7 @@ void cancelStreamIfNecessary() throws IOException { // is safe because the input stream is closed (we won't use any // further bytes) and the output stream is either finished or closed // (so RSTing both streams doesn't cause harm). - Http2Stream.this.close(ErrorCode.CANCEL, null); + Http2Stream.this.close(Http2ErrorCode.CANCEL, null); } else if (!open) { connection.removeStream(id); } @@ -525,7 +525,7 @@ void receive(BufferSource in, long byteCount) throws IOException { // If the peer sends more data than we can handle, discard it and close the connection. if (flowControlError) { in.skip(byteCount); - closeLater(ErrorCode.FLOW_CONTROL_ERROR); + closeLater(Http2ErrorCode.FLOW_CONTROL_ERROR); return; } @@ -701,7 +701,7 @@ public void close() throws IOException { class StreamTimeout extends AsyncTimeout { @Override protected void timedOut() { - closeLater(ErrorCode.CANCEL); + closeLater(Http2ErrorCode.CANCEL); connection.sendDegradedPingLater(); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Writer.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Writer.java index 24c3f782c5..9da32ac93f 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Writer.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Writer.java @@ -30,8 +30,6 @@ import org.miaixz.bus.core.io.buffer.Buffer; import org.miaixz.bus.core.io.sink.BufferSink; import org.miaixz.bus.core.lang.Normal; -import org.miaixz.bus.http.Headers; -import org.miaixz.bus.http.Settings; import org.miaixz.bus.logger.Logger; import java.io.Closeable; @@ -83,7 +81,7 @@ public synchronized void connectionPreface() throws IOException { /** * Applies {@code peerSettings} and then sends a settings ACK. */ - public synchronized void applyAndAckSettings(Settings peerSettings) throws IOException { + public synchronized void applyAndAckSettings(Http2Settings peerSettings) throws IOException { if (closed) throw new IOException("closed"); this.maxFrameSize = peerSettings.getMaxFrameSize(maxFrameSize); if (peerSettings.getHeaderTableSize() != -1) { @@ -110,7 +108,7 @@ public synchronized void applyAndAckSettings(Settings peerSettings) throws IOExc * @throws IOException 异常 */ public synchronized void pushPromise(int streamId, int promisedStreamId, - List requestHeaders) throws IOException { + List requestHeaders) throws IOException { if (closed) throw new IOException("closed"); hpackWriter.writeHeaders(requestHeaders); @@ -130,7 +128,7 @@ public synchronized void flush() throws IOException { sink.flush(); } - public synchronized void rstStream(int streamId, ErrorCode errorCode) + public synchronized void rstStream(int streamId, Http2ErrorCode errorCode) throws IOException { if (closed) throw new IOException("closed"); if (errorCode.httpCode == -1) throw new IllegalArgumentException(); @@ -177,14 +175,14 @@ void dataFrame(int streamId, byte flags, Buffer buffer, int byteCount) throws IO /** * Write httpd's settings to the peer. */ - public synchronized void settings(Settings settings) throws IOException { + public synchronized void settings(Http2Settings settings) throws IOException { if (closed) throw new IOException("closed"); int length = settings.size() * 6; byte type = Http2.TYPE_SETTINGS; byte flags = Http2.FLAG_NONE; int streamId = 0; frameHeader(streamId, length, type, flags); - for (int i = 0; i < Settings.COUNT; i++) { + for (int i = 0; i < Http2Settings.COUNT; i++) { if (!settings.isSet(i)) continue; int id = i; if (id == 4) { @@ -221,7 +219,7 @@ public synchronized void ping(boolean ack, int payload1, int payload2) throws IO * @param errorCode 关闭连接的原因. * @param debugData 只适用于HTTP/2;要发送的不透明调试数据. */ - public synchronized void goAway(int lastGoodStreamId, ErrorCode errorCode, byte[] debugData) + public synchronized void goAway(int lastGoodStreamId, Http2ErrorCode errorCode, byte[] debugData) throws IOException { if (closed) throw new IOException("closed"); if (errorCode.httpCode == -1) throw Http2.illegalArgument("errorCode.httpCode == -1"); @@ -286,7 +284,7 @@ private void writeContinuationFrames(int streamId, long byteCount) throws IOExce } public synchronized void headers( - boolean outFinished, int streamId, List headerBlock) throws IOException { + boolean outFinished, int streamId, List headerBlock) throws IOException { if (closed) throw new IOException("closed"); hpackWriter.writeHeaders(headerBlock); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/PushObserver.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/PushObserver.java index 589a6c4680..5f8da5cc00 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/PushObserver.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/PushObserver.java @@ -28,7 +28,6 @@ package org.miaixz.bus.http.metric.http; import org.miaixz.bus.core.io.source.BufferSource; -import org.miaixz.bus.http.Headers; import org.miaixz.bus.http.Protocol; import java.io.IOException; @@ -48,12 +47,12 @@ public interface PushObserver { PushObserver CANCEL = new PushObserver() { @Override - public boolean onRequest(int streamId, List requestHeaders) { + public boolean onRequest(int streamId, List requestHeaders) { return true; } @Override - public boolean onHeaders(int streamId, List responseHeaders, boolean last) { + public boolean onHeaders(int streamId, List responseHeaders, boolean last) { return true; } @@ -65,7 +64,7 @@ public boolean onData(int streamId, BufferSource source, int byteCount, } @Override - public void onReset(int streamId, ErrorCode errorCode) { + public void onReset(int streamId, Http2ErrorCode errorCode) { } }; @@ -76,7 +75,7 @@ public void onReset(int streamId, ErrorCode errorCode) { * @param requestHeaders 最低限度包括 method、scheme、authority和path * @return the true/false */ - boolean onRequest(int streamId, List requestHeaders); + boolean onRequest(int streamId, List requestHeaders); /** * 推送请求对应的响应标头。当{@code last}为真时,则没有后续的数据帧 @@ -86,7 +85,7 @@ public void onReset(int streamId, ErrorCode errorCode) { * @param last 如果为真,则没有响应数据 * @return the true/false */ - boolean onHeaders(int streamId, List responseHeaders, boolean last); + boolean onHeaders(int streamId, List responseHeaders, boolean last); /** * 与推送请求对应的响应数据块。必须读取或跳过这些数据. @@ -107,6 +106,6 @@ boolean onData(int streamId, BufferSource source, int byteCount, boolean last) * @param streamId 服务器发起的流ID:偶数. * @param errorCode 错误码信息 */ - void onReset(int streamId, ErrorCode errorCode); + void onReset(int streamId, Http2ErrorCode errorCode); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java index 75ad6c4e3b..ce3a2dbf3d 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java @@ -27,8 +27,8 @@ */ package org.miaixz.bus.http.metric.http; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.Exchange; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StreamException.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StreamException.java index 6ed60bbe32..15f72e1e35 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StreamException.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StreamException.java @@ -37,9 +37,9 @@ */ public class StreamException extends RevisedException { - public final ErrorCode errorCode; + public final Http2ErrorCode errorCode; - public StreamException(ErrorCode errorCode) { + public StreamException(Http2ErrorCode errorCode) { super("stream was reset: " + errorCode); this.errorCode = errorCode; } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverCall.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverCall.java index 687fb77bd3..028bd91665 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverCall.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverCall.java @@ -28,8 +28,8 @@ package org.miaixz.bus.http.plugin.httpv; import org.miaixz.bus.core.io.ByteString; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.Httpv; import org.miaixz.bus.http.Request; import org.miaixz.bus.http.Response; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverHttp.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverHttp.java index 6a3584fde0..55c68429a6 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverHttp.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverHttp.java @@ -27,10 +27,10 @@ */ package org.miaixz.bus.http.plugin.httpv; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.MapKit; import org.miaixz.bus.core.xyz.ObjectKit; import org.miaixz.bus.http.*; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverTasks.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverTasks.java index 05f0a09798..79a118e948 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverTasks.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverTasks.java @@ -27,9 +27,9 @@ */ package org.miaixz.bus.http.plugin.httpv; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.Callback; import java.io.File; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/ResultBody.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/ResultBody.java index 8238147823..3ffdaaaf1b 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/ResultBody.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/ResultBody.java @@ -29,8 +29,12 @@ import org.miaixz.bus.core.io.ByteString; import org.miaixz.bus.core.io.buffer.Buffer; -import org.miaixz.bus.core.lang.*; +import org.miaixz.bus.core.lang.Charset; +import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.lang.Normal; +import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.Callback; import org.miaixz.bus.http.Response; import org.miaixz.bus.http.bodys.ResponseBody; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpx/HttpProxy.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpx/HttpProxy.java index 2234ed7fb0..6c288b5c0b 100755 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpx/HttpProxy.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpx/HttpProxy.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http.plugin.httpx; -import org.miaixz.bus.core.lang.Header; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.secure.Authenticator; import org.miaixz.bus.http.secure.Credentials; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PostRequest.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PostRequest.java index 0655f3cd96..1a58bd60b9 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PostRequest.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PostRequest.java @@ -27,9 +27,9 @@ */ package org.miaixz.bus.http.plugin.httpz; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.xyz.FileKit; import org.miaixz.bus.core.xyz.ObjectKit; import org.miaixz.bus.http.Headers; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PutRequest.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PutRequest.java index a9d8b76fac..d5eb76a068 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PutRequest.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PutRequest.java @@ -27,9 +27,9 @@ */ package org.miaixz.bus.http.plugin.httpz; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.xyz.FileKit; import org.miaixz.bus.http.Headers; import org.miaixz.bus.http.Request; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java b/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java index 2a77cae169..0c2ad9fbf7 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java @@ -28,8 +28,8 @@ package org.miaixz.bus.http.secure; import org.miaixz.bus.core.io.ByteString; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.UnoUrl; import javax.net.ssl.SSLPeerUnverifiedException; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/secure/NetAuthenticator.java b/bus-http/src/main/java/org/miaixz/bus/http/secure/NetAuthenticator.java index e771e852de..6cb54a4b8c 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/secure/NetAuthenticator.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/secure/NetAuthenticator.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http.secure; -import org.miaixz.bus.core.lang.Header; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.Request; import org.miaixz.bus.http.Response; import org.miaixz.bus.http.Route; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java b/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java index de33316dd7..9d59d1d54c 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java @@ -30,10 +30,10 @@ import org.miaixz.bus.core.io.ByteString; import org.miaixz.bus.core.io.sink.BufferSink; import org.miaixz.bus.core.io.source.BufferSource; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.Exchange; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Device.java b/bus-image/src/main/java/org/miaixz/bus/image/Device.java index 72674e98ec..646fd5d5b1 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Device.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Device.java @@ -27,9 +27,9 @@ */ package org.miaixz.bus.image; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.image.galaxy.Material; import org.miaixz.bus.image.galaxy.data.Code; import org.miaixz.bus.image.galaxy.data.Issuer; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Node.java b/bus-image/src/main/java/org/miaixz/bus/image/Node.java index 0db60bd3c0..b59dd6ba9e 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Node.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Node.java @@ -29,8 +29,8 @@ import lombok.Getter; import lombok.Setter; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.image.metric.Association; import org.miaixz.bus.logger.Logger; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Option.java b/bus-image/src/main/java/org/miaixz/bus/image/Option.java index ed561b6562..df557e11af 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Option.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Option.java @@ -29,7 +29,7 @@ import lombok.Getter; import lombok.Setter; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.image.metric.Connection; import org.miaixz.bus.image.metric.internal.pdu.ExtendedNegotiate; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/AbstractStowrs.java b/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/AbstractStowrs.java index b8be51ad33..385292160c 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/AbstractStowrs.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/AbstractStowrs.java @@ -27,10 +27,10 @@ */ package org.miaixz.bus.image.galaxy.media; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.image.Tag; import org.miaixz.bus.image.UID; import org.miaixz.bus.image.galaxy.data.Attributes; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/StowrsSingleFile.java b/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/StowrsSingleFile.java index 66832ea2a0..98ca7cc6be 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/StowrsSingleFile.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/StowrsSingleFile.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.image.galaxy.media; -import org.miaixz.bus.core.lang.Header; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.image.Tag; import org.miaixz.bus.image.galaxy.data.Attributes; import org.miaixz.bus.image.galaxy.data.BulkData; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java index e3858e4c89..ff5aa8135c 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java @@ -27,9 +27,9 @@ */ package org.miaixz.bus.image.metric; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.image.Device; import java.util.ArrayList; diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/aliyun/AliyunProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/aliyun/AliyunProvider.java index 3117608261..40868b1ecf 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/aliyun/AliyunProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/aliyun/AliyunProvider.java @@ -29,9 +29,9 @@ import org.miaixz.bus.core.lang.Algorithm; import org.miaixz.bus.core.lang.Charset; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.notify.Context; import org.miaixz.bus.notify.magic.ErrorCode; diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/dingtalk/DingTalkProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/dingtalk/DingTalkProvider.java index cae3a24a45..55837e9fc8 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/dingtalk/DingTalkProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/dingtalk/DingTalkProvider.java @@ -28,7 +28,7 @@ package org.miaixz.bus.notify.metric.dingtalk; import lombok.Setter; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/emay/EmaySmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/emay/EmaySmsProvider.java index 2a8dc2d8bb..e11286f209 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/emay/EmaySmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/emay/EmaySmsProvider.java @@ -28,8 +28,8 @@ package org.miaixz.bus.notify.metric.emay; import org.miaixz.bus.core.lang.Charset; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.DateKit; import org.miaixz.bus.core.xyz.MapKit; diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/huawei/HuaweiSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/huawei/HuaweiSmsProvider.java index 59059c9927..23a73cd92b 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/huawei/HuaweiSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/huawei/HuaweiSmsProvider.java @@ -27,8 +27,12 @@ */ package org.miaixz.bus.notify.metric.huawei; -import org.miaixz.bus.core.lang.*; +import org.miaixz.bus.core.lang.Charset; +import org.miaixz.bus.core.lang.Fields; +import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.xyz.DateKit; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java index 4649f22053..03d02a2e3a 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java @@ -27,9 +27,9 @@ */ package org.miaixz.bus.notify.metric.jdcloud; -import org.miaixz.bus.core.lang.Header; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.notify.Context; diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jpush/JpushSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jpush/JpushSmsProvider.java index 8ecc451084..215caea941 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jpush/JpushSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jpush/JpushSmsProvider.java @@ -28,9 +28,9 @@ package org.miaixz.bus.notify.metric.jpush; import org.miaixz.bus.core.lang.Charset; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.notify.Context; diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/netease/NeteaseProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/netease/NeteaseProvider.java index 18dc92f5d8..e5b6e36435 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/netease/NeteaseProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/netease/NeteaseProvider.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.notify.metric.netease; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.logger.Logger; diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/upyun/UpyunSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/upyun/UpyunSmsProvider.java index 883a013876..665a943b5b 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/upyun/UpyunSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/upyun/UpyunSmsProvider.java @@ -27,8 +27,8 @@ */ package org.miaixz.bus.notify.metric.upyun; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.xyz.CollKit; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.extra.json.JsonKit; diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java index 32749c0660..c38be323d6 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java @@ -28,8 +28,8 @@ package org.miaixz.bus.oauth; import org.miaixz.bus.cache.metric.ExtendCache; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.exception.AuthorizedException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.oauth.magic.Callback; import org.miaixz.bus.oauth.magic.ErrorCode; diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java index 24955dbdc3..5a72726464 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java @@ -38,8 +38,8 @@ import org.miaixz.bus.cache.metric.ExtendCache; import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Gender; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.exception.AuthorizedException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.oauth.Builder; import org.miaixz.bus.oauth.Checker; diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/amazon/AmazonProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/amazon/AmazonProvider.java index 9637bc891f..c4be08ac95 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/amazon/AmazonProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/amazon/AmazonProvider.java @@ -31,10 +31,10 @@ import org.miaixz.bus.cache.metric.ExtendCache; import org.miaixz.bus.core.codec.binary.Base64; import org.miaixz.bus.core.lang.Gender; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.AuthorizedException; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.RandomKit; import org.miaixz.bus.http.Httpx; diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/eleme/ElemeProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/eleme/ElemeProvider.java index e624974ad5..4870dbf68d 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/eleme/ElemeProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/eleme/ElemeProvider.java @@ -33,10 +33,10 @@ import org.miaixz.bus.core.codec.binary.Base64; import org.miaixz.bus.core.data.ID; import org.miaixz.bus.core.lang.Gender; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.AuthorizedException; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.oauth.Builder; import org.miaixz.bus.oauth.Context; diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/linkedin/LinkedinProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/linkedin/LinkedinProvider.java index f5bbd9265a..67a7e17a76 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/linkedin/LinkedinProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/linkedin/LinkedinProvider.java @@ -32,9 +32,9 @@ import com.alibaba.fastjson.JSONPath; import org.miaixz.bus.cache.metric.ExtendCache; import org.miaixz.bus.core.lang.Gender; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.AuthorizedException; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.oauth.Builder; import org.miaixz.bus.oauth.Context; diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/stackoverflow/StackOverflowProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/stackoverflow/StackOverflowProvider.java index cf619d383e..48b2408a4a 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/stackoverflow/StackOverflowProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/stackoverflow/StackOverflowProvider.java @@ -31,9 +31,9 @@ import org.miaixz.bus.cache.metric.ExtendCache; import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Gender; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.AuthorizedException; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.url.UrlDecoder; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.oauth.Builder; diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/twitter/TwitterProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/twitter/TwitterProvider.java index db029546b5..dbec155bf7 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/twitter/TwitterProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/twitter/TwitterProvider.java @@ -32,8 +32,8 @@ import org.miaixz.bus.core.codec.binary.Base64; import org.miaixz.bus.core.lang.Algorithm; import org.miaixz.bus.core.lang.Charset; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.http.Httpx; diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/Builder.java b/bus-pay/src/main/java/org/miaixz/bus/pay/Builder.java index 64002c92f0..2b8c96190a 100644 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/Builder.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/Builder.java @@ -36,6 +36,7 @@ import org.miaixz.bus.core.io.resource.ClassPathResource; import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Normal; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.CompareKit; import org.miaixz.bus.core.xyz.DateKit; import org.miaixz.bus.core.xyz.IoKit; @@ -347,7 +348,7 @@ public static StringBuffer forEachMap(Map params, String prefix, /** * 构造签名串 * - * @param method {@link org.miaixz.bus.core.lang.Http} GET,POST,PUT等 + * @param method {@link Http} GET,POST,PUT等 * @param url 请求接口 /v3/certificates * @param timestamp 获取发起请求时的系统当前时间戳 * @param nonceStr 随机字符串 diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/Complex.java b/bus-pay/src/main/java/org/miaixz/bus/pay/Complex.java index b6e679c0b6..a6febd6108 100755 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/Complex.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/Complex.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.pay; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.pay.metric.AbstractProvider; import java.util.Arrays; diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java index ad6cdcb5ee..6421864eaf 100644 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java @@ -30,8 +30,12 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.SneakyThrows; import org.miaixz.bus.cache.metric.ExtendCache; -import org.miaixz.bus.core.lang.*; +import org.miaixz.bus.core.lang.Assert; +import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.lang.Normal; +import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.PaymentException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.net.tls.SSLContextBuilder; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.FileKit; diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/alipay/AliPayProvider.java b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/alipay/AliPayProvider.java index 054e4ef3c0..8f6d4f548e 100644 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/alipay/AliPayProvider.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/alipay/AliPayProvider.java @@ -36,7 +36,7 @@ import org.miaixz.bus.core.lang.Algorithm; import org.miaixz.bus.core.lang.Assert; import org.miaixz.bus.core.lang.Charset; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.DateKit; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.pay.Complex; diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/wechat/WechatPayProvider.java b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/wechat/WechatPayProvider.java index 308d297996..9710b0a2da 100644 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/wechat/WechatPayProvider.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/wechat/WechatPayProvider.java @@ -29,7 +29,7 @@ import org.miaixz.bus.cache.metric.ExtendCache; import org.miaixz.bus.core.lang.Algorithm; -import org.miaixz.bus.core.lang.Http; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.DateKit; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.core.xyz.XmlKit; diff --git a/bus-starter/src/main/java/org/miaixz/bus/starter/bridge/BridgeVerticleService.java b/bus-starter/src/main/java/org/miaixz/bus/starter/bridge/BridgeVerticleService.java index 014f507326..ad9a01a1d6 100644 --- a/bus-starter/src/main/java/org/miaixz/bus/starter/bridge/BridgeVerticleService.java +++ b/bus-starter/src/main/java/org/miaixz/bus/starter/bridge/BridgeVerticleService.java @@ -32,8 +32,8 @@ import io.vertx.ext.web.Router; import jakarta.annotation.Resource; import org.miaixz.bus.base.entity.Message; -import org.miaixz.bus.core.lang.Header; import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.xyz.ObjectKit; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.logger.Logger; diff --git a/bus-starter/src/main/java/org/miaixz/bus/starter/cors/CorsProperties.java b/bus-starter/src/main/java/org/miaixz/bus/starter/cors/CorsProperties.java index ac2ebf5e38..0a61e7f4af 100755 --- a/bus-starter/src/main/java/org/miaixz/bus/starter/cors/CorsProperties.java +++ b/bus-starter/src/main/java/org/miaixz/bus/starter/cors/CorsProperties.java @@ -29,8 +29,8 @@ import lombok.Getter; import lombok.Setter; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.spring.BusXConfig; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/GenieWrapperHandler.java b/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/GenieWrapperHandler.java index 925b581b24..698ccab119 100755 --- a/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/GenieWrapperHandler.java +++ b/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/GenieWrapperHandler.java @@ -29,9 +29,9 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.ansi.Ansi4BitColor; import org.miaixz.bus.core.lang.ansi.AnsiEncoder; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.ArrayKit; import org.miaixz.bus.core.xyz.NetKit; import org.miaixz.bus.logger.Logger; diff --git a/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/WrapperConfiguration.java b/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/WrapperConfiguration.java index 0975a31393..a26e121038 100755 --- a/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/WrapperConfiguration.java +++ b/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/WrapperConfiguration.java @@ -32,8 +32,8 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.CollKit; import org.miaixz.bus.core.xyz.MapKit; import org.miaixz.bus.core.xyz.ObjectKit; diff --git a/bus-storage/src/main/java/org/miaixz/bus/storage/metric/AbstractProvider.java b/bus-storage/src/main/java/org/miaixz/bus/storage/metric/AbstractProvider.java index 1e54767882..592870f5c2 100755 --- a/bus-storage/src/main/java/org/miaixz/bus/storage/metric/AbstractProvider.java +++ b/bus-storage/src/main/java/org/miaixz/bus/storage/metric/AbstractProvider.java @@ -27,10 +27,10 @@ */ package org.miaixz.bus.storage.metric; -import org.miaixz.bus.core.lang.Http; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Http; import org.miaixz.bus.storage.Context; import org.miaixz.bus.storage.Provider; From f9982c49c81c04e0d5e0def9a18f6f76b643c707 Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Wed, 19 Jun 2024 17:59:07 +0800 Subject: [PATCH 05/20] fix http and https --- .../bus/core/net/{Http.java => HTTP.java} | 9 +++--- .../bus/core/net/tls/SSLContextBuilder.java | 6 ++-- .../java/org/miaixz/bus/http/Address.java | 4 +-- .../java/org/miaixz/bus/http/Headers.java | 8 ++--- .../main/java/org/miaixz/bus/http/Httpv.java | 20 ++++++------ .../main/java/org/miaixz/bus/http/Httpx.java | 18 +++++------ .../java/org/miaixz/bus/http/Protocol.java | 16 +++++----- .../java/org/miaixz/bus/http/Request.java | 18 +++++------ .../java/org/miaixz/bus/http/Response.java | 18 +++++------ .../main/java/org/miaixz/bus/http/UnoUrl.java | 26 +++++++-------- .../bus/http/accord/ConnectInterceptor.java | 4 +-- .../bus/http/accord/RealConnection.java | 10 +++--- .../java/org/miaixz/bus/http/cache/Cache.java | 8 ++--- .../bus/http/cache/CacheInterceptor.java | 6 ++-- .../miaixz/bus/http/cache/CacheStrategy.java | 28 ++++++++-------- .../metric/http/CallServerInterceptor.java | 4 +-- .../miaixz/bus/http/metric/http/Hpack.java | 24 +++++++------- .../bus/http/metric/http/Http1Codec.java | 6 ++-- .../bus/http/metric/http/Http2Codec.java | 14 ++++---- .../bus/http/metric/http/Http2Connection.java | 12 +++---- .../bus/http/metric/http/Http2Header.java | 12 +++---- .../bus/http/metric/http/Http2Settings.java | 26 +++++++-------- .../http/metric/http/RetryAndFollowUp.java | 32 +++++++++---------- .../bus/http/plugin/httpv/CoverCall.java | 6 ++-- .../bus/http/plugin/httpv/CoverHttp.java | 30 ++++++++--------- .../bus/http/plugin/httpv/CoverTasks.java | 8 ++--- .../bus/http/secure/CertificatePinner.java | 6 ++-- .../miaixz/bus/http/socket/RealWebSocket.java | 4 +-- .../java/org/miaixz/bus/image/Device.java | 4 +-- .../main/java/org/miaixz/bus/image/Node.java | 4 +-- .../java/org/miaixz/bus/image/Option.java | 6 ++-- .../bus/image/metric/WebApplication.java | 4 +-- .../notify/metric/aliyun/AliyunProvider.java | 4 +-- .../metric/dingtalk/DingTalkProvider.java | 6 ++-- .../notify/metric/emay/EmaySmsProvider.java | 4 +-- .../metric/jdcloud/JdcloudSmsProvider.java | 6 ++-- .../metric/netease/NeteaseProvider.java | 4 +-- .../java/org/miaixz/bus/oauth/Checker.java | 10 +++--- .../oauth/metric/alipay/AlipayProvider.java | 4 +-- .../main/java/org/miaixz/bus/pay/Builder.java | 4 +-- .../main/java/org/miaixz/bus/pay/Complex.java | 8 ++--- .../bus/pay/metric/AbstractProvider.java | 10 +++--- .../bus/pay/metric/alipay/AliPayProvider.java | 4 +-- .../pay/metric/wechat/WechatPayProvider.java | 22 ++++++------- .../bus/starter/cors/CorsProperties.java | 4 +-- .../starter/wrapper/GenieWrapperHandler.java | 30 ++++++++--------- .../starter/wrapper/WrapperConfiguration.java | 4 +-- .../bus/storage/metric/AbstractProvider.java | 6 ++-- 48 files changed, 265 insertions(+), 266 deletions(-) rename bus-core/src/main/java/org/miaixz/bus/core/net/{Http.java => HTTP.java} (97%) diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/Http.java b/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java similarity index 97% rename from bus-core/src/main/java/org/miaixz/bus/core/net/Http.java rename to bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java index 2452ba890b..68c3b87da8 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/Http.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java @@ -1,6 +1,5 @@ package org.miaixz.bus.core.net; - import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.xyz.StringKit; @@ -10,7 +9,7 @@ * @author Kimi Liu * @since Java 17+ */ -public class Http { +public class HTTP { /** * The http @@ -416,7 +415,7 @@ public static boolean isHttp(String url) { if (StringKit.isEmpty(url)) { return false; } - return url.startsWith(Http.HTTP_PREFIX) || url.startsWith("http%3A%2F%2F"); + return url.startsWith(org.miaixz.bus.core.net.HTTP.HTTP_PREFIX) || url.startsWith("http%3A%2F%2F"); } /** @@ -429,7 +428,7 @@ public static boolean isHttps(String url) { if (StringKit.isEmpty(url)) { return false; } - return url.startsWith(Http.HTTPS_PREFIX) || url.startsWith("https%3A%2F%2F"); + return url.startsWith(org.miaixz.bus.core.net.HTTP.HTTPS_PREFIX) || url.startsWith("https%3A%2F%2F"); } /** @@ -439,7 +438,7 @@ public static boolean isHttps(String url) { * @return true: 本地主机(域名), false: 非本地主机(域名) */ public static boolean isLocalHost(String url) { - return StringKit.isEmpty(url) || url.contains(Http.HOST_IPV4) || url.contains(Http.HOST_LOCAL); + return StringKit.isEmpty(url) || url.contains(org.miaixz.bus.core.net.HTTP.HOST_IPV4) || url.contains(org.miaixz.bus.core.net.HTTP.HOST_LOCAL); } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java index 834b87d0a3..0b09455dfc 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.Builder; import org.miaixz.bus.core.lang.Protocol; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.ArrayKit; import org.miaixz.bus.core.xyz.StringKit; @@ -175,10 +175,10 @@ public static X509TrustManager newTrustManager() { public static SSLContext getSSLContext() { try { - return SSLContext.getInstance(Http.TLS_V_13); + return SSLContext.getInstance(HTTP.TLS_V_13); } catch (NoSuchAlgorithmException e) { try { - return SSLContext.getInstance(Http.TLS); + return SSLContext.getInstance(HTTP.TLS); } catch (NoSuchAlgorithmException e2) { throw new IllegalStateException("No TLS provider", e); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Address.java b/bus-http/src/main/java/org/miaixz/bus/http/Address.java index 3d4459f1aa..e624e626bd 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Address.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Address.java @@ -28,7 +28,7 @@ package org.miaixz.bus.http; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.accord.Connection; import org.miaixz.bus.http.accord.ConnectionSuite; import org.miaixz.bus.http.secure.Authenticator; @@ -101,7 +101,7 @@ public Address(String uriHost, int uriPort, DnsX dns, SocketFactory socketFactor Proxy proxy, List protocols, List connectionSuites, ProxySelector proxySelector) { this.url = new UnoUrl.Builder() - .scheme(null != sslSocketFactory ? Http.HTTPS : Http.HTTP) + .scheme(null != sslSocketFactory ? HTTP.HTTPS : HTTP.HTTP) .host(uriHost) .port(uriPort) .build(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Headers.java b/bus-http/src/main/java/org/miaixz/bus/http/Headers.java index f503c58673..28eb1f2d91 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Headers.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Headers.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.io.buffer.Buffer; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.metric.CookieJar; import org.miaixz.bus.http.secure.Challenge; @@ -424,9 +424,9 @@ public static boolean hasBody(Response response) { } int responseCode = response.code(); - if ((responseCode < Http.HTTP_CONTINUE || responseCode >= 200) - && responseCode != Http.HTTP_NO_CONTENT - && responseCode != Http.HTTP_NOT_MODIFIED) { + if ((responseCode < HTTP.HTTP_CONTINUE || responseCode >= 200) + && responseCode != HTTP.HTTP_NO_CONTENT + && responseCode != HTTP.HTTP_NOT_MODIFIED) { return true; } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java b/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java index 29f3cbdc4e..be6c14ddfc 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java @@ -30,8 +30,8 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.plugin.httpv.*; import org.miaixz.bus.http.socket.WebSocket; @@ -252,10 +252,10 @@ private String urlPath(String urlPath, boolean websocket) { throw new InternalException("Before setting BaseUrl, you must specify a specific path to initiate a request!"); } } else { - boolean isFullPath = urlPath.startsWith(Http.HTTPS_PREFIX) - || urlPath.startsWith(Http.HTTP_PREFIX) - || urlPath.startsWith(Http.WSS_PREFIX) - || urlPath.startsWith(Http.WS_PREFIX); + boolean isFullPath = urlPath.startsWith(HTTP.HTTPS_PREFIX) + || urlPath.startsWith(HTTP.HTTP_PREFIX) + || urlPath.startsWith(HTTP.WSS_PREFIX) + || urlPath.startsWith(HTTP.WS_PREFIX); if (isFullPath) { fullUrl = urlPath; } else if (null != baseUrl) { @@ -264,11 +264,11 @@ private String urlPath(String urlPath, boolean websocket) { throw new InternalException("Before setting BaseUrl, you must use the full path URL to initiate the request. The current URL is:" + urlPath); } } - if (websocket && fullUrl.startsWith(Http.HTTP)) { - return fullUrl.replaceFirst(Http.HTTP, Http.WS); + if (websocket && fullUrl.startsWith(HTTP.HTTP)) { + return fullUrl.replaceFirst(HTTP.HTTP, HTTP.WS); } - if (!websocket && fullUrl.startsWith(Http.WS)) { - return fullUrl.replaceFirst(Http.WS, Http.HTTP); + if (!websocket && fullUrl.startsWith(HTTP.WS)) { + return fullUrl.replaceFirst(HTTP.WS, HTTP.HTTP); } return fullUrl; } @@ -392,7 +392,7 @@ public static class Builder { private Charset charset = org.miaixz.bus.core.lang.Charset.UTF_8; - private String bodyType = Http.FORM; + private String bodyType = HTTP.FORM; public Builder() { mediaTypes = new HashMap<>(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Httpx.java b/bus-http/src/main/java/org/miaixz/bus/http/Httpx.java index 8ee51ddb25..b8e5cb32ae 100755 --- a/bus-http/src/main/java/org/miaixz/bus/http/Httpx.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Httpx.java @@ -32,7 +32,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.tls.SSLContextBuilder; import org.miaixz.bus.core.xyz.ArrayKit; import org.miaixz.bus.core.xyz.MapKit; @@ -255,7 +255,7 @@ public static String get(final String url, final String charset) { */ public static String get(final String url, final boolean isAsync) { if (isAsync) { - return enqueue(Builder.builder().url(url).method(Http.GET).build()); + return enqueue(Builder.builder().url(url).method(HTTP.GET).build()); } return get(url); } @@ -404,12 +404,12 @@ public static String post(final String url, final Map formMap, f * @return the {@link String} */ public static String post(final String url, final String data, final String mediaType, final String charset) { - return execute(Builder.builder().url(url).method(Http.POST).data(data).mediaType(mediaType) + return execute(Builder.builder().url(url).method(HTTP.POST).data(data).mediaType(mediaType) .requestCharset(charset).responseCharset(charset).build()); } public static String post(final String url, final String data, final Map headerMap, final String mediaType) { - return execute(Builder.builder().url(url).method(Http.POST).data(data).headerMap(headerMap).mediaType(mediaType) + return execute(Builder.builder().url(url).method(HTTP.POST).data(data).headerMap(headerMap).mediaType(mediaType) .requestCharset(Charset.DEFAULT_UTF_8).responseCharset(Charset.DEFAULT_UTF_8).build()); } @@ -423,7 +423,7 @@ public static String post(final String url, final String data, final Map formMap, final String mediaType, final String charset) { - return execute(Builder.builder().url(url).method(Http.POST).formMap(formMap).mediaType(mediaType) + return execute(Builder.builder().url(url).method(HTTP.POST).formMap(formMap).mediaType(mediaType) .requestCharset(charset).responseCharset(charset).build()); } @@ -451,7 +451,7 @@ public static String post(final String url, final Map formMap, f * @return the {@link String} */ public static String post(final String url, final Map formMap, final Map headerMap, final String mediaType, final String charset) { - return execute(Builder.builder().url(url).method(Http.POST).headerMap(headerMap).formMap(formMap) + return execute(Builder.builder().url(url).method(HTTP.POST).headerMap(headerMap).formMap(formMap) .mediaType(mediaType).requestCharset(charset).responseCharset(charset).build()); } @@ -503,7 +503,7 @@ private static Request.Builder builder(final Builder builder) { builder.responseCharset = Charset.DEFAULT_UTF_8; } if (StringKit.isBlank(builder.method)) { - builder.method = Http.GET; + builder.method = HTTP.GET; } if (StringKit.isBlank(builder.mediaType)) { builder.mediaType = MediaType.APPLICATION_FORM_URLENCODED; @@ -519,7 +519,7 @@ private static Request.Builder builder(final Builder builder) { } String method = builder.method.toUpperCase(); String mediaType = String.format("%s;charset=%s", builder.mediaType, builder.requestCharset); - if (StringKit.equals(method, Http.GET)) { + if (StringKit.equals(method, HTTP.GET)) { if (MapKit.isNotEmpty(builder.formMap)) { String form = builder.formMap.entrySet().stream() .map(entry -> String.format("%s=%s", entry.getKey(), entry.getValue())) @@ -527,7 +527,7 @@ private static Request.Builder builder(final Builder builder) { builder.url = String.format("%s%s%s", builder.url, builder.url.contains(Symbol.QUESTION_MARK) ? Symbol.AND : Symbol.QUESTION_MARK, form); } request.get(); - } else if (ArrayKit.contains(new String[]{Http.POST, Http.PUT, Http.DELETE, Http.PATCH}, method)) { + } else if (ArrayKit.contains(new String[]{HTTP.POST, HTTP.PUT, HTTP.DELETE, HTTP.PATCH}, method)) { if (StringKit.isNotEmpty(builder.data)) { RequestBody requestBody = RequestBody.create(MediaType.valueOf(mediaType), builder.data); request.method(method, requestBody); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java b/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java index 3b0c5fe9dd..2eeb8dd2d2 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import java.io.IOException; @@ -45,13 +45,13 @@ public enum Protocol { /** * 一种过时的plaintext,默认情况下不使用持久套接字 */ - HTTP_1_0(Http.HTTP_1_0), + HTTP_1_0(HTTP.HTTP_1_0), /** * 包含持久连接的plaintext * 此版本的Httpd实现了RFC 7230,并跟踪对该规范的修订 */ - HTTP_1_1(Http.HTTP_1_1), + HTTP_1_1(HTTP.HTTP_1_1), /** * IETF的二进制框架协议,包括头压缩、在同一个套接字上多路复用多个请求和服务器推送 @@ -63,27 +63,27 @@ public enum Protocol { * Chromium的二进制框架协议,包括标头压缩、在同一个套接字上多路复用多个请求和服务器推送 * HTTP/1.1语义在SPDY/3上分层. */ - SPDY_3(Http.SPDY_3_1), + SPDY_3(HTTP.SPDY_3_1), /** * 明文HTTP/2,没有"upgrade"往返。此选项要求客户端事先知道服务器支持明文HTTP/2 */ - H2_PRIOR_KNOWLEDGE(Http.H2_PRIOR_KNOWLEDGE), + H2_PRIOR_KNOWLEDGE(HTTP.H2_PRIOR_KNOWLEDGE), /** * QUIC(快速UDP互联网连接)是一个新的多路复用和UDP之上的安全传输, * 从底层设计和优化的HTTP/2语义。HTTP/1.1语义是在HTTP/2上分层的 */ - QUIC(Http.QUIC), + QUIC(HTTP.QUIC), /** * SOAP 1.1协议 */ - SOAP_1_1(Http.SOAP_1_1), + SOAP_1_1(HTTP.SOAP_1_1), /** * SOAP 1.2协议 */ - SOAP_1_2(Http.SOAP_1_2); + SOAP_1_2(HTTP.SOAP_1_2); private final String protocol; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Request.java b/bus-http/src/main/java/org/miaixz/bus/http/Request.java index 6ebdd75264..9d1e12ca06 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Request.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Request.java @@ -29,8 +29,8 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.bodys.RequestBody; import org.miaixz.bus.http.cache.CacheControl; @@ -238,19 +238,19 @@ public Builder cacheControl(CacheControl cacheControl) { } public Builder get() { - return method(Http.GET, null); + return method(HTTP.GET, null); } public Builder head() { - return method(Http.HEAD, null); + return method(HTTP.HEAD, null); } public Builder post(RequestBody body) { - return method(Http.POST, body); + return method(HTTP.POST, body); } public Builder delete(RequestBody body) { - return method(Http.DELETE, body); + return method(HTTP.DELETE, body); } public Builder delete() { @@ -258,20 +258,20 @@ public Builder delete() { } public Builder put(RequestBody body) { - return method(Http.PUT, body); + return method(HTTP.PUT, body); } public Builder patch(RequestBody body) { - return method(Http.PATCH, body); + return method(HTTP.PATCH, body); } public Builder method(String method, RequestBody body) { if (null == method) throw new NullPointerException("method == null"); if (method.length() == 0) throw new IllegalArgumentException("method.length() == 0"); - if (body != null && !Http.permitsRequestBody(method)) { + if (body != null && !HTTP.permitsRequestBody(method)) { throw new IllegalArgumentException("method " + method + " must not have a request body."); } - if (body == null && Http.requiresRequestBody(method)) { + if (body == null && HTTP.requiresRequestBody(method)) { throw new IllegalArgumentException("method " + method + " must have a request body."); } this.method = method; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Response.java b/bus-http/src/main/java/org/miaixz/bus/http/Response.java index d11da468fc..4743cbcb01 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Response.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Response.java @@ -30,8 +30,8 @@ import org.miaixz.bus.core.io.buffer.Buffer; import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.accord.Exchange; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.cache.CacheControl; @@ -202,12 +202,12 @@ public Builder newBuilder() { */ public boolean isRedirect() { switch (code) { - case Http.HTTP_PERM_REDIRECT: - case Http.HTTP_TEMP_REDIRECT: - case Http.HTTP_MULT_CHOICE: - case Http.HTTP_MOVED_PERM: - case Http.HTTP_MOVED_TEMP: - case Http.HTTP_SEE_OTHER: + case HTTP.HTTP_PERM_REDIRECT: + case HTTP.HTTP_TEMP_REDIRECT: + case HTTP.HTTP_MULT_CHOICE: + case HTTP.HTTP_MOVED_PERM: + case HTTP.HTTP_MOVED_TEMP: + case HTTP.HTTP_SEE_OTHER: return true; default: return false; @@ -255,9 +255,9 @@ public Response priorResponse() { */ public List challenges() { String responseField; - if (code == Http.HTTP_UNAUTHORIZED) { + if (code == HTTP.HTTP_UNAUTHORIZED) { responseField = Header.WWW_AUTHENTICATE; - } else if (code == Http.HTTP_PROXY_AUTH) { + } else if (code == HTTP.HTTP_PROXY_AUTH) { responseField = Header.PROXY_AUTHENTICATE; } else { return Collections.emptyList(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java b/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java index 925d44d8f7..95c69a40f7 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java @@ -31,7 +31,7 @@ import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import java.net.MalformedURLException; import java.net.URI; @@ -124,9 +124,9 @@ public class UnoUrl { * otherwise. */ public static int defaultPort(String scheme) { - if (Http.HTTP.equals(scheme)) { + if (HTTP.HTTP.equals(scheme)) { return 80; - } else if (Http.HTTPS.equals(scheme)) { + } else if (HTTP.HTTPS.equals(scheme)) { return 443; } else { return -1; @@ -950,10 +950,10 @@ private static int parsePort(String input, int pos, int limit) { public Builder scheme(String scheme) { if (null == scheme) { throw new NullPointerException("scheme == null"); - } else if (scheme.equalsIgnoreCase(Http.HTTP)) { - this.scheme = Http.HTTP; - } else if (scheme.equalsIgnoreCase(Http.HTTPS)) { - this.scheme = Http.HTTPS; + } else if (scheme.equalsIgnoreCase(HTTP.HTTP)) { + this.scheme = HTTP.HTTP; + } else if (scheme.equalsIgnoreCase(HTTP.HTTPS)) { + this.scheme = HTTP.HTTPS; } else { throw new IllegalArgumentException("unexpected scheme: " + scheme); } @@ -1287,12 +1287,12 @@ Builder parse(UnoUrl base, String input) { int schemeDelimiterOffset = schemeDelimiterOffset(input, pos, limit); if (schemeDelimiterOffset != -1) { - if (input.regionMatches(true, pos, Http.HTTPS + Symbol.COLON, 0, 6)) { - this.scheme = Http.HTTPS; - pos += (Http.HTTPS + Symbol.COLON).length(); - } else if (input.regionMatches(true, pos, Http.HTTP + Symbol.COLON, 0, 5)) { - this.scheme = Http.HTTP; - pos += (Http.HTTP + Symbol.COLON).length(); + if (input.regionMatches(true, pos, HTTP.HTTPS + Symbol.COLON, 0, 6)) { + this.scheme = HTTP.HTTPS; + pos += (HTTP.HTTPS + Symbol.COLON).length(); + } else if (input.regionMatches(true, pos, HTTP.HTTP + Symbol.COLON, 0, 5)) { + this.scheme = HTTP.HTTP; + pos += (HTTP.HTTP + Symbol.COLON).length(); } else { throw new IllegalArgumentException("Expected URL scheme 'http' or 'https' but was '" + input.substring(0, schemeDelimiterOffset) + Symbol.SINGLE_QUOTE); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java index ee777b7671..bf3bfb6d04 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectInterceptor.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http.accord; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Httpd; import org.miaixz.bus.http.Request; import org.miaixz.bus.http.Response; @@ -58,7 +58,7 @@ public Response intercept(NewChain chain) throws IOException { Transmitter transmitter = realChain.transmitter(); // 我们需要网络来满足这个要求。可能用于验证条件GET - boolean doExtensiveHealthChecks = !Http.GET.equals(request.method()); + boolean doExtensiveHealthChecks = !HTTP.GET.equals(request.method()); Exchange exchange = transmitter.newExchange(chain, doExtensiveHealthChecks); return realChain.proceed(request, transmitter, exchange); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java index 3063581441..a74abf2bae 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java @@ -32,8 +32,8 @@ import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.RevisedException; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.net.tls.TrustAnyHostnameVerifier; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; @@ -421,13 +421,13 @@ private Request createTunnel(int readTimeout, int writeTimeout, Request tunnelRe tunnelCodec.skipConnectBody(response); switch (response.code()) { - case Http.HTTP_OK: + case HTTP.HTTP_OK: if (!source.getBuffer().exhausted() || !sink.buffer().exhausted()) { throw new IOException("TLS tunnel buffered too many bytes!"); } return null; - case Http.HTTP_PROXY_AUTH: + case HTTP.HTTP_PROXY_AUTH: tunnelRequest = route.address().proxyAuthenticator().authenticate(route, response); if (null == tunnelRequest) { throw new IOException("Failed to authenticate with proxy"); @@ -455,7 +455,7 @@ private Request createTunnel(int readTimeout, int writeTimeout, Request tunnelRe private Request createTunnelRequest() throws IOException { Request proxyConnectRequest = new Request.Builder() .url(route.address().url()) - .method(Http.CONNECT, null) + .method(HTTP.CONNECT, null) .header(Header.HOST, Builder.hostHeader(route.address().url(), true)) .header(Header.PROXY_CONNECTION, Header.KEEP_ALIVE) .header(Header.USER_AGENT, "Httpd/" + Version.all()) @@ -464,7 +464,7 @@ private Request createTunnelRequest() throws IOException { Response fakeAuthChallengeResponse = new Response.Builder() .request(proxyConnectRequest) .protocol(Protocol.HTTP_1_1) - .code(Http.HTTP_PROXY_AUTH) + .code(HTTP.HTTP_PROXY_AUTH) .message("Preemptive Authenticate") .body(Builder.EMPTY_RESPONSE) .sentRequestAtMillis(-1L) diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java index 741138b1bb..1a9db9b81a 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java @@ -37,8 +37,8 @@ import org.miaixz.bus.core.io.source.Source; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.net.tls.TlsVersion; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; @@ -175,7 +175,7 @@ Response get(Request request) { CacheRequest put(Response response) { String requestMethod = response.request().method(); - if (Http.invalidatesCache(response.request().method())) { + if (HTTP.invalidatesCache(response.request().method())) { try { remove(response.request()); } catch (IOException ignored) { @@ -183,7 +183,7 @@ CacheRequest put(Response response) { } return null; } - if (!Http.GET.equals(requestMethod)) { + if (!HTTP.GET.equals(requestMethod)) { // 不要缓存非get响应。从技术上讲,我们可以缓存HEAD请求和POST请求,但是这样做的复杂性很高,好处很少 return null; } @@ -555,7 +555,7 @@ public void writeTo(DiskLruCache.Editor editor) throws IOException { } private boolean isHttps() { - return url.startsWith(Http.HTTPS_PREFIX); + return url.startsWith(HTTP.HTTPS_PREFIX); } private List readCertificateList(BufferSource source) throws IOException { diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java index d16ef8d49e..df93aa2361 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java @@ -34,8 +34,8 @@ import org.miaixz.bus.core.io.source.Source; import org.miaixz.bus.core.io.timout.Timeout; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.bodys.RealResponseBody; @@ -182,7 +182,7 @@ public Response intercept(NewChain chain) throws IOException { // 如果我们也有缓存响应,那么在做一个条件get if (null != cacheResponse) { - if (networkResponse.code() == Http.HTTP_NOT_MODIFIED) { + if (networkResponse.code() == HTTP.HTTP_NOT_MODIFIED) { Response response = cacheResponse.newBuilder() .headers(combine(cacheResponse.headers(), networkResponse.headers())) .sentRequestAtMillis(networkResponse.sentRequestAtMillis()) @@ -213,7 +213,7 @@ public Response intercept(NewChain chain) throws IOException { return cacheWritingResponse(cacheRequest, response); } - if (Http.invalidatesCache(networkRequest.method())) { + if (HTTP.invalidatesCache(networkRequest.method())) { try { cache.remove(networkRequest); } catch (IOException ignored) { diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java index 005a278127..0932b2b2e5 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java @@ -27,8 +27,8 @@ */ package org.miaixz.bus.http.cache; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.http.Builder; import org.miaixz.bus.http.Headers; import org.miaixz.bus.http.Request; @@ -73,21 +73,21 @@ public class CacheStrategy { public static boolean isCacheable(Response response, Request request) { // 总是去网络获取非缓存的响应代码(RFC 7231 section 6.1),这个实现不支持缓存部分内容 switch (response.code()) { - case Http.HTTP_OK: - case Http.HTTP_NOT_AUTHORITATIVE: - case Http.HTTP_NO_CONTENT: - case Http.HTTP_MULT_CHOICE: - case Http.HTTP_MOVED_PERM: - case Http.HTTP_NOT_FOUND: - case Http.HTTP_BAD_METHOD: - case Http.HTTP_GONE: - case Http.HTTP_REQ_TOO_LONG: - case Http.HTTP_NOT_IMPLEMENTED: - case Http.HTTP_PERM_REDIRECT: + case HTTP.HTTP_OK: + case HTTP.HTTP_NOT_AUTHORITATIVE: + case HTTP.HTTP_NO_CONTENT: + case HTTP.HTTP_MULT_CHOICE: + case HTTP.HTTP_MOVED_PERM: + case HTTP.HTTP_NOT_FOUND: + case HTTP.HTTP_BAD_METHOD: + case HTTP.HTTP_GONE: + case HTTP.HTTP_REQ_TOO_LONG: + case HTTP.HTTP_NOT_IMPLEMENTED: + case HTTP.HTTP_PERM_REDIRECT: // 这些代码可以被缓存,除非标头禁止 break; - case Http.HTTP_MOVED_TEMP: - case Http.HTTP_TEMP_REDIRECT: + case HTTP.HTTP_MOVED_TEMP: + case HTTP.HTTP_TEMP_REDIRECT: if (null != response.header(Header.EXPIRES) || response.cacheControl().maxAgeSeconds() != -1 || response.cacheControl().isPublic() diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java index e47eebe807..16f6d91bfc 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java @@ -28,8 +28,8 @@ package org.miaixz.bus.http.metric.http; import org.miaixz.bus.core.io.sink.BufferSink; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.Builder; import org.miaixz.bus.http.Request; @@ -68,7 +68,7 @@ public Response intercept(NewChain chain) throws IOException { boolean responseHeadersStarted = false; Response.Builder responseBuilder = null; - if (Http.permitsRequestBody(request.method()) && request.body() != null) { + if (HTTP.permitsRequestBody(request.method()) && request.body() != null) { // If there's a "Expect: 100-continue" header on the request, wait for a "HTTP/1.1 100 // Continue" response before transmitting the request body. If we don't get that, return // what we did get (such as a 4xx response) without ever transmitting the request body. diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java index 5e9f2b0c2f..2883095f38 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java @@ -33,8 +33,8 @@ import org.miaixz.bus.core.io.source.Source; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.core.xyz.StringKit; @@ -53,19 +53,19 @@ class Hpack { static final Http2Header[] STATIC_HEADER_TABLE = new Http2Header[]{ new Http2Header(Http2Header.TARGET_AUTHORITY, Normal.EMPTY), - new Http2Header(Http2Header.TARGET_METHOD, Http.GET), - new Http2Header(Http2Header.TARGET_METHOD, Http.POST), + new Http2Header(Http2Header.TARGET_METHOD, HTTP.GET), + new Http2Header(Http2Header.TARGET_METHOD, HTTP.POST), new Http2Header(Http2Header.TARGET_PATH, Symbol.SLASH), new Http2Header(Http2Header.TARGET_PATH, "/index.html"), - new Http2Header(Http2Header.TARGET_SCHEME, Http.HTTP), - new Http2Header(Http2Header.TARGET_SCHEME, Http.HTTPS), - new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_OK)), - new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NO_CONTENT)), - new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_PARTIAL)), - new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NOT_MODIFIED)), - new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_BAD_REQUEST)), - new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_NOT_FOUND)), - new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(Http.HTTP_INTERNAL_ERROR)), + new Http2Header(Http2Header.TARGET_SCHEME, HTTP.HTTP), + new Http2Header(Http2Header.TARGET_SCHEME, HTTP.HTTPS), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_OK)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_NO_CONTENT)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_PARTIAL)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_NOT_MODIFIED)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_BAD_REQUEST)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_NOT_FOUND)), + new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_INTERNAL_ERROR)), new Http2Header(Header.ACCEPT_CHARSET, Normal.EMPTY), new Http2Header(Header.ACCEPT_ENCODING, "gzip, deflate"), new Http2Header(Header.ACCEPT_LANGUAGE, Normal.EMPTY), diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http1Codec.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http1Codec.java index 9e89f68a60..2a0778f4b6 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http1Codec.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http1Codec.java @@ -36,7 +36,7 @@ import org.miaixz.bus.core.io.timout.Timeout; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.RealConnection; import org.miaixz.bus.http.metric.Internal; @@ -227,9 +227,9 @@ public Response.Builder readResponseHeaders(boolean expectContinue) throws IOExc .message(statusLine.message) .headers(readHeaders()); - if (expectContinue && statusLine.code == Http.HTTP_CONTINUE) { + if (expectContinue && statusLine.code == HTTP.HTTP_CONTINUE) { return null; - } else if (statusLine.code == Http.HTTP_CONTINUE) { + } else if (statusLine.code == HTTP.HTTP_CONTINUE) { state = STATE_READ_RESPONSE_HEADERS; return responseBuilder; } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java index 34f07d0347..f1649dde7e 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java @@ -29,8 +29,8 @@ import org.miaixz.bus.core.io.sink.Sink; import org.miaixz.bus.core.io.source.Source; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.RealConnection; @@ -63,10 +63,10 @@ public class Http2Codec implements HttpCodec { Header.TRANSFER_ENCODING, Header.ENCODING, Header.UPGRADE, - Http.TARGET_METHOD_UTF8, - Http.TARGET_PATH_UTF8, - Http.TARGET_SCHEME_UTF8, - Http.TARGET_AUTHORITY_UTF8); + HTTP.TARGET_METHOD_UTF8, + HTTP.TARGET_PATH_UTF8, + HTTP.TARGET_SCHEME_UTF8, + HTTP.TARGET_AUTHORITY_UTF8); private static final List HTTP_2_SKIPPED_RESPONSE_HEADERS = Builder.immutableList( Header.CONNECTION, Header.HOST, @@ -126,7 +126,7 @@ public static Response.Builder readHttp2HeadersList(Headers headerBlock, for (int i = 0, size = headerBlock.size(); i < size; i++) { String name = headerBlock.name(i); String value = headerBlock.value(i); - if (name.equals(Http.RESPONSE_STATUS_UTF8)) { + if (name.equals(HTTP.RESPONSE_STATUS_UTF8)) { statusLine = StatusLine.parse("HTTP/1.1 " + value); } else if (!HTTP_2_SKIPPED_RESPONSE_HEADERS.contains(name)) { Internal.instance.addLenient(headersBuilder, name, value); @@ -182,7 +182,7 @@ public void finishRequest() throws IOException { public Response.Builder readResponseHeaders(boolean expectContinue) throws IOException { Headers headers = stream.takeHeaders(); Response.Builder responseBuilder = readHttp2HeadersList(headers, protocol); - if (expectContinue && Internal.instance.code(responseBuilder) == Http.HTTP_CONTINUE) { + if (expectContinue && Internal.instance.code(responseBuilder) == HTTP.HTTP_CONTINUE) { return null; } return responseBuilder; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Connection.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Connection.java index 9251d6e7a0..1bfd9c78c8 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Connection.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Connection.java @@ -32,7 +32,7 @@ import org.miaixz.bus.core.io.sink.BufferSink; import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.lang.Normal; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.Headers; import org.miaixz.bus.http.metric.NamedRunnable; @@ -155,7 +155,7 @@ public class Http2Connection implements Closeable { // thrashing window updates every 64KiB, yet small enough to avoid blowing // up the heap. if (builder.client) { - settings.set(Http.INITIAL_WINDOW_SIZE, CLIENT_WINDOW_SIZE); + settings.set(HTTP.INITIAL_WINDOW_SIZE, CLIENT_WINDOW_SIZE); } connectionName = builder.connectionName; @@ -170,8 +170,8 @@ public class Http2Connection implements Closeable { // Like newSingleThreadExecutor, except lazy creates the thread. pushExecutor = new ThreadPoolExecutor(0, 1, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), org.miaixz.bus.http.Builder.threadFactory(String.format("Http %s Push Observer", connectionName), true)); - peerSettings.set(Http.INITIAL_WINDOW_SIZE, Http.DEFAULT_INITIAL_WINDOW_SIZE); - peerSettings.set(Http.MAX_FRAME_SIZE, Http2.INITIAL_MAX_FRAME_SIZE); + peerSettings.set(HTTP.INITIAL_WINDOW_SIZE, HTTP.DEFAULT_INITIAL_WINDOW_SIZE); + peerSettings.set(HTTP.MAX_FRAME_SIZE, Http2.INITIAL_MAX_FRAME_SIZE); bytesLeftInWriteWindow = peerSettings.getInitialWindowSize(); socket = builder.socket; writer = new Http2Writer(builder.sink, client); @@ -491,8 +491,8 @@ void start(boolean sendConnectionPreface) throws IOException { writer.connectionPreface(); writer.settings(settings); int windowSize = settings.getInitialWindowSize(); - if (windowSize != Http.DEFAULT_INITIAL_WINDOW_SIZE) { - writer.windowUpdate(0, windowSize - Http.DEFAULT_INITIAL_WINDOW_SIZE); + if (windowSize != HTTP.DEFAULT_INITIAL_WINDOW_SIZE) { + writer.windowUpdate(0, windowSize - HTTP.DEFAULT_INITIAL_WINDOW_SIZE); } } new Thread(readerRunnable).start(); // Not a daemon thread. diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Header.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Header.java index 025a32b2da..268d79651a 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Header.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Header.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.io.ByteString; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; /** * HTTP header: the name is an ASCII string, but the value can be UTF-8. @@ -38,11 +38,11 @@ public class Http2Header { // Special header names defined in HTTP/2 spec. public static final ByteString PSEUDO_PREFIX = ByteString.encodeUtf8(Symbol.COLON); - public static final ByteString RESPONSE_STATUS = ByteString.encodeUtf8(Http.RESPONSE_STATUS_UTF8); - public static final ByteString TARGET_METHOD = ByteString.encodeUtf8(Http.TARGET_METHOD_UTF8); - public static final ByteString TARGET_PATH = ByteString.encodeUtf8(Http.TARGET_PATH_UTF8); - public static final ByteString TARGET_SCHEME = ByteString.encodeUtf8(Http.TARGET_SCHEME_UTF8); - public static final ByteString TARGET_AUTHORITY = ByteString.encodeUtf8(Http.TARGET_AUTHORITY_UTF8); + public static final ByteString RESPONSE_STATUS = ByteString.encodeUtf8(HTTP.RESPONSE_STATUS_UTF8); + public static final ByteString TARGET_METHOD = ByteString.encodeUtf8(HTTP.TARGET_METHOD_UTF8); + public static final ByteString TARGET_PATH = ByteString.encodeUtf8(HTTP.TARGET_PATH_UTF8); + public static final ByteString TARGET_SCHEME = ByteString.encodeUtf8(HTTP.TARGET_SCHEME_UTF8); + public static final ByteString TARGET_AUTHORITY = ByteString.encodeUtf8(HTTP.TARGET_AUTHORITY_UTF8); /** * Name in case-insensitive ASCII encoding. diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Settings.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Settings.java index 4a884c06d4..093eb33c2c 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Settings.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Settings.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http.metric.http; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import java.util.Arrays; @@ -100,33 +100,33 @@ public int size() { } public int getHeaderTableSize() { - int bit = 1 << Http.HEADER_TABLE_SIZE; - return (bit & set) != 0 ? values[Http.HEADER_TABLE_SIZE] : -1; + int bit = 1 << HTTP.HEADER_TABLE_SIZE; + return (bit & set) != 0 ? values[HTTP.HEADER_TABLE_SIZE] : -1; } public boolean getEnablePush(boolean defaultValue) { - int bit = 1 << Http.ENABLE_PUSH; - return ((bit & set) != 0 ? values[Http.ENABLE_PUSH] : defaultValue ? 1 : 0) == 1; + int bit = 1 << HTTP.ENABLE_PUSH; + return ((bit & set) != 0 ? values[HTTP.ENABLE_PUSH] : defaultValue ? 1 : 0) == 1; } public int getMaxConcurrentStreams(int defaultValue) { - int bit = 1 << Http.MAX_CONCURRENT_STREAMS; - return (bit & set) != 0 ? values[Http.MAX_CONCURRENT_STREAMS] : defaultValue; + int bit = 1 << HTTP.MAX_CONCURRENT_STREAMS; + return (bit & set) != 0 ? values[HTTP.MAX_CONCURRENT_STREAMS] : defaultValue; } public int getMaxFrameSize(int defaultValue) { - int bit = 1 << Http.MAX_FRAME_SIZE; - return (bit & set) != 0 ? values[Http.MAX_FRAME_SIZE] : defaultValue; + int bit = 1 << HTTP.MAX_FRAME_SIZE; + return (bit & set) != 0 ? values[HTTP.MAX_FRAME_SIZE] : defaultValue; } public int getMaxHeaderListSize(int defaultValue) { - int bit = 1 << Http.MAX_HEADER_LIST_SIZE; - return (bit & set) != 0 ? values[Http.MAX_HEADER_LIST_SIZE] : defaultValue; + int bit = 1 << HTTP.MAX_HEADER_LIST_SIZE; + return (bit & set) != 0 ? values[HTTP.MAX_HEADER_LIST_SIZE] : defaultValue; } public int getInitialWindowSize() { - int bit = 1 << Http.INITIAL_WINDOW_SIZE; - return (bit & set) != 0 ? values[Http.INITIAL_WINDOW_SIZE] : Http.DEFAULT_INITIAL_WINDOW_SIZE; + int bit = 1 << HTTP.INITIAL_WINDOW_SIZE; + return (bit & set) != 0 ? values[HTTP.INITIAL_WINDOW_SIZE] : HTTP.DEFAULT_INITIAL_WINDOW_SIZE; } /** diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java index ce3a2dbf3d..eaa0e0d521 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java @@ -27,8 +27,8 @@ */ package org.miaixz.bus.http.metric.http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.Exchange; @@ -214,7 +214,7 @@ private Request followUpRequest(Response userResponse, Route route) throws IOExc final String method = userResponse.request().method(); switch (responseCode) { - case Http.HTTP_PROXY_AUTH: + case HTTP.HTTP_PROXY_AUTH: Proxy selectedProxy = route != null ? route.proxy() : httpd.proxy(); @@ -223,21 +223,21 @@ private Request followUpRequest(Response userResponse, Route route) throws IOExc } return httpd.proxyAuthenticator().authenticate(route, userResponse); - case Http.HTTP_UNAUTHORIZED: + case HTTP.HTTP_UNAUTHORIZED: return httpd.authenticator().authenticate(route, userResponse); - case Http.HTTP_PERM_REDIRECT: - case Http.HTTP_TEMP_REDIRECT: + case HTTP.HTTP_PERM_REDIRECT: + case HTTP.HTTP_TEMP_REDIRECT: // "If the 307 or 308 status code is received in response to a request other than GET // or HEAD, the user agent MUST NOT automatically redirect the request" if (!method.equals("GET") && !method.equals("HEAD")) { return null; } // fall-through - case Http.HTTP_MULT_CHOICE: - case Http.HTTP_MOVED_PERM: - case Http.HTTP_MOVED_TEMP: - case Http.HTTP_SEE_OTHER: + case HTTP.HTTP_MULT_CHOICE: + case HTTP.HTTP_MOVED_PERM: + case HTTP.HTTP_MOVED_TEMP: + case HTTP.HTTP_SEE_OTHER: // Does the client allow redirects? if (!httpd.followRedirects()) return null; @@ -254,9 +254,9 @@ private Request followUpRequest(Response userResponse, Route route) throws IOExc // Most redirects don't include a request body. Request.Builder requestBuilder = userResponse.request().newBuilder(); - if (Http.permitsRequestBody(method)) { - final boolean maintainBody = Http.redirectsWithBody(method); - if (Http.redirectsToGet(method)) { + if (HTTP.permitsRequestBody(method)) { + final boolean maintainBody = HTTP.redirectsWithBody(method); + if (HTTP.redirectsToGet(method)) { requestBuilder.method("GET", null); } else { RequestBody requestBody = maintainBody ? userResponse.request().body() : null; @@ -278,7 +278,7 @@ private Request followUpRequest(Response userResponse, Route route) throws IOExc return requestBuilder.url(url).build(); - case Http.HTTP_CLIENT_TIMEOUT: + case HTTP.HTTP_CLIENT_TIMEOUT: // 408's are rare in practice, but some servers like HAProxy use this response code. The // spec says that we may repeat the request without modifications. Modern browsers also // repeat the request (even non-idempotent ones.) @@ -293,7 +293,7 @@ private Request followUpRequest(Response userResponse, Route route) throws IOExc } if (userResponse.priorResponse() != null - && userResponse.priorResponse().code() == Http.HTTP_CLIENT_TIMEOUT) { + && userResponse.priorResponse().code() == HTTP.HTTP_CLIENT_TIMEOUT) { // We attempted to retry and got another timeout. Give up. return null; } @@ -304,9 +304,9 @@ private Request followUpRequest(Response userResponse, Route route) throws IOExc return userResponse.request(); - case Http.HTTP_UNAVAILABLE: + case HTTP.HTTP_UNAVAILABLE: if (userResponse.priorResponse() != null - && userResponse.priorResponse().code() == Http.HTTP_UNAVAILABLE) { + && userResponse.priorResponse().code() == HTTP.HTTP_UNAVAILABLE) { // We attempted to retry and got another timeout. Give up. return null; } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverCall.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverCall.java index 028bd91665..03f986c625 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverCall.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverCall.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.io.ByteString; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Httpv; import org.miaixz.bus.http.Request; import org.miaixz.bus.http.Response; @@ -79,7 +79,7 @@ public synchronized boolean close(int code, String reason) { } public void msgType(String type) { - if (null == type || type.equalsIgnoreCase(Http.FORM)) { + if (null == type || type.equalsIgnoreCase(HTTP.FORM)) { throw new IllegalArgumentException("msgType 不可为空 或 form"); } this.msgType = type; @@ -355,7 +355,7 @@ public Client heatbeat(int pingSeconds, int pongSeconds) { */ public CoverCall listen() { String bodyType = getBodyType(); - String msgType = Http.FORM.equalsIgnoreCase(bodyType) ? Http.JSON : bodyType; + String msgType = HTTP.FORM.equalsIgnoreCase(bodyType) ? HTTP.JSON : bodyType; CoverCall socket = new CoverCall(httpv.executor(), msgType); registeTagTask(socket); httpv.preprocess(this, () -> { diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverHttp.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverHttp.java index 55c68429a6..e4b5872722 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverHttp.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverHttp.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.MapKit; import org.miaixz.bus.core.xyz.ObjectKit; import org.miaixz.bus.http.*; @@ -541,7 +541,7 @@ protected NewCall prepareCall(String method) { } protected Request prepareRequest(String method) { - boolean bodyCanUsed = Http.permitsRequestBody(method); + boolean bodyCanUsed = HTTP.permitsRequestBody(method); assertNotConflict(!bodyCanUsed); Request.Builder builder = new Request.Builder() .url(buildUrlPath()); @@ -632,7 +632,7 @@ private RequestBody buildRequestBody() { if (null == bodyParams) { return new FormBody.Builder(charset).build(); } - if (Http.FORM.equalsIgnoreCase(bodyType)) { + if (HTTP.FORM.equalsIgnoreCase(bodyType)) { FormBody.Builder builder = new FormBody.Builder(charset); for (String name : bodyParams.keySet()) { String value = bodyParams.get(name); @@ -786,7 +786,7 @@ public Sync(Httpv client, String url) { * @return 请求结果 */ public CoverResult get() { - return request(Http.GET); + return request(HTTP.GET); } /** @@ -795,7 +795,7 @@ public CoverResult get() { * @return 请求结果 */ public CoverResult head() { - return request(Http.HEAD); + return request(HTTP.HEAD); } /** @@ -804,7 +804,7 @@ public CoverResult head() { * @return 请求结果 */ public CoverResult post() { - return request(Http.POST); + return request(HTTP.POST); } /** @@ -813,7 +813,7 @@ public CoverResult post() { * @return 请求结果 */ public CoverResult put() { - return request(Http.PUT); + return request(HTTP.PUT); } /** @@ -822,7 +822,7 @@ public CoverResult put() { * @return HttpCall */ public CoverResult patch() { - return request(Http.PATCH); + return request(HTTP.PATCH); } /** @@ -831,7 +831,7 @@ public CoverResult patch() { * @return 请求结果 */ public CoverResult delete() { - return request(Http.DELETE); + return request(HTTP.DELETE); } /** @@ -973,7 +973,7 @@ public Async setOnResponse(Callback onResponse) { * @return GiveCall */ public GiveCall get() { - return request(Http.GET); + return request(HTTP.GET); } /** @@ -982,7 +982,7 @@ public GiveCall get() { * @return GiveCall */ public GiveCall head() { - return request(Http.HEAD); + return request(HTTP.HEAD); } /** @@ -991,7 +991,7 @@ public GiveCall head() { * @return GiveCall */ public GiveCall post() { - return request(Http.POST); + return request(HTTP.POST); } /** @@ -1000,7 +1000,7 @@ public GiveCall post() { * @return GiveCall */ public GiveCall put() { - return request(Http.PUT); + return request(HTTP.PUT); } /** @@ -1009,7 +1009,7 @@ public GiveCall put() { * @return GiveCall */ public GiveCall patch() { - return request(Http.PATCH); + return request(HTTP.PATCH); } /** @@ -1018,7 +1018,7 @@ public GiveCall patch() { * @return GiveCall */ public GiveCall delete() { - return request(Http.DELETE); + return request(HTTP.DELETE); } /** diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverTasks.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverTasks.java index 79a118e948..79588a40ef 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverTasks.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/CoverTasks.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Callback; import java.io.File; @@ -177,13 +177,13 @@ public Data doMsgConvert(String type, ConvertFunc callable) { private String toMediaType(String type) { if (type != null) { String lower = type.toLowerCase(); - if (lower.contains(Http.JSON)) { + if (lower.contains(HTTP.JSON)) { return MediaType.APPLICATION_JSON; } - if (lower.contains(Http.XML)) { + if (lower.contains(HTTP.XML)) { return MediaType.APPLICATION_XML; } - if (lower.contains(Http.PROTOBUF)) { + if (lower.contains(HTTP.PROTOBUF)) { return MediaType.APPLICATION_PROTOBUF; } } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java b/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java index 0c2ad9fbf7..d1768bfcc1 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.io.ByteString; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.UnoUrl; import javax.net.ssl.SSLPeerUnverifiedException; @@ -208,8 +208,8 @@ static class Pin { Pin(String pattern, String pin) { this.pattern = pattern; this.canonicalHostname = pattern.startsWith(WILDCARD) - ? UnoUrl.get(Http.HTTP_PREFIX + pattern.substring(WILDCARD.length())).host() - : UnoUrl.get(Http.HTTP_PREFIX + pattern).host(); + ? UnoUrl.get(HTTP.HTTP_PREFIX + pattern.substring(WILDCARD.length())).host() + : UnoUrl.get(HTTP.HTTP_PREFIX + pattern).host(); if (pin.startsWith("sha1/")) { this.hashAlgorithm = "sha1/"; this.hash = ByteString.decodeBase64(pin.substring("sha1/".length())); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java b/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java index 9d59d1d54c..e0c71d5446 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java @@ -32,8 +32,8 @@ import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.Exchange; @@ -164,7 +164,7 @@ public class RealWebSocket implements WebSocket, WebSocketReader.FrameCallback { public RealWebSocket(Request request, WebSocketListener listener, Random random, long pingIntervalMillis) { - if (!Http.GET.equals(request.method())) { + if (!HTTP.GET.equals(request.method())) { throw new IllegalArgumentException("Request must be GET: " + request.method()); } this.originalRequest = request; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Device.java b/bus-image/src/main/java/org/miaixz/bus/image/Device.java index 646fd5d5b1..67be42fa75 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Device.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Device.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.image.galaxy.Material; import org.miaixz.bus.image.galaxy.data.Code; import org.miaixz.bus.image.galaxy.data.Issuer; @@ -1203,7 +1203,7 @@ public SSLContext sslContext() throws GeneralSecurityException, IOException { if (null != ctx) return ctx; - ctx = SSLContext.getInstance(Http.TLS); + ctx = SSLContext.getInstance(HTTP.TLS); ctx.init(keyManagers(), trustManagers(), null); sslContext = ctx; return ctx; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Node.java b/bus-image/src/main/java/org/miaixz/bus/image/Node.java index b59dd6ba9e..3daa1967b1 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Node.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Node.java @@ -30,7 +30,7 @@ import lombok.Getter; import lombok.Setter; import org.miaixz.bus.core.lang.Normal; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.image.metric.Association; import org.miaixz.bus.logger.Logger; @@ -88,7 +88,7 @@ public static String convertToIP(String hostname) { } catch (UnknownHostException e) { Logger.error("Cannot resolve hostname", e); } - return StringKit.hasText(hostname) ? hostname : Http.HOST_IPV4; + return StringKit.hasText(hostname) ? hostname : HTTP.HOST_IPV4; } public static Node buildLocalDicomNode(Association as) { diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Option.java b/bus-image/src/main/java/org/miaixz/bus/image/Option.java index df557e11af..22ad8f6e0d 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Option.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Option.java @@ -29,7 +29,7 @@ import lombok.Getter; import lombok.Setter; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.image.metric.Connection; import org.miaixz.bus.image.metric.internal.pdu.ExtendedNegotiate; @@ -90,8 +90,8 @@ public Option(boolean tlsNeedClientAuth, String keystoreURL, String keystoreType "SSL_RSA_WITH_3DES_EDE_CBC_SHA" }, new String[]{ - Http.TLS_V_10, - Http.SSL_V_30 + HTTP.TLS_V_10, + HTTP.SSL_V_30 }, tlsNeedClientAuth, keystoreURL, diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java index ff5aa8135c..1457fb5ce8 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.image.Device; import java.util.ArrayList; @@ -178,7 +178,7 @@ private Connection firstInstalledConnection() { public StringBuilder getServiceURL(Connection conn) { return new StringBuilder(Normal._64) - .append(conn.isTls() ? Http.HTTPS_PREFIX : Http.HTTP_PREFIX) + .append(conn.isTls() ? HTTP.HTTPS_PREFIX : HTTP.HTTP_PREFIX) .append(conn.getHostname()) .append(Symbol.C_COLON) .append(conn.getPort()) diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/aliyun/AliyunProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/aliyun/AliyunProvider.java index 40868b1ecf..3d10f45910 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/aliyun/AliyunProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/aliyun/AliyunProvider.java @@ -31,7 +31,7 @@ import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.notify.Context; import org.miaixz.bus.notify.magic.ErrorCode; @@ -101,7 +101,7 @@ protected String getSign(Map params) { } // 去除第一个多余的&符号 String sortedQueryString = sortQueryStringTmp.substring(1); - String stringToSign = Http.GET + Symbol.AND + + String stringToSign = HTTP.GET + Symbol.AND + specialUrlEncode(Symbol.SLASH) + Symbol.AND + specialUrlEncode(sortedQueryString); return sign(stringToSign); diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/dingtalk/DingTalkProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/dingtalk/DingTalkProvider.java index 55837e9fc8..a225363e2e 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/dingtalk/DingTalkProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/dingtalk/DingTalkProvider.java @@ -28,7 +28,7 @@ package org.miaixz.bus.notify.metric.dingtalk; import lombok.Setter; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; @@ -76,7 +76,7 @@ public Message send(DingTalkMaterial entity) { String response = Httpx.post(this.getUrl(entity), bodys); String errcode = JsonKit.getValue(response, "errcode"); return Message.builder() - .errcode(String.valueOf(Http.HTTP_OK).equals(errcode) ? ErrorCode.SUCCESS.getCode() : errcode) + .errcode(String.valueOf(HTTP.HTTP_OK).equals(errcode) ? ErrorCode.SUCCESS.getCode() : errcode) .errmsg(JsonKit.getValue(response, "errmsg")) .build(); } @@ -99,7 +99,7 @@ private String requestToken(String url) { paramMap.put("corpsecret", context.getAppSecret()); String response = Httpx.get(url, paramMap); String errcode = JsonKit.getValue(response, "errcode"); - if (String.valueOf(Http.HTTP_OK).equals(errcode)) { + if (String.valueOf(HTTP.HTTP_OK).equals(errcode)) { String access_token = JsonKit.getValue(response, "access_token"); refreshTokenTime = System.currentTimeMillis(); accessToken.set(access_token); diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/emay/EmaySmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/emay/EmaySmsProvider.java index e11286f209..09b91a5cad 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/emay/EmaySmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/emay/EmaySmsProvider.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.MediaType; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.DateKit; import org.miaixz.bus.core.xyz.MapKit; @@ -67,7 +67,7 @@ public Message send(EmayMaterial entity) { String response = Httpx.post(this.getUrl(entity), bodys, headers); String errcode = JsonKit.getValue(response, "errcode"); return Message.builder() - .errcode(String.valueOf(Http.HTTP_OK).equals(errcode) ? ErrorCode.SUCCESS.getCode() : errcode) + .errcode(String.valueOf(HTTP.HTTP_OK).equals(errcode) ? ErrorCode.SUCCESS.getCode() : errcode) .errmsg(JsonKit.getValue(response, "errmsg")) .build(); } diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java index 03d02a2e3a..89f661c9e9 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java @@ -28,8 +28,8 @@ package org.miaixz.bus.notify.metric.jdcloud; import org.miaixz.bus.core.lang.MediaType; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; -import org.miaixz.bus.core.net.Http; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.notify.Context; @@ -67,8 +67,8 @@ public Message send(JdcloudMaterial entity) { String response = Httpx.post(this.getUrl(entity), bodys, headers); int status = JsonKit.getValue(response, "statusCode"); - String errcode = status == Http.HTTP_OK ? ErrorCode.SUCCESS.getCode() : ErrorCode.FAILURE.getCode(); - String errmsg = status == Http.HTTP_OK ? ErrorCode.SUCCESS.getDesc() : ErrorCode.FAILURE.getDesc(); + String errcode = status == HTTP.HTTP_OK ? ErrorCode.SUCCESS.getCode() : ErrorCode.FAILURE.getCode(); + String errmsg = status == HTTP.HTTP_OK ? ErrorCode.SUCCESS.getDesc() : ErrorCode.FAILURE.getDesc(); return Message.builder() .errcode(errcode) diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/netease/NeteaseProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/netease/NeteaseProvider.java index e5b6e36435..5967453ea8 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/netease/NeteaseProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/netease/NeteaseProvider.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.notify.metric.netease; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.logger.Logger; @@ -98,7 +98,7 @@ public Message post(String routerUrl, Map map) { Logger.debug("netease result:{}", response); String code = JsonKit.getValue(response, "Code"); return Message.builder() - .errcode(String.valueOf(Http.HTTP_OK).equals(code) ? ErrorCode.SUCCESS.getCode() : code) + .errcode(String.valueOf(HTTP.HTTP_OK).equals(code) ? ErrorCode.SUCCESS.getCode() : code) .errmsg(JsonKit.getValue(response, "desc")).build(); } diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java index c38be323d6..7aa5a9c1be 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java @@ -29,7 +29,7 @@ import org.miaixz.bus.cache.metric.ExtendCache; import org.miaixz.bus.core.lang.exception.AuthorizedException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.oauth.magic.Callback; import org.miaixz.bus.oauth.magic.ErrorCode; @@ -84,21 +84,21 @@ public static void checkConfig(Context context, Complex complex) { if (StringKit.isEmpty(redirectUri)) { throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } - if (!Http.isHttp(redirectUri) && !Http.isHttps(redirectUri)) { + if (!HTTP.isHttp(redirectUri) && !HTTP.isHttps(redirectUri)) { throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } // facebook的回调地址必须为https的链接 - if (Registry.FACEBOOK == complex && !Http.isHttps(redirectUri)) { + if (Registry.FACEBOOK == complex && !HTTP.isHttps(redirectUri)) { // FacebookScope's redirect uri must use the HTTPS protocol throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } // 微软的回调地址必须为https的链接或者localhost,不允许使用http - if (Registry.MICROSOFT == complex && !Http.isHttpsOrLocalHost(redirectUri)) { + if (Registry.MICROSOFT == complex && !HTTP.isHttpsOrLocalHost(redirectUri)) { // MicrosoftScope's redirect uri must use the HTTPS or localhost throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } // 微软中国的回调地址必须为https的链接或者localhost,不允许使用http - if (Registry.MICROSOFT_CN == complex && !Http.isHttpsOrLocalHost(redirectUri)) { + if (Registry.MICROSOFT_CN == complex && !HTTP.isHttpsOrLocalHost(redirectUri)) { // MicrosoftScope's redirect uri must use the HTTPS or localhost throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java index 5a72726464..f1a17071a3 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java @@ -39,7 +39,7 @@ import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Gender; import org.miaixz.bus.core.lang.exception.AuthorizedException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.oauth.Builder; import org.miaixz.bus.oauth.Checker; @@ -109,7 +109,7 @@ protected void check(Context context) { } // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1 - if (Http.isLocalHost(context.getRedirectUri())) { + if (HTTP.isLocalHost(context.getRedirectUri())) { // The redirect uri of alipay is forbidden to use localhost or 127.0.0.1 throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), Registry.ALIPAY); } diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/Builder.java b/bus-pay/src/main/java/org/miaixz/bus/pay/Builder.java index 2b8c96190a..d03d91d44a 100644 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/Builder.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/Builder.java @@ -36,7 +36,7 @@ import org.miaixz.bus.core.io.resource.ClassPathResource; import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Normal; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.CompareKit; import org.miaixz.bus.core.xyz.DateKit; import org.miaixz.bus.core.xyz.IoKit; @@ -348,7 +348,7 @@ public static StringBuffer forEachMap(Map params, String prefix, /** * 构造签名串 * - * @param method {@link Http} GET,POST,PUT等 + * @param method {@link HTTP} GET,POST,PUT等 * @param url 请求接口 /v3/certificates * @param timestamp 获取发起请求时的系统当前时间戳 * @param nonceStr 随机字符串 diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/Complex.java b/bus-pay/src/main/java/org/miaixz/bus/pay/Complex.java index a6febd6108..41807d9b54 100755 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/Complex.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/Complex.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.pay; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.pay.metric.AbstractProvider; import java.util.Arrays; @@ -74,7 +74,7 @@ default boolean isSandbox() { * @return the string */ default String sandbox() { - return Http.HOST_IPV4; + return HTTP.HOST_IPV4; } /** @@ -83,7 +83,7 @@ default String sandbox() { * @return the string */ default String service() { - return Http.HOST_IPV4; + return HTTP.HOST_IPV4; } /** @@ -92,7 +92,7 @@ default String service() { * @return the string */ default String method() { - return Http.NONE; + return HTTP.NONE; } /** diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java index 6421864eaf..f9b80cf4a2 100644 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java @@ -35,7 +35,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.PaymentException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.tls.SSLContextBuilder; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.FileKit; @@ -289,7 +289,7 @@ public static Message post(String url, Map formMap, Map {}", new String(cacheRequestWrapper.getBody())); @@ -143,9 +143,9 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { final String method = request.getMethod(); - if (Http.POST.equals(method) - || Http.PATCH.equals(method) - || Http.PUT.equals(method)) { + if (HTTP.POST.equals(method) + || HTTP.PATCH.equals(method) + || HTTP.PUT.equals(method)) { if (response instanceof CacheResponseWrapper) { CacheResponseWrapper cacheResponseWrapper = ((CacheResponseWrapper) response); Logger.info("<== {}", new String(cacheResponseWrapper.getBody()).length()); @@ -181,25 +181,25 @@ public void postHandle(HttpServletRequest request, HttpServletResponse response, private void requestInfo(HttpServletRequest request, String method) { String requestMethod = AnsiEncoder.encode(Ansi4BitColor.GREEN, " %s ", method); switch (method) { - case Http.ALL: + case HTTP.ALL: requestMethod = AnsiEncoder.encode(Ansi4BitColor.WHITE, " %s ", method); break; - case Http.POST: + case HTTP.POST: requestMethod = AnsiEncoder.encode(Ansi4BitColor.MAGENTA, " %s ", method); break; - case Http.DELETE: + case HTTP.DELETE: requestMethod = AnsiEncoder.encode(Ansi4BitColor.BLUE, " %s ", method); break; - case Http.PUT: + case HTTP.PUT: requestMethod = AnsiEncoder.encode(Ansi4BitColor.RED, " %s ", method); break; - case Http.OPTIONS: + case HTTP.OPTIONS: requestMethod = AnsiEncoder.encode(Ansi4BitColor.YELLOW, " %s ", method); break; - case Http.BEFORE: + case HTTP.BEFORE: requestMethod = AnsiEncoder.encode(Ansi4BitColor.BLACK, " %s ", method); break; - case Http.AFTER: + case HTTP.AFTER: requestMethod = AnsiEncoder.encode(Ansi4BitColor.CYAN, " %s ", method); break; } diff --git a/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/WrapperConfiguration.java b/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/WrapperConfiguration.java index a26e121038..700a7c0075 100755 --- a/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/WrapperConfiguration.java +++ b/bus-starter/src/main/java/org/miaixz/bus/starter/wrapper/WrapperConfiguration.java @@ -33,7 +33,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.CollKit; import org.miaixz.bus.core.xyz.MapKit; import org.miaixz.bus.core.xyz.ObjectKit; @@ -138,7 +138,7 @@ class BodyCacheFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { final String method = request.getMethod(); // 如果不是 POST PATCH PUT 等有流的接口则无需进行类型转换,提高性能 - if (Http.POST.equals(method) || Http.PATCH.equals(method) || Http.PUT.equals(method)) { + if (HTTP.POST.equals(method) || HTTP.PATCH.equals(method) || HTTP.PUT.equals(method)) { if (!(request instanceof CacheRequestWrapper)) { request = new CacheRequestWrapper(request); } diff --git a/bus-storage/src/main/java/org/miaixz/bus/storage/metric/AbstractProvider.java b/bus-storage/src/main/java/org/miaixz/bus/storage/metric/AbstractProvider.java index 592870f5c2..e32f6d9312 100755 --- a/bus-storage/src/main/java/org/miaixz/bus/storage/metric/AbstractProvider.java +++ b/bus-storage/src/main/java/org/miaixz/bus/storage/metric/AbstractProvider.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Http; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.storage.Context; import org.miaixz.bus.storage.Provider; @@ -59,7 +59,7 @@ protected static String downloadFile(String fileURL, String saveDir) { httpConn = (HttpURLConnection) url.openConnection(); int responseCode = httpConn.getResponseCode(); - if (responseCode == Http.HTTP_OK) { + if (responseCode == HTTP.HTTP_OK) { String fileName = Normal.EMPTY; String disposition = httpConn.getHeaderField("Content-Disposition"); @@ -105,7 +105,7 @@ protected static String downloadFile(String fileURL, String saveDir) { } protected String getFullPath(String file) { - if (file.startsWith(Http.HTTP_PREFIX) || file.startsWith(Http.HTTPS_PREFIX)) { + if (file.startsWith(HTTP.HTTP_PREFIX) || file.startsWith(HTTP.HTTPS_PREFIX)) { return file; } return this.context.getPrefix() + file; From 41e96f82047df7f38834f918fa04d96c472609a5 Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Wed, 19 Jun 2024 19:06:39 +0800 Subject: [PATCH 06/20] fix http and https --- .../org/miaixz/bus/core/lang/Protocol.java | 559 ------------------ .../java/org/miaixz/bus/core/net/MaskBit.java | 1 - .../org/miaixz/bus/core/net/Protocol.java | 280 +++++++++ .../java/org/miaixz/bus/core/net/ip/IPv4.java | 2 +- .../bus/core/net/tls/SSLContextBuilder.java | 4 +- .../miaixz/bus/core/net/tls/TlsVersion.java | 37 +- .../miaixz/bus/core/net/url/UrlBuilder.java | 4 +- .../java/org/miaixz/bus/http/Address.java | 1 + .../main/java/org/miaixz/bus/http/Httpd.java | 1 + .../java/org/miaixz/bus/http/Protocol.java | 119 ---- .../java/org/miaixz/bus/http/Response.java | 1 + .../miaixz/bus/http/accord/Connection.java | 2 +- .../bus/http/accord/ConnectionSuite.java | 2 +- .../bus/http/accord/RealConnection.java | 1 + .../bus/http/accord/platform/JdkPlatform.java | 2 +- .../bus/http/accord/platform/Platform.java | 2 +- .../java/org/miaixz/bus/http/cache/Cache.java | 8 +- .../bus/http/cache/CacheInterceptor.java | 6 +- .../miaixz/bus/http/metric/EventListener.java | 1 + .../bus/http/metric/http/Http2Codec.java | 1 + .../bus/http/metric/http/PushObserver.java | 2 +- .../bus/http/metric/http/StatusLine.java | 2 +- .../bus/http/plugin/httpz/HttpBuilder.java | 2 +- .../miaixz/bus/http/socket/RealWebSocket.java | 1 + 24 files changed, 330 insertions(+), 711 deletions(-) delete mode 100755 bus-core/src/main/java/org/miaixz/bus/core/lang/Protocol.java create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/net/Protocol.java delete mode 100644 bus-http/src/main/java/org/miaixz/bus/http/Protocol.java diff --git a/bus-core/src/main/java/org/miaixz/bus/core/lang/Protocol.java b/bus-core/src/main/java/org/miaixz/bus/core/lang/Protocol.java deleted file mode 100755 index f5e944e4df..0000000000 --- a/bus-core/src/main/java/org/miaixz/bus/core/lang/Protocol.java +++ /dev/null @@ -1,559 +0,0 @@ -/* - ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - ~ ~ - ~ The MIT License (MIT) ~ - ~ ~ - ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ - ~ ~ - ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ - ~ of this software and associated documentation files (the "Software"), to deal ~ - ~ in the Software without restriction, including without limitation the rights ~ - ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ - ~ copies of the Software, and to permit persons to whom the Software is ~ - ~ furnished to do so, subject to the following conditions: ~ - ~ ~ - ~ The above copyright notice and this permission notice shall be included in ~ - ~ all copies or substantial portions of the Software. ~ - ~ ~ - ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ - ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ - ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ - ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ - ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ - ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ - ~ THE SOFTWARE. ~ - ~ ~ - ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - */ -package org.miaixz.bus.core.lang; - -import org.miaixz.bus.core.xyz.StringKit; - -/** - * HTTP 相关常量 - * - * @author Kimi Liu - * @since Java 17+ - */ -public class Protocol { - - /** - * The http - */ - public static final String HTTP = "http"; - /** - * The https - */ - public static final String HTTPS = "https"; - /** - * The https - */ - public static final String WS = "ws"; - /** - * The https - */ - public static final String WSS = "wss"; - /** - * The prefix http - */ - public static final String HTTP_PREFIX = HTTP + Symbol.COLON + Symbol.FORWARDSLASH; - /** - * The prefix https - */ - public static final String HTTPS_PREFIX = HTTPS + Symbol.COLON + Symbol.FORWARDSLASH; - /** - * The prefix ws - */ - public static final String WS_PREFIX = WS + Symbol.COLON + Symbol.FORWARDSLASH; - /** - * The prefix wss - */ - public static final String WSS_PREFIX = WSS + Symbol.COLON + Symbol.FORWARDSLASH; - /** - * HTTP Method GET - */ - public static final String GET = "GET"; - /** - * HTTP Method POST - */ - public static final String POST = "POST"; - /** - * HTTP Method PUT - */ - public static final String PUT = "PUT"; - /** - * HTTP Method PATCH - */ - public static final String PATCH = "PATCH"; - /** - * HTTP Method DELETE - */ - public static final String DELETE = "DELETE"; - /** - * HTTP Method HEAD - */ - public static final String HEAD = "HEAD"; - /** - * HTTP Method TRACE - */ - public static final String TRACE = "TRACE"; - /** - * HTTP Method CONNECT - */ - public static final String CONNECT = "CONNECT"; - /** - * HTTP Method OPTIONS - */ - public static final String OPTIONS = "OPTIONS"; - /** - * HTTP Method BEFORE - */ - public static final String BEFORE = "BEFORE"; - /** - * HTTP Method AFTER - */ - public static final String AFTER = "AFTER"; - /** - * HTTP Method MOVE - */ - public static final String MOVE = "MOVE"; - /** - * HTTP Method PROPPATCH - */ - public static final String PROPPATCH = "PROPPATCH"; - /** - * HTTP Method REPORT - */ - public static final String REPORT = "REPORT"; - /** - * HTTP Method PROPFIND - */ - public static final String PROPFIND = "PROPFIND"; - /** - * HTTP Method ALL - */ - public static final String ALL = "ALL"; - /** - * HTTP Method NONE - */ - public static final String NONE = "NONE"; - /** - * HTTP/1.0 - */ - public static final String HTTP_1_0 = "HTTP/1.0"; - /** - * HTTP/1.1 - */ - public static final String HTTP_1_1 = "HTTP/1.1"; - /** - * HTTP/2.0 - */ - public static final String HTTP_2_0 = "HTTP/2.0"; - /** - * SPDY/3.1 - */ - public static final String SPDY_3_1 = "SPDY/3.1"; - /** - * SOAP 1.1 - */ - public static final String SOAP_1_1 = "SOAP 1.1 Protocol"; - /** - * SOAP 1.2 - */ - public static final String SOAP_1_2 = "SOAP 1.2 Protocol"; - /** - * QUIC - */ - public static final String QUIC = "QUIC"; - /** - * 明文HTTP/2,没有"upgrade"往返。此选项要求客户端事先知道服务器支持明文HTTP/2 - */ - public static final String H2_PRIOR_KNOWLEDGE = "H2_PRIOR_KNOWLEDGE"; - /** - * Supports some version of SSL; may support other versions - */ - public static final String SSL = "SSL"; - /** - * Supports some version of TLS; may support other versions - */ - public static final String TLS = "TLS"; - /** - * Supports RFC 2246: TLS version 1.0 ; may support other versions - */ - public static final String TLS_V_10 = "TLSv1"; - /** - * Supports RFC 4346: TLS version 1.1 ; may support other versions - */ - public static final String TLS_V_11 = "TLSv1.1"; - /** - * Supports RFC 5246: TLS version 1.2 ; may support other versions - */ - public static final String TLS_V_12 = "TLSv1.2"; - /** - * Supports RFC 5246: TLS version 1.3 ; may support other versions - */ - public static final String TLS_V_13 = "TLSv1.3"; - /** - * Supports SSL version 2 or later; may support other versions - */ - public static final String SSL_V_20 = "SSLv2"; - /** - * Supports SSL version 3; may support other versions - */ - public static final String SSL_V_30 = "SSLv3"; - /** - * The use status - */ - public static final String RESPONSE_STATUS_UTF8 = ":status"; - /** - * The use method - */ - public static final String TARGET_METHOD_UTF8 = ":method"; - /** - * The use path - */ - public static final String TARGET_PATH_UTF8 = ":path"; - /** - * The use scheme - */ - public static final String TARGET_SCHEME_UTF8 = ":scheme"; - /** - * The use authority - */ - public static final String TARGET_AUTHORITY_UTF8 = ":authority"; - /** - * The IPV4 127.0.0.1 - */ - public static final String HOST_IPV4 = "127.0.0.1"; - /** - * The localhost - */ - public static final String HOST_LOCAL = "localhost"; - /** - * Ipv4地址最小值字符串形式 - */ - public static final String IPV4_STR_MIN = "0.0.0.0"; - /** - * Ipv4地址最大值字符串形式 - */ - public static final String IPV4_STR_MAX = "255.255.255.255"; - /** - * Ipv4最大值数值形式 - */ - public static final long IPV4_NUM_MAX = 0xffffffffL; - /** - * Ipv4未使用地址最大值字符串形式 - */ - public static final String IPV4_UNUSED_STR_MAX = "0.255.255.255"; - /** - * HTTP Status-Code 100: Continue. - */ - public static final int HTTP_CONTINUE = 100; - /** - * HTTP Status-Code 101: Switching Protocols. - */ - public static final int HTTP_SWITCHING_PROTOCOL = 101; - /** - * HTTP Status-Code 200: OK. - */ - public static final int HTTP_OK = 200; - /** - * HTTP Status-Code 201: Created. - */ - public static final int HTTP_CREATED = 201; - /** - * HTTP Status-Code 202: Accepted. - */ - public static final int HTTP_ACCEPTED = 202; - /** - * HTTP Status-Code 203: Non-Authoritative Information. - */ - public static final int HTTP_NOT_AUTHORITATIVE = 203; - /** - * HTTP Status-Code 204: No Content. - */ - public static final int HTTP_NO_CONTENT = 204; - /** - * HTTP Status-Code 205: Reset Content. - */ - public static final int HTTP_RESET = 205; - /** - * HTTP Status-Code 206: Partial Content. - */ - public static final int HTTP_PARTIAL = 206; - /** - * HTTP Status-Code 300: Multiple Choices. - */ - public static final int HTTP_MULT_CHOICE = 300; - /** - * HTTP Status-Code 301: Moved Permanently. - */ - public static final int HTTP_MOVED_PERM = 301; - /** - * HTTP Status-Code 302: Temporary Redirect. - */ - public static final int HTTP_MOVED_TEMP = 302; - /** - * HTTP Status-Code 303: See Other. - */ - public static final int HTTP_SEE_OTHER = 303; - /** - * HTTP Status-Code 304: Not Modified. - */ - public static final int HTTP_NOT_MODIFIED = 304; - /** - * HTTP Status-Code 305: Use Proxy. - */ - public static final int HTTP_USE_PROXY = 305; - /** - * HTTP Status-Code 307: Temporary Redirect. - */ - public static final int HTTP_TEMP_REDIRECT = 307; - /** - * HTTP Status-Code 308: Use perm Redirect. - */ - public static final int HTTP_PERM_REDIRECT = 308; - /** - * HTTP Status-Code 400: Bad Request. - */ - public static final int HTTP_BAD_REQUEST = 400; - /** - * HTTP Status-Code 401: Unauthorized. - */ - public static final int HTTP_UNAUTHORIZED = 401; - /** - * HTTP Status-Code 402: Payment Required. - */ - public static final int HTTP_PAYMENT_REQUIRED = 402; - /** - * HTTP Status-Code 403: Forbidden. - */ - public static final int HTTP_FORBIDDEN = 403; - /** - * HTTP Status-Code 404: Not Found. - */ - public static final int HTTP_NOT_FOUND = 404; - /** - * HTTP Status-Code 405: Method Not Allowed. - */ - public static final int HTTP_BAD_METHOD = 405; - /** - * HTTP Status-Code 406: Not Acceptable. - */ - public static final int HTTP_NOT_ACCEPTABLE = 406; - /** - * HTTP Status-Code 407: Proxy Authentication Required. - */ - public static final int HTTP_PROXY_AUTH = 407; - /** - * HTTP Status-Code 408: Request Time-Out. - */ - public static final int HTTP_CLIENT_TIMEOUT = 408; - /** - * HTTP Status-Code 409: Conflict. - */ - public static final int HTTP_CONFLICT = 409; - /** - * HTTP Status-Code 410: Gone. - */ - public static final int HTTP_GONE = 410; - /** - * HTTP Status-Code 411: Length Required. - */ - public static final int HTTP_LENGTH_REQUIRED = 411; - /** - * HTTP Status-Code 412: Precondition Failed. - */ - public static final int HTTP_PRECON_FAILED = 412; - /** - * HTTP Status-Code 413: Request Entity Too Large. - */ - public static final int HTTP_ENTITY_TOO_LARGE = 413; - /** - * HTTP Status-Code 414: Request-URI Too Large. - */ - public static final int HTTP_REQ_TOO_LONG = 414; - /** - * HTTP Status-Code 415: Unsupported Media Type. - */ - public static final int HTTP_UNSUPPORTED_TYPE = 415; - /** - * HTTP Status-Code 500: Internal Server Error. - */ - public static final int HTTP_INTERNAL_ERROR = 500; - /** - * HTTP Status-Code 501: Not Implemented. - */ - public static final int HTTP_NOT_IMPLEMENTED = 501; - /** - * HTTP Status-Code 502: Bad Gateway. - */ - public static final int HTTP_BAD_GATEWAY = 502; - /** - * HTTP Status-Code 503: Service Unavailable. - */ - public static final int HTTP_UNAVAILABLE = 503; - /** - * HTTP Status-Code 504: Gateway Timeout. - */ - public static final int HTTP_GATEWAY_TIMEOUT = 504; - /** - * HTTP Status-Code 505: HTTP Version Not Supported. - */ - public static final int HTTP_VERSION = 505; - /** - * From the HTTP/2 specs, the default initial window size for all streams is 64 KiB. (Chrome 25 - * uses 10 MiB). - */ - public static final int DEFAULT_INITIAL_WINDOW_SIZE = 65535; - /** - * HTTP/2: Size in bytes of the table used to decode the sender's header blocks. - */ - public static final int HEADER_TABLE_SIZE = 1; - /** - * HTTP/2: The peer must not send a PUSH_PROMISE frame when this is 0. - */ - public static final int ENABLE_PUSH = 2; - /** - * Sender's maximum number of concurrent streams. - */ - public static final int MAX_CONCURRENT_STREAMS = 4; - /** - * HTTP/2: Size in bytes of the largest frame payload the sender will accept. - */ - public static final int MAX_FRAME_SIZE = 5; - /** - * HTTP/2: Advisory only. Size in bytes of the largest header list the sender will accept. - */ - public static final int MAX_HEADER_LIST_SIZE = 6; - /** - * Window size in bytes. - */ - public static final int INITIAL_WINDOW_SIZE = 7; - /** - * The form data - */ - public static final String FORM = "form"; - /** - * The json data - */ - public static final String JSON = "json"; - /** - * The xml data - */ - public static final String XML = "xml"; - /** - * The protobuf data - */ - public static final String PROTOBUF = "protobuf"; - - /** - * 是否为http协议 - * - * @param url 待验证的url - * @return true: http协议, false: 非http协议 - */ - public static boolean isHttp(String url) { - if (StringKit.isEmpty(url)) { - return false; - } - return url.startsWith(Protocol.HTTP_PREFIX) || url.startsWith("http%3A%2F%2F"); - } - - /** - * 是否为https协议 - * - * @param url 待验证的url - * @return true: https协议, false: 非https协议 - */ - public static boolean isHttps(String url) { - if (StringKit.isEmpty(url)) { - return false; - } - return url.startsWith(Protocol.HTTPS_PREFIX) || url.startsWith("https%3A%2F%2F"); - } - - /** - * 是否为本地主机(域名) - * - * @param url 待验证的url - * @return true: 本地主机(域名), false: 非本地主机(域名) - */ - public static boolean isLocalHost(String url) { - return StringKit.isEmpty(url) || url.contains(Protocol.HOST_IPV4) || url.contains(Protocol.HOST_LOCAL); - } - - - /** - * 是否为https协议或本地主机(域名) - * - * @param url 待验证的url - * @return true: https协议或本地主机 false: 非https协议或本机主机 - */ - public static boolean isHttpsOrLocalHost(String url) { - if (StringKit.isEmpty(url)) { - return false; - } - return isHttps(url) || isLocalHost(url); - } - - /** - * WebDAV - * - * @param method 请求方式 - * @return the boolean - */ - public static boolean invalidatesCache(String method) { - return POST.equals(method) - || PUT.equals(method) - || PATCH.equals(method) - || DELETE.equals(method) - || MOVE.equals(method); - } - - /** - * WebDAV - * CalDAV/CardDAV(在WebDAV版本中定义) - * - * @param method 请求方式 - * @return the boolean - */ - public static boolean requiresRequestBody(String method) { - return POST.equals(method) - || PUT.equals(method) - || PATCH.equals(method) - || PROPPATCH.equals(method) - || REPORT.equals(method); - } - - /** - * 许可维护请求体 - * - * @param method 请求方式 - * @return the boolean - */ - public static boolean permitsRequestBody(String method) { - return !GET.equals(method) || HEAD.equals(method); - } - - /** - * (WebDAV)重定向也应该维护请求体 - * - * @param method 请求方式 - * @return the boolean - */ - public static boolean redirectsWithBody(String method) { - return PROPFIND.equals(method); - } - - /** - * 除了PROPFIND之外的所有请求都应该重定向到GET请求 - * - * @param method 请求方式 - * @return the boolean - */ - public static boolean redirectsToGet(String method) { - return !PROPFIND.equals(method); - } - -} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/MaskBit.java b/bus-core/src/main/java/org/miaixz/bus/core/net/MaskBit.java index cdedd75459..e6c7d99909 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/MaskBit.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/MaskBit.java @@ -29,7 +29,6 @@ import org.miaixz.bus.core.center.map.BiMap; import org.miaixz.bus.core.lang.Assert; -import org.miaixz.bus.core.lang.Protocol; import org.miaixz.bus.core.net.ip.IPv4; import java.util.HashMap; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/Protocol.java b/bus-core/src/main/java/org/miaixz/bus/core/net/Protocol.java new file mode 100644 index 0000000000..1a9fa7c834 --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/Protocol.java @@ -0,0 +1,280 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +package org.miaixz.bus.core.net; + +import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.xyz.StringKit; + +import java.io.IOException; + +/** + * 协议vs计划 它的名字是:{@link java.net.URL#getProtocol()} + * 返回{@linkplain java.net.URI#getScheme() scheme} (http, https, etc.), + * 而不是协议(http/1.1, spdy/3.1,等等) 请使用这个协议来识别它是如何被分割的 + * Httpd使用协议这个词来标识HTTP消息是如何构造的 + * + * @author Kimi Liu + * @since Java 17+ + */ +public enum Protocol { + + /** + * TCP协议 + */ + TCP("tcp"), + /** + * http协议 + */ + HTTP("http"), + /** + * 过时的plaintext,默认情况下不使用持久套接字 + */ + HTTP_1_0("http/1.0"), + /** + * 包含持久连接的plaintext + * 此版本的Httpd实现了RFC 7230,并跟踪对该规范的修订 + */ + HTTP_1_1("http/1.1"), + /** + * IETF的二进制框架协议,包括头压缩、在同一个套接字上多路复用多个请求和服务器推送 + * HTTP/1.1语义是在HTTP/2上分层的 + */ + HTTP_2("h2"), + /** + * HTTP/3 是用于交换信息的超文本传输协议的第三个主要版本 + * HTTP/3 在 QUIC 上运行,QUIC 以 RFC 9000 的形式发布。 + */ + HTTP_3("h3"), + /** + * Chromium的二进制框架协议,包括标头压缩、在同一个套接字上多路复用多个请求和服务器推送 + * HTTP/1.1语义在SPDY/3上分层. + */ + SPDY_3("spdy/3.1"), + /** + * 明文HTTP/2,没有"upgrade"往返。此选项要求客户端事先知道服务器支持明文HTTP/2 + */ + H2_PRIOR_KNOWLEDGE("h2_prior_knowledge"), + /** + * QUIC(快速UDP互联网连接)是一个新的多路复用和UDP之上的安全传输, + * 从底层设计和优化的HTTP/2语义。HTTP/1.1语义是在HTTP/2上分层的 + */ + QUIC("quic"), + /** + * SOAP 1.1协议 + */ + SOAP_1_1("soap 1.1 protocol"), + /** + * SOAP 1.2协议 + */ + SOAP_1_2("SOAP 1.2 Protocol"), + /** + * SOAP 1.2协议 + */ + WS("ws"), + /** + * SOAP 1.2协议 + */ + WSS("wss"), + /** + * https协议 + */ + HTTPS("https"), + /** + * Supports some version of SSL + */ + SSL("ssl"), + /** + * Supports SSL version 2 + */ + SSLv2("SSLv2"), + /** + * Supports SSL version 3 + */ + SSLv3("SSLv3"), + /** + * Supports some version of TLS + */ + TLS("tls"), + /** + * Supports RFC 2246: TLS version 1.0 + */ + TLSv1("TLSv1"), + /** + * Supports RFC 4346: TLS version 1.1 + */ + TLSv1_1("TLSv1.1"), + /** + * Supports RFC 5246: TLS version 1.2 + */ + TLSv1_2("TLSv1.2"), + /** + * Supports RFC 5246: TLS version 1.3 + */ + TLSv1_3("TLSv1.3"); + + /** + * The prefix http + */ + public static final String HTTP_PREFIX = HTTP.name + Symbol.COLON + Symbol.FORWARDSLASH; + /** + * The prefix https + */ + public static final String HTTPS_PREFIX = HTTPS.name + Symbol.COLON + Symbol.FORWARDSLASH; + /** + * The prefix ws + */ + public static final String WS_PREFIX = WS.name + Symbol.COLON + Symbol.FORWARDSLASH; + /** + * The prefix wss + */ + public static final String WSS_PREFIX = WSS.name + Symbol.COLON + Symbol.FORWARDSLASH; + + /** + * The IPV4 127.0.0.1 + */ + public static final String HOST_IPV4 = "127.0.0.1"; + /** + * The localhost + */ + public static final String HOST_LOCAL = "localhost"; + /** + * Ipv4地址最小值字符串形式 + */ + public static final String IPV4_STR_MIN = "0.0.0.0"; + /** + * Ipv4地址最大值字符串形式 + */ + public static final String IPV4_STR_MAX = "255.255.255.255"; + /** + * Ipv4最大值数值形式 + */ + public static final long IPV4_NUM_MAX = 0xffffffffL; + /** + * Ipv4未使用地址最大值字符串形式 + */ + public static final String IPV4_UNUSED_STR_MAX = "0.255.255.255"; + + public final String name; + + Protocol(String name) { + this.name = name; + } + + /** + * @param protocol 协议标示 + * @return 返回由{@code protocol}标识的协议 + * @throws IOException if {@code protocol} is unknown. + */ + public static Protocol get(String protocol) throws IOException { + if (protocol.equals(HTTP_1_0.name)) { + return HTTP_1_0; + } + if (protocol.equals(HTTP_1_1.name)) { + return HTTP_1_1; + } + if (protocol.equals(H2_PRIOR_KNOWLEDGE.name)) { + return H2_PRIOR_KNOWLEDGE; + } + if (protocol.equals(HTTP_2.name)) { + return HTTP_2; + } + if (protocol.equals(SPDY_3.name)) { + return SPDY_3; + } + if (protocol.equals(QUIC.name)) { + return QUIC; + } + if (protocol.equals(SOAP_1_1.name)) { + return SOAP_1_1; + } + if (protocol.equals(SOAP_1_2.name)) { + return SOAP_1_2; + } + throw new IOException("Unexpected protocol: " + protocol); + } + + /** + * 是否为http协议 + * + * @param url 待验证的url + * @return true: http协议, false: 非http协议 + */ + public static boolean isHttp(String url) { + if (StringKit.isEmpty(url)) { + return false; + } + return url.startsWith(HTTP_PREFIX) || url.startsWith("http%3A%2F%2F"); + } + + /** + * 是否为https协议 + * + * @param url 待验证的url + * @return true: https协议, false: 非https协议 + */ + public static boolean isHttps(String url) { + if (StringKit.isEmpty(url)) { + return false; + } + return url.startsWith(HTTPS_PREFIX) || url.startsWith("https%3A%2F%2F"); + } + + /** + * 是否为本地主机(域名) + * + * @param url 待验证的url + * @return true: 本地主机(域名), false: 非本地主机(域名) + */ + public static boolean isLocalHost(String url) { + return StringKit.isEmpty(url) || url.contains(HOST_IPV4) || url.contains(HOST_LOCAL); + } + + + /** + * 是否为https协议或本地主机(域名) + * + * @param url 待验证的url + * @return true: https协议或本地主机 false: 非https协议或本机主机 + */ + public static boolean isHttpsOrLocalHost(String url) { + if (StringKit.isEmpty(url)) { + return false; + } + return isHttps(url) || isLocalHost(url); + } + + + /** + * 返回用于识别ALPN协议的字符串,如“http/1.1”、“spdy/3.1”或“http/2.0”. + */ + @Override + public String toString() { + return name; + } + +} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/ip/IPv4.java b/bus-core/src/main/java/org/miaixz/bus/core/net/ip/IPv4.java index 9266afbd06..34da7af9a0 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/ip/IPv4.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/ip/IPv4.java @@ -30,9 +30,9 @@ import org.miaixz.bus.core.center.regex.Pattern; import org.miaixz.bus.core.instance.Instances; import org.miaixz.bus.core.lang.Assert; -import org.miaixz.bus.core.lang.Protocol; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.MaskBit; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.text.CharsBacker; import org.miaixz.bus.core.xyz.*; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java index 0b09455dfc..6a0c3e1c8c 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java @@ -28,9 +28,9 @@ package org.miaixz.bus.core.net.tls; import org.miaixz.bus.core.Builder; -import org.miaixz.bus.core.lang.Protocol; import org.miaixz.bus.core.lang.exception.InternalException; import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.ArrayKit; import org.miaixz.bus.core.xyz.StringKit; @@ -56,7 +56,7 @@ public class SSLContextBuilder implements Builder { private static final long serialVersionUID = -1L; - private String protocol = Protocol.TLS; + private String protocol = Protocol.TLS.name; private KeyManager[] keyManagers; private TrustManager[] trustManagers = TrustAnyTrustManager.TRUST_ANYS; private SecureRandom secureRandom = new SecureRandom(); diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/TlsVersion.java b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/TlsVersion.java index a6fbb1a2b5..afbd9da8cf 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/TlsVersion.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/TlsVersion.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.core.net.tls; -import org.miaixz.bus.core.lang.Protocol; +import org.miaixz.bus.core.net.Protocol; import java.util.ArrayList; import java.util.Collections; @@ -45,23 +45,23 @@ public enum TlsVersion { /** * 2016年版本 */ - TLS_1_3(Protocol.TLS_V_13), + TLSv1_3(Protocol.TLSv1_3.name), /** * 2008年版本 */ - TLS_1_2(Protocol.TLS_V_12), + TLSv1_2(Protocol.TLSv1_2.name), /** * 2006年版本 */ - TLS_1_1(Protocol.TLS_V_11), + TLSv1_1(Protocol.TLSv1_1.name), /** * 1999年版本 */ - TLS_1_0(Protocol.TLS_V_10), + TLSv1(Protocol.TLSv1.name), /** * 1996年版本 */ - SSL_3_0(Protocol.SSL_V_30); + SSLv3(Protocol.SSLv3.name); public final String javaName; @@ -70,17 +70,20 @@ public enum TlsVersion { } public static TlsVersion forJavaName(String javaName) { - switch (javaName) { - case Protocol.TLS_V_13: - return TLS_1_3; - case Protocol.TLS_V_12: - return TLS_1_2; - case Protocol.TLS_V_11: - return TLS_1_1; - case Protocol.TLS_V_10: - return TLS_1_0; - case Protocol.SSL_V_30: - return SSL_3_0; + if (Protocol.TLSv1_3.name.equals(javaName)) { + return TLSv1_3; + } + if (Protocol.TLSv1_2.name.equals(javaName)) { + return TLSv1_2; + } + if (Protocol.TLSv1_1.name.equals(javaName)) { + return TLSv1_1; + } + if (Protocol.TLSv1.name.equals(javaName)) { + return TLSv1; + } + if (Protocol.SSLv3.name.equals(javaName)) { + return SSLv3; } throw new IllegalArgumentException("Unexpected TLS version: " + javaName); } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/url/UrlBuilder.java b/bus-core/src/main/java/org/miaixz/bus/core/net/url/UrlBuilder.java index 34a409e553..eaac385d85 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/url/UrlBuilder.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/url/UrlBuilder.java @@ -30,8 +30,8 @@ import org.miaixz.bus.core.Builder; import org.miaixz.bus.core.lang.Assert; import org.miaixz.bus.core.lang.Charset; -import org.miaixz.bus.core.lang.Protocol; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.core.xyz.UrlKit; @@ -283,7 +283,7 @@ public UrlBuilder setScheme(final String scheme) { * @return 协议,例如http */ public String getSchemeWithDefault() { - return StringKit.defaultIfEmpty(this.scheme, Protocol.HTTP); + return StringKit.defaultIfEmpty(this.scheme, Protocol.HTTP.name); } /** diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Address.java b/bus-http/src/main/java/org/miaixz/bus/http/Address.java index e624e626bd..42b4272ba9 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Address.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Address.java @@ -29,6 +29,7 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.accord.Connection; import org.miaixz.bus.http.accord.ConnectionSuite; import org.miaixz.bus.http.secure.Authenticator; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Httpd.java b/bus-http/src/main/java/org/miaixz/bus/http/Httpd.java index 2196882c9f..0a9f575197 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Httpd.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Httpd.java @@ -29,6 +29,7 @@ import org.miaixz.bus.core.io.sink.Sink; import org.miaixz.bus.core.io.source.Source; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.net.tls.SSLContextBuilder; import org.miaixz.bus.core.net.tls.TrustAnyHostnameVerifier; import org.miaixz.bus.http.accord.ConnectionPool; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java b/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java deleted file mode 100644 index 2eeb8dd2d2..0000000000 --- a/bus-http/src/main/java/org/miaixz/bus/http/Protocol.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - ~ ~ - ~ The MIT License (MIT) ~ - ~ ~ - ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ - ~ ~ - ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ - ~ of this software and associated documentation files (the "Software"), to deal ~ - ~ in the Software without restriction, including without limitation the rights ~ - ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ - ~ copies of the Software, and to permit persons to whom the Software is ~ - ~ furnished to do so, subject to the following conditions: ~ - ~ ~ - ~ The above copyright notice and this permission notice shall be included in ~ - ~ all copies or substantial portions of the Software. ~ - ~ ~ - ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ - ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ - ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ - ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ - ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ - ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ - ~ THE SOFTWARE. ~ - ~ ~ - ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - */ -package org.miaixz.bus.http; - -import org.miaixz.bus.core.net.HTTP; - -import java.io.IOException; - -/** - * 协议vs计划 它的名字是:{@link java.net.URL#getProtocol()} - * 返回{@linkplain java.net.URI#getScheme() scheme} (http, https, etc.), - * 而不是协议(http/1.1, spdy/3.1,等等) 请使用这个协议来识别它是如何被分割的 - * Httpd使用协议这个词来标识HTTP消息是如何构造的 - * - * @author Kimi Liu - * @since Java 17+ - */ -public enum Protocol { - - /** - * 一种过时的plaintext,默认情况下不使用持久套接字 - */ - HTTP_1_0(HTTP.HTTP_1_0), - - /** - * 包含持久连接的plaintext - * 此版本的Httpd实现了RFC 7230,并跟踪对该规范的修订 - */ - HTTP_1_1(HTTP.HTTP_1_1), - - /** - * IETF的二进制框架协议,包括头压缩、在同一个套接字上多路复用多个请求和服务器推送 - * HTTP/1.1语义是在HTTP/2上分层的 - */ - HTTP_2("h2"), - - /** - * Chromium的二进制框架协议,包括标头压缩、在同一个套接字上多路复用多个请求和服务器推送 - * HTTP/1.1语义在SPDY/3上分层. - */ - SPDY_3(HTTP.SPDY_3_1), - - /** - * 明文HTTP/2,没有"upgrade"往返。此选项要求客户端事先知道服务器支持明文HTTP/2 - */ - H2_PRIOR_KNOWLEDGE(HTTP.H2_PRIOR_KNOWLEDGE), - - /** - * QUIC(快速UDP互联网连接)是一个新的多路复用和UDP之上的安全传输, - * 从底层设计和优化的HTTP/2语义。HTTP/1.1语义是在HTTP/2上分层的 - */ - QUIC(HTTP.QUIC), - - /** - * SOAP 1.1协议 - */ - SOAP_1_1(HTTP.SOAP_1_1), - /** - * SOAP 1.2协议 - */ - SOAP_1_2(HTTP.SOAP_1_2); - - private final String protocol; - - Protocol(String protocol) { - this.protocol = protocol; - } - - /** - * @param protocol 协议标示 - * @return 返回由{@code protocol}标识的协议 - * @throws IOException if {@code protocol} is unknown. - */ - public static Protocol get(String protocol) throws IOException { - if (protocol.equals(HTTP_1_0.protocol)) return HTTP_1_0; - if (protocol.equals(HTTP_1_1.protocol)) return HTTP_1_1; - if (protocol.equals(H2_PRIOR_KNOWLEDGE.protocol)) return H2_PRIOR_KNOWLEDGE; - if (protocol.equals(HTTP_2.protocol)) return HTTP_2; - if (protocol.equals(SPDY_3.protocol)) return SPDY_3; - if (protocol.equals(QUIC.protocol)) return QUIC; - if (protocol.equals(SOAP_1_1.protocol)) return SOAP_1_1; - if (protocol.equals(SOAP_1_2.protocol)) return SOAP_1_2; - throw new IOException("Unexpected protocol: " + protocol); - } - - /** - * 返回用于识别ALPN协议的字符串,如“http/1.1”、“spdy/3.1”或“http/2.0”. - */ - @Override - public String toString() { - return protocol; - } - -} diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Response.java b/bus-http/src/main/java/org/miaixz/bus/http/Response.java index 4743cbcb01..4286cd2e87 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Response.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Response.java @@ -32,6 +32,7 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.accord.Exchange; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.cache.CacheControl; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/Connection.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/Connection.java index 3fe971349a..0278df2c1e 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/Connection.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/Connection.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http.accord; -import org.miaixz.bus.http.Protocol; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.Route; import org.miaixz.bus.http.socket.Handshake; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectionSuite.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectionSuite.java index 2365231da3..c7d3539a86 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectionSuite.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/ConnectionSuite.java @@ -86,7 +86,7 @@ public class ConnectionSuite { */ public static final ConnectionSuite MODERN_TLS = new Builder(true) .cipherSuites(APPROVED_CIPHER_SUITES) - .tlsVersions(TlsVersion.TLS_1_3, TlsVersion.TLS_1_2) + .tlsVersions(TlsVersion.TLSv1_3, TlsVersion.TLSv1_2) .supportsTlsExtensions(true) .build(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java index a74abf2bae..91ea205467 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java @@ -34,6 +34,7 @@ import org.miaixz.bus.core.lang.exception.RevisedException; import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.net.tls.TrustAnyHostnameVerifier; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/platform/JdkPlatform.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/platform/JdkPlatform.java index 8ff21b8dbc..19f8825de5 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/platform/JdkPlatform.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/platform/JdkPlatform.java @@ -28,7 +28,7 @@ package org.miaixz.bus.http.accord.platform; import org.miaixz.bus.core.lang.Normal; -import org.miaixz.bus.http.Protocol; +import org.miaixz.bus.core.net.Protocol; import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocket; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/platform/Platform.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/platform/Platform.java index f34321776c..b6428aa9f9 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/platform/Platform.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/platform/Platform.java @@ -28,7 +28,7 @@ package org.miaixz.bus.http.accord.platform; import org.miaixz.bus.core.io.buffer.Buffer; -import org.miaixz.bus.http.Protocol; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.secure.BasicCertificateChainCleaner; import org.miaixz.bus.http.secure.BasicTrustRootIndex; import org.miaixz.bus.http.secure.CertificateChainCleaner; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java index 1a9db9b81a..2713b82a88 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java @@ -39,9 +39,13 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.net.tls.TlsVersion; import org.miaixz.bus.core.xyz.IoKit; -import org.miaixz.bus.http.*; +import org.miaixz.bus.http.Headers; +import org.miaixz.bus.http.Request; +import org.miaixz.bus.http.Response; +import org.miaixz.bus.http.UnoUrl; import org.miaixz.bus.http.accord.platform.Platform; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.metric.http.StatusLine; @@ -485,7 +489,7 @@ private static class Entry { List localCertificates = readCertificateList(source); TlsVersion tlsVersion = !source.exhausted() ? TlsVersion.forJavaName(source.readUtf8LineStrict()) - : TlsVersion.SSL_3_0; + : TlsVersion.SSLv3; handshake = Handshake.get(tlsVersion, cipherSuite, peerCertificates, localCertificates); } else { handshake = null; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java index df93aa2361..93b5635a48 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java @@ -36,8 +36,12 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.IoKit; -import org.miaixz.bus.http.*; +import org.miaixz.bus.http.Builder; +import org.miaixz.bus.http.Headers; +import org.miaixz.bus.http.Request; +import org.miaixz.bus.http.Response; import org.miaixz.bus.http.bodys.RealResponseBody; import org.miaixz.bus.http.metric.Interceptor; import org.miaixz.bus.http.metric.Internal; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/EventListener.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/EventListener.java index c813a80f93..e616aadf79 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/EventListener.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/EventListener.java @@ -27,6 +27,7 @@ */ package org.miaixz.bus.http.metric; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.Connection; import org.miaixz.bus.http.accord.ConnectionPool; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java index f1649dde7e..fd76a869cf 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java @@ -31,6 +31,7 @@ import org.miaixz.bus.core.io.source.Source; import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.RealConnection; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/PushObserver.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/PushObserver.java index 5f8da5cc00..353b37d1da 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/PushObserver.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/PushObserver.java @@ -28,7 +28,7 @@ package org.miaixz.bus.http.metric.http; import org.miaixz.bus.core.io.source.BufferSource; -import org.miaixz.bus.http.Protocol; +import org.miaixz.bus.core.net.Protocol; import java.io.IOException; import java.util.List; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StatusLine.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StatusLine.java index 16582b487f..254d49721b 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StatusLine.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StatusLine.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.http.Protocol; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.Response; import java.io.IOException; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/HttpBuilder.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/HttpBuilder.java index f022d78873..527b3ce567 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/HttpBuilder.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/HttpBuilder.java @@ -27,11 +27,11 @@ */ package org.miaixz.bus.http.plugin.httpz; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.net.tls.SSLContextBuilder; import org.miaixz.bus.http.DnsX; import org.miaixz.bus.http.Httpd; import org.miaixz.bus.http.Httpz; -import org.miaixz.bus.http.Protocol; import org.miaixz.bus.http.accord.ConnectionPool; import org.miaixz.bus.http.accord.ConnectionSuite; import org.miaixz.bus.http.cache.Cache; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java b/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java index e0c71d5446..3a052d9f07 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java @@ -34,6 +34,7 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.Exchange; From 74f5058a48b8ff02f97db0927b4e22086af73660 Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Wed, 19 Jun 2024 19:43:59 +0800 Subject: [PATCH 07/20] fix protocol --- .../java/org/miaixz/bus/core/net/HTTP.java | 452 +++++++++++------- .../java/org/miaixz/bus/core/net/Header.java | 279 ----------- .../bus/core/net/tls/SSLContextBuilder.java | 5 +- .../java/org/miaixz/bus/http/Address.java | 3 +- .../main/java/org/miaixz/bus/http/Httpv.java | 20 +- .../java/org/miaixz/bus/http/Request.java | 5 +- .../java/org/miaixz/bus/http/Response.java | 5 +- .../main/java/org/miaixz/bus/http/UnoUrl.java | 28 +- .../bus/http/accord/RealConnection.java | 11 +- .../miaixz/bus/http/bodys/MultipartBody.java | 10 +- .../java/org/miaixz/bus/http/cache/Cache.java | 7 +- .../miaixz/bus/http/cache/CacheControl.java | 4 +- .../bus/http/cache/CacheInterceptor.java | 25 +- .../miaixz/bus/http/cache/CacheStrategy.java | 5 +- .../http/metric/http/BridgeInterceptor.java | 38 +- .../metric/http/CallServerInterceptor.java | 5 +- .../miaixz/bus/http/metric/http/Hpack.java | 100 ++-- .../bus/http/metric/http/Http2Codec.java | 35 +- .../http/metric/http/RetryAndFollowUp.java | 9 +- .../bus/http/plugin/httpv/ResultBody.java | 4 +- .../bus/http/plugin/httpx/HttpProxy.java | 6 +- .../bus/http/plugin/httpz/PostRequest.java | 8 +- .../bus/http/plugin/httpz/PutRequest.java | 8 +- .../bus/http/secure/CertificatePinner.java | 6 +- .../bus/http/secure/NetAuthenticator.java | 4 +- .../miaixz/bus/http/socket/RealWebSocket.java | 17 +- .../java/org/miaixz/bus/image/Device.java | 4 +- .../java/org/miaixz/bus/image/Option.java | 6 +- .../image/galaxy/media/AbstractStowrs.java | 10 +- .../image/galaxy/media/StowrsSingleFile.java | 6 +- .../bus/image/metric/WebApplication.java | 4 +- .../metric/huawei/HuaweiSmsProvider.java | 6 +- .../metric/jdcloud/JdcloudSmsProvider.java | 3 +- .../notify/metric/jpush/JpushSmsProvider.java | 6 +- .../notify/metric/upyun/UpyunSmsProvider.java | 6 +- .../java/org/miaixz/bus/oauth/Checker.java | 10 +- .../oauth/metric/alipay/AlipayProvider.java | 4 +- .../oauth/metric/amazon/AmazonProvider.java | 10 +- .../bus/oauth/metric/eleme/ElemeProvider.java | 10 +- .../metric/linkedin/LinkedinProvider.java | 4 +- .../stackoverflow/StackOverflowProvider.java | 4 +- .../oauth/metric/twitter/TwitterProvider.java | 4 +- .../bus/pay/metric/AbstractProvider.java | 10 +- .../starter/bridge/BridgeVerticleService.java | 4 +- .../bus/storage/metric/AbstractProvider.java | 3 +- 45 files changed, 506 insertions(+), 707 deletions(-) delete mode 100755 bus-core/src/main/java/org/miaixz/bus/core/net/Header.java diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java b/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java index 68c3b87da8..170106a7b8 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java @@ -1,8 +1,5 @@ package org.miaixz.bus.core.net; -import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.xyz.StringKit; - /** * HTTP 相关常量 * @@ -12,37 +9,13 @@ public class HTTP { /** - * The http - */ - public static final String HTTP = "http"; - /** - * The https - */ - public static final String HTTPS = "https"; - /** - * The https - */ - public static final String WS = "ws"; - /** - * The https - */ - public static final String WSS = "wss"; - /** - * The prefix http - */ - public static final String HTTP_PREFIX = HTTP + Symbol.COLON + Symbol.FORWARDSLASH; - /** - * The prefix https - */ - public static final String HTTPS_PREFIX = HTTPS + Symbol.COLON + Symbol.FORWARDSLASH; - /** - * The prefix ws + * HTTP Method ALL */ - public static final String WS_PREFIX = WS + Symbol.COLON + Symbol.FORWARDSLASH; + public static final String ALL = "ALL"; /** - * The prefix wss + * HTTP Method NONE */ - public static final String WSS_PREFIX = WSS + Symbol.COLON + Symbol.FORWARDSLASH; + public static final String NONE = "NONE"; /** * HTTP Method GET */ @@ -103,106 +76,8 @@ public class HTTP { * HTTP Method PROPFIND */ public static final String PROPFIND = "PROPFIND"; - /** - * HTTP Method ALL - */ - public static final String ALL = "ALL"; - /** - * HTTP Method NONE - */ - public static final String NONE = "NONE"; - /** - * HTTP/1.0 - */ - public static final String HTTP_1_0 = "HTTP/1.0"; - /** - * HTTP/1.1 - */ - public static final String HTTP_1_1 = "HTTP/1.1"; - /** - * HTTP/2.0 - */ - public static final String HTTP_2_0 = "HTTP/2.0"; - /** - * SPDY/3.1 - */ - public static final String SPDY_3_1 = "SPDY/3.1"; - /** - * SOAP 1.1 - */ - public static final String SOAP_1_1 = "SOAP 1.1 Protocol"; - /** - * SOAP 1.2 - */ - public static final String SOAP_1_2 = "SOAP 1.2 Protocol"; - /** - * QUIC - */ - public static final String QUIC = "QUIC"; - /** - * 明文HTTP/2,没有"upgrade"往返。此选项要求客户端事先知道服务器支持明文HTTP/2 - */ - public static final String H2_PRIOR_KNOWLEDGE = "H2_PRIOR_KNOWLEDGE"; - /** - * Supports some version of SSL; may support other versions - */ - public static final String SSL = "SSL"; - /** - * Supports some version of TLS; may support other versions - */ - public static final String TLS = "TLS"; - /** - * Supports RFC 2246: TLS version 1.0 ; may support other versions - */ - public static final String TLS_V_10 = "TLSv1"; - /** - * Supports RFC 4346: TLS version 1.1 ; may support other versions - */ - public static final String TLS_V_11 = "TLSv1.1"; - /** - * Supports RFC 5246: TLS version 1.2 ; may support other versions - */ - public static final String TLS_V_12 = "TLSv1.2"; - /** - * Supports RFC 5246: TLS version 1.3 ; may support other versions - */ - public static final String TLS_V_13 = "TLSv1.3"; - /** - * Supports SSL version 2 or later; may support other versions - */ - public static final String SSL_V_20 = "SSLv2"; - /** - * Supports SSL version 3; may support other versions - */ - public static final String SSL_V_30 = "SSLv3"; - /** - * The use status - */ - public static final String RESPONSE_STATUS_UTF8 = ":status"; - /** - * The use method - */ - public static final String TARGET_METHOD_UTF8 = ":method"; - /** - * The use path - */ - public static final String TARGET_PATH_UTF8 = ":path"; - /** - * The use scheme - */ - public static final String TARGET_SCHEME_UTF8 = ":scheme"; - /** - * The use authority - */ - public static final String TARGET_AUTHORITY_UTF8 = ":authority"; - /** - * The IPV4 127.0.0.1 - */ - public static final String HOST_IPV4 = "127.0.0.1"; - /** - * The localhost - */ - public static final String HOST_LOCAL = "localhost"; + + /** * HTTP Status-Code 100: Continue. */ @@ -388,6 +263,271 @@ public class HTTP { * Window size in bytes. */ public static final int INITIAL_WINDOW_SIZE = 7; + + + /** + * The header Host + */ + public static final String HOST = "Host"; + /** + * The header Server + */ + public static final String SERVER = "Server"; + /** + * The header Age + */ + public static final String AGE = "Age"; + /** + * The header Allow + */ + public static final String ALLOW = "Allow"; + /** + * The header Expires + */ + public static final String EXPIRES = "Expires"; + /** + * The header Cookie + */ + public static final String COOKIE = "Cookie"; + /** + * The header Set-Cookie + */ + public static final String SET_COOKIE = "Set-Cookie"; + /** + * The header Encoding + */ + public static final String ENCODING = "Encoding"; + /** + * The header Upgrade + */ + public static final String UPGRADE = "Upgrade"; + /** + * The header Trailers + */ + public static final String TRAILERS = "Trailers"; + /** + * The header Location + */ + public static final String LOCATION = "Location"; + /** + * The header Connection + */ + public static final String CONNECTION = "Connection"; + /** + * The header Date + */ + public static final String DATE = "Date"; + /** + * The header Etag + */ + public static final String ETAG = "Etag"; + /** + * The header Expect + */ + public static final String EXPECT = "Expect"; + /** + * The header From + */ + public static final String FROM = "From"; + /** + * The header Link + */ + public static final String LINK = "Link"; + /** + * The header Vary + */ + public static final String VARY = "Vary"; + /** + * The header Via + */ + public static final String VIA = "Via"; + /** + * The header Range + */ + public static final String RANGE = "Range"; + /** + * The header Referer + */ + public static final String REFERER = "Referer"; + /** + * The header Refresh + */ + public static final String REFRESH = "Refresh"; + /** + * The header te + */ + public static final String TE = "te"; + /** + * The header If-Match + */ + public static final String IF_MATCH = "If-Match"; + /** + * The header If-Range + */ + public static final String IF_RANGE = "If-Range"; + /** + * The header Accept + */ + public static final String ACCEPT = "Accept"; + /** + * The header Accept-Charset + */ + public static final String ACCEPT_CHARSET = "Accept-Charset"; + /** + * The header Accept-Encoding + */ + public static final String ACCEPT_ENCODING = "Accept-Encoding"; + /** + * The header Accept-Language + */ + public static final String ACCEPT_LANGUAGE = "Accept-Language"; + /** + * The header Accept-Ranges + */ + public static final String ACCEPT_RANGES = "Accept-Ranges"; + /** + * The header Content-Encoding + */ + public static final String CONTENT_ENCODING = "Content-Encoding"; + /** + * The header Content-Language + */ + public static final String CONTENT_LANGUAGE = "Content-Language"; + /** + * The header Content-Length + */ + public static final String CONTENT_LENGTH = "Content-Length"; + /** + * The header Content-Location + */ + public static final String CONTENT_LOCATION = "Content-Location"; + /** + * The header Content-MD5 + */ + public static final String CONTENT_MD5 = "Content-MD5"; + /** + * The header Content-Range + */ + public static final String CONTENT_RANGE = "Content-Range"; + /** + * The header Content-Type + */ + public static final String CONTENT_TYPE = "Content-Type"; + /** + * The header Content-Disposition + */ + public static final String CONTENT_DISPOSITION = "Content-Disposition"; + /** + * The header Transfer-Encoding + */ + public static final String TRANSFER_ENCODING = "Transfer-Encoding"; + /** + * The header Cache-Control + */ + public static final String CACHE_CONTROL = "Cache-Control"; + /** + * The header User-Agent + */ + public static final String USER_AGENT = "User-Agent"; + /** + * The header Retry-After + */ + public static final String RETRY_AFTER = "Retry-After"; + /** + * The header Max-Forwards + */ + public static final String MAX_FORWARDS = "Max-Forwards"; + /** + * The header Keep-Alive + */ + public static final String KEEP_ALIVE = "Keep-Alive"; + /** + * The header Authorization + */ + public static final String AUTHORIZATION = "Authorization"; + /** + * The header Proxy-Authorization + */ + public static final String PROXY_AUTHORIZATION = "Proxy-Authorization"; + /** + * The header Proxy-Connection + */ + public static final String PROXY_CONNECTION = "Proxy-Connection"; + /** + * The header WWW-Authenticate + */ + public static final String WWW_AUTHENTICATE = "WWW-Authenticate"; + /** + * The header Proxy-Authenticate + */ + public static final String PROXY_AUTHENTICATE = "Proxy-Authenticate"; + /** + * The header Httpd-Preemptive + */ + public static final String HTTPD_PREEMPTIVE = "Httpd-Preemptive"; + /** + * The header Last-Modified + */ + public static final String LAST_MODIFIED = "Last-Modified"; + /** + * The header If-Unmodified-Since + */ + public static final String IF_UNMODIFIED_SINCE = "If-Unmodified-Since"; + /** + * The header If-Modified-Since + */ + public static final String IF_MODIFIED_SINCE = "If-Modified-Since"; + /** + * The header If-None-Match + */ + public static final String IF_NONE_MATCH = "If-None-Match"; + /** + * The header Sec-WebSocket-Key + */ + public static final String SEC_WEBSOCKET_KEY = "Sec-WebSocket-Key"; + /** + * The header Sec-WebSocket-Accept + */ + public static final String SEC_WEBSOCKET_ACCEPT = "Sec-WebSocket-Accept"; + /** + * The header Sec-WebSocket-Version + */ + public static final String SEC_WEBSOCKET_VERSION = "Sec-WebSocket-Version"; + /** + * The header Sec-WebSocket-Version + */ + public static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin"; + /** + * The header Sec-WebSocket-Version + */ + public static final String STRICT_TRANSPORT_SECURITY = "Strict-Transport-Security"; + /** + * The header SOAPAction + */ + public static final String SOAPACTION = "SOAPAction"; + + + /** + * The use method + */ + public static final String TARGET_METHOD_UTF8 = ":method"; + /** + * The use status + */ + public static final String RESPONSE_STATUS_UTF8 = ":status"; + /** + * The use path + */ + public static final String TARGET_PATH_UTF8 = ":path"; + /** + * The use scheme + */ + public static final String TARGET_SCHEME_UTF8 = ":scheme"; + /** + * The use authority + */ + public static final String TARGET_AUTHORITY_UTF8 = ":authority"; + /** * The form data */ @@ -405,56 +545,6 @@ public class HTTP { */ public static final String PROTOBUF = "protobuf"; - /** - * 是否为http协议 - * - * @param url 待验证的url - * @return true: http协议, false: 非http协议 - */ - public static boolean isHttp(String url) { - if (StringKit.isEmpty(url)) { - return false; - } - return url.startsWith(org.miaixz.bus.core.net.HTTP.HTTP_PREFIX) || url.startsWith("http%3A%2F%2F"); - } - - /** - * 是否为https协议 - * - * @param url 待验证的url - * @return true: https协议, false: 非https协议 - */ - public static boolean isHttps(String url) { - if (StringKit.isEmpty(url)) { - return false; - } - return url.startsWith(org.miaixz.bus.core.net.HTTP.HTTPS_PREFIX) || url.startsWith("https%3A%2F%2F"); - } - - /** - * 是否为本地主机(域名) - * - * @param url 待验证的url - * @return true: 本地主机(域名), false: 非本地主机(域名) - */ - public static boolean isLocalHost(String url) { - return StringKit.isEmpty(url) || url.contains(org.miaixz.bus.core.net.HTTP.HOST_IPV4) || url.contains(org.miaixz.bus.core.net.HTTP.HOST_LOCAL); - } - - - /** - * 是否为https协议或本地主机(域名) - * - * @param url 待验证的url - * @return true: https协议或本地主机 false: 非https协议或本机主机 - */ - public static boolean isHttpsOrLocalHost(String url) { - if (StringKit.isEmpty(url)) { - return false; - } - return isHttps(url) || isLocalHost(url); - } - /** * WebDAV * diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/Header.java b/bus-core/src/main/java/org/miaixz/bus/core/net/Header.java deleted file mode 100755 index c3d9ce36b3..0000000000 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/Header.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - ~ ~ - ~ The MIT License (MIT) ~ - ~ ~ - ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ - ~ ~ - ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ - ~ of this software and associated documentation files (the "Software"), to deal ~ - ~ in the Software without restriction, including without limitation the rights ~ - ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ - ~ copies of the Software, and to permit persons to whom the Software is ~ - ~ furnished to do so, subject to the following conditions: ~ - ~ ~ - ~ The above copyright notice and this permission notice shall be included in ~ - ~ all copies or substantial portions of the Software. ~ - ~ ~ - ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ - ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ - ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ - ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ - ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ - ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ - ~ THE SOFTWARE. ~ - ~ ~ - ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - */ -package org.miaixz.bus.core.net; - -/** - * Header 常量 - * - * @author Kimi Liu - * @since Java 17+ - */ -public class Header { - - /** - * The header Host - */ - public static final String HOST = "Host"; - /** - * The header Server - */ - public static final String SERVER = "Server"; - /** - * The header Age - */ - public static final String AGE = "Age"; - /** - * The header Allow - */ - public static final String ALLOW = "Allow"; - /** - * The header Expires - */ - public static final String EXPIRES = "Expires"; - /** - * The header Cookie - */ - public static final String COOKIE = "Cookie"; - /** - * The header Set-Cookie - */ - public static final String SET_COOKIE = "Set-Cookie"; - /** - * The header Encoding - */ - public static final String ENCODING = "Encoding"; - /** - * The header Upgrade - */ - public static final String UPGRADE = "Upgrade"; - /** - * The header Trailers - */ - public static final String TRAILERS = "Trailers"; - /** - * The header Location - */ - public static final String LOCATION = "Location"; - /** - * The header Connection - */ - public static final String CONNECTION = "Connection"; - /** - * The header Date - */ - public static final String DATE = "Date"; - /** - * The header Etag - */ - public static final String ETAG = "Etag"; - /** - * The header Expect - */ - public static final String EXPECT = "Expect"; - /** - * The header From - */ - public static final String FROM = "From"; - /** - * The header Link - */ - public static final String LINK = "Link"; - /** - * The header Vary - */ - public static final String VARY = "Vary"; - /** - * The header Via - */ - public static final String VIA = "Via"; - /** - * The header Range - */ - public static final String RANGE = "Range"; - /** - * The header Referer - */ - public static final String REFERER = "Referer"; - /** - * The header Refresh - */ - public static final String REFRESH = "Refresh"; - /** - * The header te - */ - public static final String TE = "te"; - /** - * The header If-Match - */ - public static final String IF_MATCH = "If-Match"; - /** - * The header If-Range - */ - public static final String IF_RANGE = "If-Range"; - /** - * The header Accept - */ - public static final String ACCEPT = "Accept"; - /** - * The header Accept-Charset - */ - public static final String ACCEPT_CHARSET = "Accept-Charset"; - /** - * The header Accept-Encoding - */ - public static final String ACCEPT_ENCODING = "Accept-Encoding"; - /** - * The header Accept-Language - */ - public static final String ACCEPT_LANGUAGE = "Accept-Language"; - /** - * The header Accept-Ranges - */ - public static final String ACCEPT_RANGES = "Accept-Ranges"; - /** - * The header Content-Encoding - */ - public static final String CONTENT_ENCODING = "Content-Encoding"; - /** - * The header Content-Language - */ - public static final String CONTENT_LANGUAGE = "Content-Language"; - /** - * The header Content-Length - */ - public static final String CONTENT_LENGTH = "Content-Length"; - /** - * The header Content-Location - */ - public static final String CONTENT_LOCATION = "Content-Location"; - /** - * The header Content-MD5 - */ - public static final String CONTENT_MD5 = "Content-MD5"; - /** - * The header Content-Range - */ - public static final String CONTENT_RANGE = "Content-Range"; - /** - * The header Content-Type - */ - public static final String CONTENT_TYPE = "Content-Type"; - /** - * The header Content-Disposition - */ - public static final String CONTENT_DISPOSITION = "Content-Disposition"; - /** - * The header Transfer-Encoding - */ - public static final String TRANSFER_ENCODING = "Transfer-Encoding"; - /** - * The header Cache-Control - */ - public static final String CACHE_CONTROL = "Cache-Control"; - /** - * The header User-Agent - */ - public static final String USER_AGENT = "User-Agent"; - /** - * The header Retry-After - */ - public static final String RETRY_AFTER = "Retry-After"; - /** - * The header Max-Forwards - */ - public static final String MAX_FORWARDS = "Max-Forwards"; - /** - * The header Keep-Alive - */ - public static final String KEEP_ALIVE = "Keep-Alive"; - /** - * The header Authorization - */ - public static final String AUTHORIZATION = "Authorization"; - /** - * The header Proxy-Authorization - */ - public static final String PROXY_AUTHORIZATION = "Proxy-Authorization"; - /** - * The header Proxy-Connection - */ - public static final String PROXY_CONNECTION = "Proxy-Connection"; - /** - * The header WWW-Authenticate - */ - public static final String WWW_AUTHENTICATE = "WWW-Authenticate"; - /** - * The header Proxy-Authenticate - */ - public static final String PROXY_AUTHENTICATE = "Proxy-Authenticate"; - /** - * The header Httpd-Preemptive - */ - public static final String HTTPD_PREEMPTIVE = "Httpd-Preemptive"; - /** - * The header Last-Modified - */ - public static final String LAST_MODIFIED = "Last-Modified"; - /** - * The header If-Unmodified-Since - */ - public static final String IF_UNMODIFIED_SINCE = "If-Unmodified-Since"; - /** - * The header If-Modified-Since - */ - public static final String IF_MODIFIED_SINCE = "If-Modified-Since"; - /** - * The header If-None-Match - */ - public static final String IF_NONE_MATCH = "If-None-Match"; - /** - * The header Sec-WebSocket-Key - */ - public static final String SEC_WEBSOCKET_KEY = "Sec-WebSocket-Key"; - /** - * The header Sec-WebSocket-Accept - */ - public static final String SEC_WEBSOCKET_ACCEPT = "Sec-WebSocket-Accept"; - /** - * The header Sec-WebSocket-Version - */ - public static final String SEC_WEBSOCKET_VERSION = "Sec-WebSocket-Version"; - /** - * The header Sec-WebSocket-Version - */ - public static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin"; - /** - * The header Sec-WebSocket-Version - */ - public static final String STRICT_TRANSPORT_SECURITY = "Strict-Transport-Security"; - /** - * The header SOAPAction - */ - public static final String SOAPACTION = "SOAPAction"; - -} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java index 6a0c3e1c8c..537cf4ff70 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/tls/SSLContextBuilder.java @@ -29,7 +29,6 @@ import org.miaixz.bus.core.Builder; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.ArrayKit; import org.miaixz.bus.core.xyz.StringKit; @@ -175,10 +174,10 @@ public static X509TrustManager newTrustManager() { public static SSLContext getSSLContext() { try { - return SSLContext.getInstance(HTTP.TLS_V_13); + return SSLContext.getInstance(Protocol.TLSv1_3.name); } catch (NoSuchAlgorithmException e) { try { - return SSLContext.getInstance(HTTP.TLS); + return SSLContext.getInstance(Protocol.TLS.name); } catch (NoSuchAlgorithmException e2) { throw new IllegalStateException("No TLS provider", e); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Address.java b/bus-http/src/main/java/org/miaixz/bus/http/Address.java index 42b4272ba9..a84a5fc07b 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Address.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Address.java @@ -28,7 +28,6 @@ package org.miaixz.bus.http; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.accord.Connection; import org.miaixz.bus.http.accord.ConnectionSuite; @@ -102,7 +101,7 @@ public Address(String uriHost, int uriPort, DnsX dns, SocketFactory socketFactor Proxy proxy, List protocols, List connectionSuites, ProxySelector proxySelector) { this.url = new UnoUrl.Builder() - .scheme(null != sslSocketFactory ? HTTP.HTTPS : HTTP.HTTP) + .scheme(null != sslSocketFactory ? Protocol.HTTPS.name : Protocol.HTTP.name) .host(uriHost) .port(uriPort) .build(); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java b/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java index be6c14ddfc..97fa068b26 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Httpv.java @@ -31,7 +31,7 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.bodys.ResponseBody; import org.miaixz.bus.http.plugin.httpv.*; import org.miaixz.bus.http.socket.WebSocket; @@ -252,10 +252,10 @@ private String urlPath(String urlPath, boolean websocket) { throw new InternalException("Before setting BaseUrl, you must specify a specific path to initiate a request!"); } } else { - boolean isFullPath = urlPath.startsWith(HTTP.HTTPS_PREFIX) - || urlPath.startsWith(HTTP.HTTP_PREFIX) - || urlPath.startsWith(HTTP.WSS_PREFIX) - || urlPath.startsWith(HTTP.WS_PREFIX); + boolean isFullPath = urlPath.startsWith(Protocol.HTTPS_PREFIX) + || urlPath.startsWith(Protocol.HTTP_PREFIX) + || urlPath.startsWith(Protocol.WSS_PREFIX) + || urlPath.startsWith(Protocol.WS_PREFIX); if (isFullPath) { fullUrl = urlPath; } else if (null != baseUrl) { @@ -264,11 +264,11 @@ private String urlPath(String urlPath, boolean websocket) { throw new InternalException("Before setting BaseUrl, you must use the full path URL to initiate the request. The current URL is:" + urlPath); } } - if (websocket && fullUrl.startsWith(HTTP.HTTP)) { - return fullUrl.replaceFirst(HTTP.HTTP, HTTP.WS); + if (websocket && fullUrl.startsWith(Protocol.HTTP.name)) { + return fullUrl.replaceFirst(Protocol.HTTP.name, Protocol.WS.name); } - if (!websocket && fullUrl.startsWith(HTTP.WS)) { - return fullUrl.replaceFirst(HTTP.WS, HTTP.HTTP); + if (!websocket && fullUrl.startsWith(Protocol.WS.name)) { + return fullUrl.replaceFirst(Protocol.WS.name, Protocol.HTTP.name); } return fullUrl; } @@ -437,7 +437,7 @@ private static void addCopyInterceptor(Httpd.Builder builder) { Request request = chain.request(); Response response = chain.proceed(request); ResponseBody body = response.body(); - String type = response.header(Header.CONTENT_TYPE); + String type = response.header(HTTP.CONTENT_TYPE); if (null == body || null != type && (type.contains("octet-stream") || type.contains("image") || type.contains("video") || type.contains("archive") || type.contains("word") diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Request.java b/bus-http/src/main/java/org/miaixz/bus/http/Request.java index 9d1e12ca06..4de05e7c8b 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Request.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Request.java @@ -30,7 +30,6 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.bodys.RequestBody; import org.miaixz.bus.http.cache.CacheControl; @@ -233,8 +232,8 @@ public Builder headers(Headers headers) { */ public Builder cacheControl(CacheControl cacheControl) { String value = cacheControl.toString(); - if (value.isEmpty()) return removeHeader(Header.CACHE_CONTROL); - return header(Header.CACHE_CONTROL, value); + if (value.isEmpty()) return removeHeader(HTTP.CACHE_CONTROL); + return header(HTTP.CACHE_CONTROL, value); } public Builder get() { diff --git a/bus-http/src/main/java/org/miaixz/bus/http/Response.java b/bus-http/src/main/java/org/miaixz/bus/http/Response.java index 4286cd2e87..11e8a2c01b 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/Response.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/Response.java @@ -31,7 +31,6 @@ import org.miaixz.bus.core.io.source.BufferSource; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.accord.Exchange; import org.miaixz.bus.http.bodys.ResponseBody; @@ -257,9 +256,9 @@ public Response priorResponse() { public List challenges() { String responseField; if (code == HTTP.HTTP_UNAUTHORIZED) { - responseField = Header.WWW_AUTHENTICATE; + responseField = HTTP.WWW_AUTHENTICATE; } else if (code == HTTP.HTTP_PROXY_AUTH) { - responseField = Header.PROXY_AUTHENTICATE; + responseField = HTTP.PROXY_AUTHENTICATE; } else { return Collections.emptyList(); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java b/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java index 95c69a40f7..4d8a29a7cf 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/UnoUrl.java @@ -31,7 +31,7 @@ import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import java.net.MalformedURLException; import java.net.URI; @@ -124,9 +124,9 @@ public class UnoUrl { * otherwise. */ public static int defaultPort(String scheme) { - if (HTTP.HTTP.equals(scheme)) { + if (Protocol.HTTP.name.equals(scheme)) { return 80; - } else if (HTTP.HTTPS.equals(scheme)) { + } else if (Protocol.HTTPS.name.equals(scheme)) { return 443; } else { return -1; @@ -394,7 +394,7 @@ public String scheme() { } public boolean isHttps() { - return scheme.equals("https"); + return Protocol.isHttps(scheme); } /** @@ -950,10 +950,10 @@ private static int parsePort(String input, int pos, int limit) { public Builder scheme(String scheme) { if (null == scheme) { throw new NullPointerException("scheme == null"); - } else if (scheme.equalsIgnoreCase(HTTP.HTTP)) { - this.scheme = HTTP.HTTP; - } else if (scheme.equalsIgnoreCase(HTTP.HTTPS)) { - this.scheme = HTTP.HTTPS; + } else if (scheme.equalsIgnoreCase(Protocol.HTTP.name)) { + this.scheme = Protocol.HTTP.name; + } else if (scheme.equalsIgnoreCase(Protocol.HTTPS.name)) { + this.scheme = Protocol.HTTPS.name; } else { throw new IllegalArgumentException("unexpected scheme: " + scheme); } @@ -1287,12 +1287,12 @@ Builder parse(UnoUrl base, String input) { int schemeDelimiterOffset = schemeDelimiterOffset(input, pos, limit); if (schemeDelimiterOffset != -1) { - if (input.regionMatches(true, pos, HTTP.HTTPS + Symbol.COLON, 0, 6)) { - this.scheme = HTTP.HTTPS; - pos += (HTTP.HTTPS + Symbol.COLON).length(); - } else if (input.regionMatches(true, pos, HTTP.HTTP + Symbol.COLON, 0, 5)) { - this.scheme = HTTP.HTTP; - pos += (HTTP.HTTP + Symbol.COLON).length(); + if (input.regionMatches(true, pos, Protocol.HTTPS.name + Symbol.COLON, 0, 6)) { + this.scheme = Protocol.HTTPS.name; + pos += (Protocol.HTTPS.name + Symbol.COLON).length(); + } else if (input.regionMatches(true, pos, Protocol.HTTP.name + Symbol.COLON, 0, 5)) { + this.scheme = Protocol.HTTP.name; + pos += (Protocol.HTTP.name + Symbol.COLON).length(); } else { throw new IllegalArgumentException("Expected URL scheme 'http' or 'https' but was '" + input.substring(0, schemeDelimiterOffset) + Symbol.SINGLE_QUOTE); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java index 91ea205467..758ca21c86 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/accord/RealConnection.java @@ -33,7 +33,6 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.RevisedException; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.net.tls.TrustAnyHostnameVerifier; import org.miaixz.bus.core.xyz.IoKit; @@ -434,7 +433,7 @@ private Request createTunnel(int readTimeout, int writeTimeout, Request tunnelRe throw new IOException("Failed to authenticate with proxy"); } - if ("close".equalsIgnoreCase(response.header(Header.CONNECTION))) { + if ("close".equalsIgnoreCase(response.header(HTTP.CONNECTION))) { return tunnelRequest; } break; @@ -457,9 +456,9 @@ private Request createTunnelRequest() throws IOException { Request proxyConnectRequest = new Request.Builder() .url(route.address().url()) .method(HTTP.CONNECT, null) - .header(Header.HOST, Builder.hostHeader(route.address().url(), true)) - .header(Header.PROXY_CONNECTION, Header.KEEP_ALIVE) - .header(Header.USER_AGENT, "Httpd/" + Version.all()) + .header(HTTP.HOST, Builder.hostHeader(route.address().url(), true)) + .header(HTTP.PROXY_CONNECTION, HTTP.KEEP_ALIVE) + .header(HTTP.USER_AGENT, "Httpd/" + Version.all()) .build(); Response fakeAuthChallengeResponse = new Response.Builder() @@ -470,7 +469,7 @@ private Request createTunnelRequest() throws IOException { .body(Builder.EMPTY_RESPONSE) .sentRequestAtMillis(-1L) .receivedResponseAtMillis(-1L) - .header(Header.PROXY_AUTHENTICATE, Header.HTTPD_PREEMPTIVE) + .header(HTTP.PROXY_AUTHENTICATE, HTTP.HTTPD_PREEMPTIVE) .build(); Request authenticatedRequest = route.address().proxyAuthenticator() diff --git a/bus-http/src/main/java/org/miaixz/bus/http/bodys/MultipartBody.java b/bus-http/src/main/java/org/miaixz/bus/http/bodys/MultipartBody.java index dd1e8a05af..e9497b778d 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/bodys/MultipartBody.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/bodys/MultipartBody.java @@ -32,7 +32,7 @@ import org.miaixz.bus.core.io.sink.BufferSink; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Headers; import java.io.IOException; @@ -178,7 +178,7 @@ private long writeOrCountBytes(BufferSink sink, boolean countBytes) throws IOExc MediaType mediaType = body.mediaType(); if (null != mediaType) { - sink.writeUtf8(Header.CONTENT_TYPE + ": ") + sink.writeUtf8(HTTP.CONTENT_TYPE + ": ") .writeUtf8(mediaType.toString()) .write(CRLF); } @@ -235,10 +235,10 @@ public static Part create(Headers headers, RequestBody body) { if (null == body) { throw new NullPointerException("body == null"); } - if (null != headers && null != headers.get(Header.CONTENT_TYPE)) { + if (null != headers && null != headers.get(HTTP.CONTENT_TYPE)) { throw new IllegalArgumentException("Unexpected header: Content-Type"); } - if (null != headers && null != headers.get(Header.CONTENT_LENGTH)) { + if (null != headers && null != headers.get(HTTP.CONTENT_LENGTH)) { throw new IllegalArgumentException("Unexpected header: Content-Length"); } return new Part(headers, body); @@ -261,7 +261,7 @@ public static Part createFormData(String name, String filename, RequestBody body } Headers headers = new Headers.Builder() - .addUnsafeNonAscii(Header.CONTENT_DISPOSITION, disposition.toString()) + .addUnsafeNonAscii(HTTP.CONTENT_DISPOSITION, disposition.toString()) .build(); return create(headers, body); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java index 2713b82a88..6c27727915 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/Cache.java @@ -38,7 +38,6 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.net.tls.TlsVersion; import org.miaixz.bus.core.xyz.IoKit; @@ -559,7 +558,7 @@ public void writeTo(DiskLruCache.Editor editor) throws IOException { } private boolean isHttps() { - return url.startsWith(HTTP.HTTPS_PREFIX); + return url.startsWith(Protocol.HTTPS_PREFIX); } private List readCertificateList(BufferSource source) throws IOException { @@ -604,8 +603,8 @@ public boolean matches(Request request, Response response) { } public Response response(DiskLruCache.Snapshot snapshot) { - String mediaType = responseHeaders.get(Header.CONTENT_TYPE); - String length = responseHeaders.get(Header.CONTENT_LENGTH); + String mediaType = responseHeaders.get(HTTP.CONTENT_TYPE); + String length = responseHeaders.get(HTTP.CONTENT_LENGTH); Request request = new Request.Builder() .url(url) .method(requestMethod, null) diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheControl.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheControl.java index 0ae4c51984..8afe0e3f7c 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheControl.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheControl.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Headers; import java.util.concurrent.TimeUnit; @@ -152,7 +152,7 @@ public static CacheControl parse(Headers headers) { String name = headers.name(i); String value = headers.value(i); - if (name.equalsIgnoreCase(Header.CACHE_CONTROL)) { + if (name.equalsIgnoreCase(HTTP.CACHE_CONTROL)) { if (null != headerValue) { // 多个cache-control头文件意味着不能使用原始值 canUseHeaderValue = false; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java index 93b5635a48..e2b7cb60ec 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheInterceptor.java @@ -35,7 +35,6 @@ import org.miaixz.bus.core.io.timout.Timeout; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.Builder; @@ -111,14 +110,14 @@ private static Headers combine(Headers cachedHeaders, Headers networkHeaders) { * @return the true/false */ static boolean isEndToEnd(String fieldName) { - return !Header.CONNECTION.equalsIgnoreCase(fieldName) - && !Header.KEEP_ALIVE.equalsIgnoreCase(fieldName) - && !Header.PROXY_AUTHENTICATE.equalsIgnoreCase(fieldName) - && !Header.PROXY_AUTHORIZATION.equalsIgnoreCase(fieldName) - && !Header.TE.equalsIgnoreCase(fieldName) - && !Header.TRAILERS.equalsIgnoreCase(fieldName) - && !Header.TRANSFER_ENCODING.equalsIgnoreCase(fieldName) - && !Header.UPGRADE.equalsIgnoreCase(fieldName); + return !HTTP.CONNECTION.equalsIgnoreCase(fieldName) + && !HTTP.KEEP_ALIVE.equalsIgnoreCase(fieldName) + && !HTTP.PROXY_AUTHENTICATE.equalsIgnoreCase(fieldName) + && !HTTP.PROXY_AUTHORIZATION.equalsIgnoreCase(fieldName) + && !HTTP.TE.equalsIgnoreCase(fieldName) + && !HTTP.TRAILERS.equalsIgnoreCase(fieldName) + && !HTTP.TRANSFER_ENCODING.equalsIgnoreCase(fieldName) + && !HTTP.UPGRADE.equalsIgnoreCase(fieldName); } /** @@ -128,9 +127,9 @@ static boolean isEndToEnd(String fieldName) { * @return the true/false */ static boolean isContentSpecificHeader(String fieldName) { - return Header.CONTENT_LENGTH.equalsIgnoreCase(fieldName) - || Header.CONTENT_ENCODING.equalsIgnoreCase(fieldName) - || Header.CONTENT_TYPE.equalsIgnoreCase(fieldName); + return HTTP.CONTENT_LENGTH.equalsIgnoreCase(fieldName) + || HTTP.CONTENT_ENCODING.equalsIgnoreCase(fieldName) + || HTTP.CONTENT_TYPE.equalsIgnoreCase(fieldName); } @Override @@ -299,7 +298,7 @@ public void close() throws IOException { } }; - String mediaType = response.header(Header.CONTENT_TYPE); + String mediaType = response.header(HTTP.CONTENT_TYPE); long contentLength = response.body().length(); return response.newBuilder() .body(new RealResponseBody(mediaType, contentLength, IoKit.buffer(cacheWritingSource))) diff --git a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java index 0932b2b2e5..886e41ad26 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/cache/CacheStrategy.java @@ -28,7 +28,6 @@ package org.miaixz.bus.http.cache; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.http.Builder; import org.miaixz.bus.http.Headers; import org.miaixz.bus.http.Request; @@ -88,7 +87,7 @@ public static boolean isCacheable(Response response, Request request) { break; case HTTP.HTTP_MOVED_TEMP: case HTTP.HTTP_TEMP_REDIRECT: - if (null != response.header(Header.EXPIRES) + if (null != response.header(HTTP.EXPIRES) || response.cacheControl().maxAgeSeconds() != -1 || response.cacheControl().isPublic() || response.cacheControl().isPrivate()) { @@ -183,7 +182,7 @@ public Factory(long nowMillis, Request request, Response cacheResponse) { * @return the true/false */ private static boolean hasConditions(Request request) { - return null != request.header(Header.IF_MODIFIED_SINCE) || null != request.header(Header.IF_NONE_MATCH); + return null != request.header(HTTP.IF_MODIFIED_SINCE) || null != request.header(HTTP.IF_NONE_MATCH); } /** diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java index caa9a7ad81..93018651e0 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/BridgeInterceptor.java @@ -31,7 +31,7 @@ import org.miaixz.bus.core.io.source.GzipSource; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.bodys.RealResponseBody; @@ -67,43 +67,43 @@ public Response intercept(NewChain chain) throws IOException { if (null != body) { MediaType mediaType = body.mediaType(); if (null != mediaType) { - requestBuilder.header(Header.CONTENT_TYPE, mediaType.toString()); + requestBuilder.header(HTTP.CONTENT_TYPE, mediaType.toString()); } long length = body.length(); if (length != -1) { - requestBuilder.header(Header.CONTENT_LENGTH, Long.toString(length)); - requestBuilder.removeHeader(Header.TRANSFER_ENCODING); + requestBuilder.header(HTTP.CONTENT_LENGTH, Long.toString(length)); + requestBuilder.removeHeader(HTTP.TRANSFER_ENCODING); } else { - requestBuilder.header(Header.TRANSFER_ENCODING, "chunked"); - requestBuilder.removeHeader(Header.CONTENT_LENGTH); + requestBuilder.header(HTTP.TRANSFER_ENCODING, "chunked"); + requestBuilder.removeHeader(HTTP.CONTENT_LENGTH); } } - if (null == request.header(Header.HOST)) { - requestBuilder.header(Header.HOST, Builder.hostHeader(request.url(), false)); + if (null == request.header(HTTP.HOST)) { + requestBuilder.header(HTTP.HOST, Builder.hostHeader(request.url(), false)); } - if (null == request.header(Header.CONNECTION)) { - requestBuilder.header(Header.CONNECTION, Header.KEEP_ALIVE); + if (null == request.header(HTTP.CONNECTION)) { + requestBuilder.header(HTTP.CONNECTION, HTTP.KEEP_ALIVE); } // If we add an "Accept-Encoding: gzip" header field we're responsible for also decompressing // the transfer stream. boolean transparentGzip = false; - if (null == request.header(Header.ACCEPT_ENCODING) + if (null == request.header(HTTP.ACCEPT_ENCODING) && null == request.header("Range")) { transparentGzip = true; - requestBuilder.header(Header.ACCEPT_ENCODING, "gzip"); + requestBuilder.header(HTTP.ACCEPT_ENCODING, "gzip"); } List cookies = cookieJar.loadForRequest(request.url()); if (!cookies.isEmpty()) { - requestBuilder.header(Header.COOKIE, cookieHeader(cookies)); + requestBuilder.header(HTTP.COOKIE, cookieHeader(cookies)); } - if (null == request.header(Header.USER_AGENT)) { - requestBuilder.header(Header.USER_AGENT, "Httpd/" + Version.all()); + if (null == request.header(HTTP.USER_AGENT)) { + requestBuilder.header(HTTP.USER_AGENT, "Httpd/" + Version.all()); } Response networkResponse = chain.proceed(requestBuilder.build()); @@ -114,15 +114,15 @@ public Response intercept(NewChain chain) throws IOException { .request(request); if (transparentGzip - && "gzip".equalsIgnoreCase(networkResponse.header(Header.CONTENT_ENCODING)) + && "gzip".equalsIgnoreCase(networkResponse.header(HTTP.CONTENT_ENCODING)) && Headers.hasBody(networkResponse)) { GzipSource responseBody = new GzipSource(networkResponse.body().source()); Headers strippedHeaders = networkResponse.headers().newBuilder() - .removeAll(Header.CONTENT_ENCODING) - .removeAll(Header.CONTENT_LENGTH) + .removeAll(HTTP.CONTENT_ENCODING) + .removeAll(HTTP.CONTENT_LENGTH) .build(); responseBuilder.headers(strippedHeaders); - String mediaType = networkResponse.header(Header.CONTENT_TYPE); + String mediaType = networkResponse.header(HTTP.CONTENT_TYPE); responseBuilder.body(new RealResponseBody(mediaType, -1L, IoKit.buffer(responseBody))); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java index 16f6d91bfc..b8b7367192 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/CallServerInterceptor.java @@ -29,7 +29,6 @@ import org.miaixz.bus.core.io.sink.BufferSink; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.Builder; import org.miaixz.bus.http.Request; @@ -149,8 +148,8 @@ public Response intercept(NewChain chain) throws IOException { .build(); } - if ("close".equalsIgnoreCase(response.request().header(Header.CONNECTION)) - || "close".equalsIgnoreCase(response.header(Header.CONNECTION))) { + if ("close".equalsIgnoreCase(response.request().header(HTTP.CONNECTION)) + || "close".equalsIgnoreCase(response.header(HTTP.CONNECTION))) { exchange.noNewExchangesOnConnection(); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java index 2883095f38..6b5a09e1f2 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Hpack.java @@ -34,7 +34,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.core.xyz.StringKit; @@ -57,8 +57,8 @@ class Hpack { new Http2Header(Http2Header.TARGET_METHOD, HTTP.POST), new Http2Header(Http2Header.TARGET_PATH, Symbol.SLASH), new Http2Header(Http2Header.TARGET_PATH, "/index.html"), - new Http2Header(Http2Header.TARGET_SCHEME, HTTP.HTTP), - new Http2Header(Http2Header.TARGET_SCHEME, HTTP.HTTPS), + new Http2Header(Http2Header.TARGET_SCHEME, Protocol.HTTP.name), + new Http2Header(Http2Header.TARGET_SCHEME, Protocol.HTTPS.name), new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_OK)), new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_NO_CONTENT)), new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_PARTIAL)), @@ -66,53 +66,53 @@ class Hpack { new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_BAD_REQUEST)), new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_NOT_FOUND)), new Http2Header(Http2Header.RESPONSE_STATUS, StringKit.toString(HTTP.HTTP_INTERNAL_ERROR)), - new Http2Header(Header.ACCEPT_CHARSET, Normal.EMPTY), - new Http2Header(Header.ACCEPT_ENCODING, "gzip, deflate"), - new Http2Header(Header.ACCEPT_LANGUAGE, Normal.EMPTY), - new Http2Header(Header.ACCEPT_RANGES, Normal.EMPTY), - new Http2Header(Header.ACCEPT, Normal.EMPTY), - new Http2Header(Header.ACCESS_CONTROL_ALLOW_ORIGIN, Normal.EMPTY), - new Http2Header(Header.AGE, Normal.EMPTY), - new Http2Header(Header.ALLOW, Normal.EMPTY), - new Http2Header(Header.AUTHORIZATION, Normal.EMPTY), - new Http2Header(Header.CACHE_CONTROL, Normal.EMPTY), - new Http2Header(Header.CONTENT_DISPOSITION, Normal.EMPTY), - new Http2Header(Header.CONTENT_ENCODING, Normal.EMPTY), - new Http2Header(Header.CONTENT_LANGUAGE, Normal.EMPTY), - new Http2Header(Header.CONTENT_LENGTH, Normal.EMPTY), - new Http2Header(Header.CONTENT_LOCATION, Normal.EMPTY), - new Http2Header(Header.CONTENT_RANGE, Normal.EMPTY), - new Http2Header(Header.CONTENT_TYPE, Normal.EMPTY), - new Http2Header(Header.COOKIE, Normal.EMPTY), - new Http2Header(Header.DATE, Normal.EMPTY), - new Http2Header(Header.ETAG, Normal.EMPTY), - new Http2Header(Header.EXPECT, Normal.EMPTY), - new Http2Header(Header.EXPIRES, Normal.EMPTY), - new Http2Header(Header.FROM, Normal.EMPTY), - new Http2Header(Header.HOST, Normal.EMPTY), - new Http2Header(Header.IF_MATCH, Normal.EMPTY), - new Http2Header(Header.IF_MODIFIED_SINCE, Normal.EMPTY), - new Http2Header(Header.IF_NONE_MATCH, Normal.EMPTY), - new Http2Header(Header.IF_RANGE, Normal.EMPTY), - new Http2Header(Header.IF_UNMODIFIED_SINCE, Normal.EMPTY), - new Http2Header(Header.LAST_MODIFIED, Normal.EMPTY), - new Http2Header(Header.LINK, Normal.EMPTY), - new Http2Header(Header.LOCATION, Normal.EMPTY), - new Http2Header(Header.MAX_FORWARDS, Normal.EMPTY), - new Http2Header(Header.PROXY_AUTHENTICATE, Normal.EMPTY), - new Http2Header(Header.PROXY_AUTHORIZATION, Normal.EMPTY), - new Http2Header(Header.RANGE, Normal.EMPTY), - new Http2Header(Header.REFERER, Normal.EMPTY), - new Http2Header(Header.REFRESH, Normal.EMPTY), - new Http2Header(Header.RETRY_AFTER, Normal.EMPTY), - new Http2Header(Header.SERVER, Normal.EMPTY), - new Http2Header(Header.SET_COOKIE, Normal.EMPTY), - new Http2Header(Header.STRICT_TRANSPORT_SECURITY, Normal.EMPTY), - new Http2Header(Header.TRANSFER_ENCODING, Normal.EMPTY), - new Http2Header(Header.USER_AGENT, Normal.EMPTY), - new Http2Header(Header.VARY, Normal.EMPTY), - new Http2Header(Header.VIA, Normal.EMPTY), - new Http2Header(Header.WWW_AUTHENTICATE, Normal.EMPTY) + new Http2Header(HTTP.ACCEPT_CHARSET, Normal.EMPTY), + new Http2Header(HTTP.ACCEPT_ENCODING, "gzip, deflate"), + new Http2Header(HTTP.ACCEPT_LANGUAGE, Normal.EMPTY), + new Http2Header(HTTP.ACCEPT_RANGES, Normal.EMPTY), + new Http2Header(HTTP.ACCEPT, Normal.EMPTY), + new Http2Header(HTTP.ACCESS_CONTROL_ALLOW_ORIGIN, Normal.EMPTY), + new Http2Header(HTTP.AGE, Normal.EMPTY), + new Http2Header(HTTP.ALLOW, Normal.EMPTY), + new Http2Header(HTTP.AUTHORIZATION, Normal.EMPTY), + new Http2Header(HTTP.CACHE_CONTROL, Normal.EMPTY), + new Http2Header(HTTP.CONTENT_DISPOSITION, Normal.EMPTY), + new Http2Header(HTTP.CONTENT_ENCODING, Normal.EMPTY), + new Http2Header(HTTP.CONTENT_LANGUAGE, Normal.EMPTY), + new Http2Header(HTTP.CONTENT_LENGTH, Normal.EMPTY), + new Http2Header(HTTP.CONTENT_LOCATION, Normal.EMPTY), + new Http2Header(HTTP.CONTENT_RANGE, Normal.EMPTY), + new Http2Header(HTTP.CONTENT_TYPE, Normal.EMPTY), + new Http2Header(HTTP.COOKIE, Normal.EMPTY), + new Http2Header(HTTP.DATE, Normal.EMPTY), + new Http2Header(HTTP.ETAG, Normal.EMPTY), + new Http2Header(HTTP.EXPECT, Normal.EMPTY), + new Http2Header(HTTP.EXPIRES, Normal.EMPTY), + new Http2Header(HTTP.FROM, Normal.EMPTY), + new Http2Header(HTTP.HOST, Normal.EMPTY), + new Http2Header(HTTP.IF_MATCH, Normal.EMPTY), + new Http2Header(HTTP.IF_MODIFIED_SINCE, Normal.EMPTY), + new Http2Header(HTTP.IF_NONE_MATCH, Normal.EMPTY), + new Http2Header(HTTP.IF_RANGE, Normal.EMPTY), + new Http2Header(HTTP.IF_UNMODIFIED_SINCE, Normal.EMPTY), + new Http2Header(HTTP.LAST_MODIFIED, Normal.EMPTY), + new Http2Header(HTTP.LINK, Normal.EMPTY), + new Http2Header(HTTP.LOCATION, Normal.EMPTY), + new Http2Header(HTTP.MAX_FORWARDS, Normal.EMPTY), + new Http2Header(HTTP.PROXY_AUTHENTICATE, Normal.EMPTY), + new Http2Header(HTTP.PROXY_AUTHORIZATION, Normal.EMPTY), + new Http2Header(HTTP.RANGE, Normal.EMPTY), + new Http2Header(HTTP.REFERER, Normal.EMPTY), + new Http2Header(HTTP.REFRESH, Normal.EMPTY), + new Http2Header(HTTP.RETRY_AFTER, Normal.EMPTY), + new Http2Header(HTTP.SERVER, Normal.EMPTY), + new Http2Header(HTTP.SET_COOKIE, Normal.EMPTY), + new Http2Header(HTTP.STRICT_TRANSPORT_SECURITY, Normal.EMPTY), + new Http2Header(HTTP.TRANSFER_ENCODING, Normal.EMPTY), + new Http2Header(HTTP.USER_AGENT, Normal.EMPTY), + new Http2Header(HTTP.VARY, Normal.EMPTY), + new Http2Header(HTTP.VIA, Normal.EMPTY), + new Http2Header(HTTP.WWW_AUTHENTICATE, Normal.EMPTY) }; static final Map NAME_TO_FIRST_INDEX = nameToFirstIndex(); private static final int PREFIX_4_BITS = 0x0f; diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java index fd76a869cf..b3a60ebe05 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/Http2Codec.java @@ -30,7 +30,6 @@ import org.miaixz.bus.core.io.sink.Sink; import org.miaixz.bus.core.io.source.Source; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.http.*; @@ -56,27 +55,27 @@ public class Http2Codec implements HttpCodec { * See http://tools.ietf.org/html/draft-ietf-httpbis-http2-09#section-8.1.3. */ private static final List HTTP_2_SKIPPED_REQUEST_HEADERS = Builder.immutableList( - Header.CONNECTION, - Header.HOST, - Header.KEEP_ALIVE, - Header.PROXY_CONNECTION, - Header.TE, - Header.TRANSFER_ENCODING, - Header.ENCODING, - Header.UPGRADE, + HTTP.CONNECTION, + HTTP.HOST, + HTTP.KEEP_ALIVE, + HTTP.PROXY_CONNECTION, + HTTP.TE, + HTTP.TRANSFER_ENCODING, + HTTP.ENCODING, + HTTP.UPGRADE, HTTP.TARGET_METHOD_UTF8, HTTP.TARGET_PATH_UTF8, HTTP.TARGET_SCHEME_UTF8, HTTP.TARGET_AUTHORITY_UTF8); private static final List HTTP_2_SKIPPED_RESPONSE_HEADERS = Builder.immutableList( - Header.CONNECTION, - Header.HOST, - Header.KEEP_ALIVE, - Header.PROXY_CONNECTION, - Header.TE, - Header.TRANSFER_ENCODING, - Header.ENCODING, - Header.UPGRADE); + HTTP.CONNECTION, + HTTP.HOST, + HTTP.KEEP_ALIVE, + HTTP.PROXY_CONNECTION, + HTTP.TE, + HTTP.TRANSFER_ENCODING, + HTTP.ENCODING, + HTTP.UPGRADE); private final NewChain chain; private final RealConnection realConnection; @@ -109,7 +108,7 @@ public static List http2HeadersList(Request request) { for (int i = 0, size = headers.size(); i < size; i++) { // header names must be lowercase. String name = StringKit.upperFirst(headers.name(i)); - if (!HTTP_2_SKIPPED_REQUEST_HEADERS.contains(name) || name.equals(Header.TE) + if (!HTTP_2_SKIPPED_REQUEST_HEADERS.contains(name) || name.equals(HTTP.TE) && "trailers".equals(headers.value(i))) { result.add(new Http2Header(name, headers.value(i))); } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java index eaa0e0d521..9ce8512d88 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/RetryAndFollowUp.java @@ -28,7 +28,6 @@ package org.miaixz.bus.http.metric.http; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; import org.miaixz.bus.http.accord.Exchange; @@ -241,7 +240,7 @@ private Request followUpRequest(Response userResponse, Route route) throws IOExc // Does the client allow redirects? if (!httpd.followRedirects()) return null; - String location = userResponse.header(Header.LOCATION); + String location = userResponse.header(HTTP.LOCATION); if (null == location) return null; UnoUrl url = userResponse.request().url().resolve(location); @@ -263,9 +262,9 @@ private Request followUpRequest(Response userResponse, Route route) throws IOExc requestBuilder.method(method, requestBody); } if (!maintainBody) { - requestBuilder.removeHeader(Header.TRANSFER_ENCODING); - requestBuilder.removeHeader(Header.CONTENT_LENGTH); - requestBuilder.removeHeader(Header.CONTENT_TYPE); + requestBuilder.removeHeader(HTTP.TRANSFER_ENCODING); + requestBuilder.removeHeader(HTTP.CONTENT_LENGTH); + requestBuilder.removeHeader(HTTP.CONTENT_TYPE); } } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/ResultBody.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/ResultBody.java index 3ffdaaaf1b..72554cacc4 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/ResultBody.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpv/ResultBody.java @@ -34,7 +34,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Callback; import org.miaixz.bus.http.Response; import org.miaixz.bus.http.bodys.ResponseBody; @@ -330,7 +330,7 @@ private long getRangeStart() { if (response.code() != HttpURLConnection.HTTP_PARTIAL) { return rangeStart; } - String range = response.header(Header.CONTENT_RANGE); + String range = response.header(HTTP.CONTENT_RANGE); if (null != range && range.startsWith("bytes")) { int index = range.indexOf(Symbol.C_MINUS); if (index > 5) { diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpx/HttpProxy.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpx/HttpProxy.java index 6c288b5c0b..5b385a42e9 100755 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpx/HttpProxy.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpx/HttpProxy.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http.plugin.httpx; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.secure.Authenticator; import org.miaixz.bus.http.secure.Credentials; @@ -75,8 +75,8 @@ public Authenticator authenticator() { return (route, response) -> { String credential = Credentials.basic(user, password); return response.request().newBuilder(). - header(Header.PROXY_AUTHORIZATION, credential). - header(Header.PROXY_CONNECTION, Header.KEEP_ALIVE).build(); + header(HTTP.PROXY_AUTHORIZATION, credential). + header(HTTP.PROXY_CONNECTION, HTTP.KEEP_ALIVE).build(); }; } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PostRequest.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PostRequest.java index 1a58bd60b9..5fedb4463e 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PostRequest.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PostRequest.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.FileKit; import org.miaixz.bus.core.xyz.ObjectKit; import org.miaixz.bus.http.Headers; @@ -85,8 +85,8 @@ protected RequestBody buildRequestBody() { return builder.build(); } else if (null != body && body.length() > 0) { MediaType mediaType; - if (headers.containsKey(Header.CONTENT_TYPE)) { - mediaType = MediaType.valueOf(headers.get(Header.CONTENT_TYPE)); + if (headers.containsKey(HTTP.CONTENT_TYPE)) { + mediaType = MediaType.valueOf(headers.get(HTTP.CONTENT_TYPE)); } else { mediaType = MediaType.TEXT_PLAIN_TYPE; } @@ -114,7 +114,7 @@ private void addParam(FormBody.Builder builder) { private void addParam(MultipartBody.Builder builder) { if (null != params && !params.isEmpty()) { - params.forEach((k, v) -> builder.addPart(Headers.of(Header.CONTENT_DISPOSITION, "form-data; name=\"" + k + Symbol.DOUBLE_QUOTES), + params.forEach((k, v) -> builder.addPart(Headers.of(HTTP.CONTENT_DISPOSITION, "form-data; name=\"" + k + Symbol.DOUBLE_QUOTES), RequestBody.create(null, v))); } } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PutRequest.java b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PutRequest.java index d5eb76a068..67b3694031 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PutRequest.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/plugin/httpz/PutRequest.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.FileKit; import org.miaixz.bus.http.Headers; import org.miaixz.bus.http.Request; @@ -84,8 +84,8 @@ protected RequestBody buildRequestBody() { return builder.build(); } else if (null != body && body.length() > 0) { MediaType mediaType; - if (headers.containsKey(Header.CONTENT_TYPE)) { - mediaType = MediaType.valueOf(headers.get(Header.CONTENT_TYPE)); + if (headers.containsKey(HTTP.CONTENT_TYPE)) { + mediaType = MediaType.valueOf(headers.get(HTTP.CONTENT_TYPE)); } else { mediaType = MediaType.TEXT_PLAIN_TYPE; } @@ -115,7 +115,7 @@ private void addParam(MultipartBody.Builder builder) { if (null != params && !params.isEmpty()) { params.forEach((k, v) -> builder.addPart(Headers.of( - Header.CONTENT_DISPOSITION, + HTTP.CONTENT_DISPOSITION, "form-data; name=" + k + Symbol.DOUBLE_QUOTES), RequestBody.create(null, v) ) diff --git a/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java b/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java index d1768bfcc1..a8e2a4fcdf 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/secure/CertificatePinner.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.io.ByteString; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.http.UnoUrl; import javax.net.ssl.SSLPeerUnverifiedException; @@ -208,8 +208,8 @@ static class Pin { Pin(String pattern, String pin) { this.pattern = pattern; this.canonicalHostname = pattern.startsWith(WILDCARD) - ? UnoUrl.get(HTTP.HTTP_PREFIX + pattern.substring(WILDCARD.length())).host() - : UnoUrl.get(HTTP.HTTP_PREFIX + pattern).host(); + ? UnoUrl.get(Protocol.HTTP_PREFIX + pattern.substring(WILDCARD.length())).host() + : UnoUrl.get(Protocol.HTTP_PREFIX + pattern).host(); if (pin.startsWith("sha1/")) { this.hashAlgorithm = "sha1/"; this.hash = ByteString.decodeBase64(pin.substring("sha1/".length())); diff --git a/bus-http/src/main/java/org/miaixz/bus/http/secure/NetAuthenticator.java b/bus-http/src/main/java/org/miaixz/bus/http/secure/NetAuthenticator.java index 6cb54a4b8c..4049cd6338 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/secure/NetAuthenticator.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/secure/NetAuthenticator.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.http.secure; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Request; import org.miaixz.bus.http.Response; import org.miaixz.bus.http.Route; @@ -75,7 +75,7 @@ public Request authenticate(Route route, Response response) throws IOException { String credential = Credentials.basic( auth.getUserName(), new String(auth.getPassword()), challenge.charset()); return request.newBuilder() - .header(proxyAuthorization ? Header.PROXY_AUTHENTICATE : Header.AUTHORIZATION, credential) + .header(proxyAuthorization ? HTTP.PROXY_AUTHENTICATE : HTTP.AUTHORIZATION, credential) .build(); } } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java b/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java index 3a052d9f07..171ac24db1 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/socket/RealWebSocket.java @@ -33,7 +33,6 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.http.*; @@ -208,10 +207,10 @@ public void connect(Httpd client) { .protocols(ONLY_HTTP1) .build(); final Request request = originalRequest.newBuilder() - .header(Header.UPGRADE, "websocket") - .header(Header.CONNECTION, Header.UPGRADE) - .header(Header.SEC_WEBSOCKET_KEY, key) - .header(Header.SEC_WEBSOCKET_VERSION, "13") + .header(HTTP.UPGRADE, "websocket") + .header(HTTP.CONNECTION, HTTP.UPGRADE) + .header(HTTP.SEC_WEBSOCKET_KEY, key) + .header(HTTP.SEC_WEBSOCKET_VERSION, "13") .build(); call = Internal.instance.newWebSocketCall(client, request); call.enqueue(new Callback() { @@ -253,19 +252,19 @@ void checkUpgradeSuccess(Response response, Exchange exchange) throws IOExceptio + response.code() + Symbol.SPACE + response.message() + Symbol.SINGLE_QUOTE); } - String headerConnection = response.header(Header.CONNECTION); - if (!Header.UPGRADE.equalsIgnoreCase(headerConnection)) { + String headerConnection = response.header(HTTP.CONNECTION); + if (!HTTP.UPGRADE.equalsIgnoreCase(headerConnection)) { throw new ProtocolException("Expected 'Connection' header value 'Upgrade' but was '" + headerConnection + Symbol.SINGLE_QUOTE); } - String headerUpgrade = response.header(Header.UPGRADE); + String headerUpgrade = response.header(HTTP.UPGRADE); if (!"websocket".equalsIgnoreCase(headerUpgrade)) { throw new ProtocolException( "Expected 'Upgrade' header value 'websocket' but was '" + headerUpgrade + Symbol.SINGLE_QUOTE); } - String headerAccept = response.header(Header.SEC_WEBSOCKET_ACCEPT); + String headerAccept = response.header(HTTP.SEC_WEBSOCKET_ACCEPT); String acceptExpected = ByteString.encodeUtf8(key + WebSocketProtocol.ACCEPT_MAGIC) .sha1().base64(); if (!acceptExpected.equals(headerAccept)) { diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Device.java b/bus-image/src/main/java/org/miaixz/bus/image/Device.java index 67be42fa75..05db3b144e 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Device.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Device.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.image.galaxy.Material; import org.miaixz.bus.image.galaxy.data.Code; import org.miaixz.bus.image.galaxy.data.Issuer; @@ -1203,7 +1203,7 @@ public SSLContext sslContext() throws GeneralSecurityException, IOException { if (null != ctx) return ctx; - ctx = SSLContext.getInstance(HTTP.TLS); + ctx = SSLContext.getInstance(Protocol.TLS.name); ctx.init(keyManagers(), trustManagers(), null); sslContext = ctx; return ctx; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Option.java b/bus-image/src/main/java/org/miaixz/bus/image/Option.java index 22ad8f6e0d..199bd1ce47 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Option.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Option.java @@ -29,7 +29,7 @@ import lombok.Getter; import lombok.Setter; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.image.metric.Connection; import org.miaixz.bus.image.metric.internal.pdu.ExtendedNegotiate; @@ -90,8 +90,8 @@ public Option(boolean tlsNeedClientAuth, String keystoreURL, String keystoreType "SSL_RSA_WITH_3DES_EDE_CBC_SHA" }, new String[]{ - HTTP.TLS_V_10, - HTTP.SSL_V_30 + Protocol.TLSv1.name, + Protocol.SSLv3.name }, tlsNeedClientAuth, keystoreURL, diff --git a/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/AbstractStowrs.java b/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/AbstractStowrs.java index 385292160c..75d26c087b 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/AbstractStowrs.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/AbstractStowrs.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.image.Tag; import org.miaixz.bus.image.UID; import org.miaixz.bus.image.galaxy.data.Attributes; @@ -186,10 +186,10 @@ protected HttpURLConnection buildConnection() throws IOException { httpPost.setRequestMethod("POST"); httpPost.setConnectTimeout(10000); httpPost.setReadTimeout(60000); - httpPost.setRequestProperty(Header.CONTENT_TYPE, + httpPost.setRequestProperty(HTTP.CONTENT_TYPE, MediaType.MULTIPART_RELATED + "; type=\"" + contentType + "\"; boundary=" + MULTIPART_BOUNDARY); - httpPost.setRequestProperty(Header.USER_AGENT, null == agentName ? "STOWRS" : agentName); - httpPost.setRequestProperty(Header.ACCEPT, + httpPost.setRequestProperty(HTTP.USER_AGENT, null == agentName ? "STOWRS" : agentName); + httpPost.setRequestProperty(HTTP.ACCEPT, contentType == MediaType.APPLICATION_DICOM_JSON ? MediaType.APPLICATION_DICOM_JSON : MediaType.APPLICATION_DICOM_XML); if (null != headers && !headers.isEmpty()) { @@ -222,7 +222,7 @@ protected void writeContentMarkers(DataOutputStream out) throws IOException { out.write(MultipartParser.Separator.BOUNDARY.getType()); out.writeBytes(MULTIPART_BOUNDARY); out.write(MultipartParser.Separator.FIELD.getType()); - out.writeBytes(Header.CONTENT_TYPE + ": "); + out.writeBytes(HTTP.CONTENT_TYPE + ": "); out.writeBytes(contentType); out.write(MultipartParser.Separator.HEADER.getType()); } diff --git a/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/StowrsSingleFile.java b/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/StowrsSingleFile.java index 98ca7cc6be..3e2e094653 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/StowrsSingleFile.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/galaxy/media/StowrsSingleFile.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.image.galaxy.media; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.image.Tag; import org.miaixz.bus.image.galaxy.data.Attributes; import org.miaixz.bus.image.galaxy.data.BulkData; @@ -115,10 +115,10 @@ public void uploadEncapsulatedDocument(Attributes metadata, File bulkDataFile, S out.writeBytes(MULTIPART_BOUNDARY); byte[] fsep = MultipartParser.Separator.FIELD.getType(); out.write(fsep); - out.writeBytes(Header.CONTENT_TYPE + ": "); + out.writeBytes(HTTP.CONTENT_TYPE + ": "); out.writeBytes(mdiaType); out.write(fsep); - out.writeBytes(Header.CONTENT_LOCATION + ": "); + out.writeBytes(HTTP.CONTENT_LOCATION + ": "); out.writeBytes(getContentLocation(metadata)); out.write(MultipartParser.Separator.HEADER.getType()); diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java index 1457fb5ce8..6ac55e269e 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java @@ -29,7 +29,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.image.Device; import java.util.ArrayList; @@ -178,7 +178,7 @@ private Connection firstInstalledConnection() { public StringBuilder getServiceURL(Connection conn) { return new StringBuilder(Normal._64) - .append(conn.isTls() ? HTTP.HTTPS_PREFIX : HTTP.HTTP_PREFIX) + .append(conn.isTls() ? Protocol.HTTPS_PREFIX : Protocol.HTTP_PREFIX) .append(conn.getHostname()) .append(Symbol.C_COLON) .append(conn.getPort()) diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/huawei/HuaweiSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/huawei/HuaweiSmsProvider.java index 23a73cd92b..26feee7347 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/huawei/HuaweiSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/huawei/HuaweiSmsProvider.java @@ -32,7 +32,7 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.DateKit; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; @@ -93,8 +93,8 @@ public Message send(HuaweiMaterial entity) { bodys.put("signature", entity.getSignature()); Map headers = new HashMap<>(); - headers.put(Header.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); - headers.put(Header.AUTHORIZATION, AUTH_HEADER_VALUE); + headers.put(HTTP.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); + headers.put(HTTP.AUTHORIZATION, AUTH_HEADER_VALUE); headers.put("X-WSSE", buildWsseHeader()); String response = Httpx.post(this.getUrl(entity), bodys, headers); diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java index 89f661c9e9..de4cd50503 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jdcloud/JdcloudSmsProvider.java @@ -29,7 +29,6 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.net.HTTP; -import org.miaixz.bus.core.net.Header; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.notify.Context; @@ -62,7 +61,7 @@ public Message send(JdcloudMaterial entity) { bodys.put("signId", entity.getSignature()); Map headers = new HashMap<>(); - headers.put(Header.CONTENT_TYPE, MediaType.APPLICATION_JSON); + headers.put(HTTP.CONTENT_TYPE, MediaType.APPLICATION_JSON); String response = Httpx.post(this.getUrl(entity), bodys, headers); int status = JsonKit.getValue(response, "statusCode"); diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jpush/JpushSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jpush/JpushSmsProvider.java index 215caea941..a0570f2606 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jpush/JpushSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/jpush/JpushSmsProvider.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.extra.json.JsonKit; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.notify.Context; @@ -64,8 +64,8 @@ public Message send(JpushMaterial entity) { bodys.put("temp_para", entity.getParams()); Map headers = new HashMap<>(); - headers.put(Header.CONTENT_TYPE, MediaType.APPLICATION_JSON); - headers.put(Header.AUTHORIZATION, "Basic " + getSign()); + headers.put(HTTP.CONTENT_TYPE, MediaType.APPLICATION_JSON); + headers.put(HTTP.AUTHORIZATION, "Basic " + getSign()); String response = Httpx.post(this.getUrl(entity), bodys, headers); boolean succeed = Objects.equals(JsonKit.getValue(response, "success_count"), 0); diff --git a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/upyun/UpyunSmsProvider.java b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/upyun/UpyunSmsProvider.java index 665a943b5b..2a78109501 100644 --- a/bus-notify/src/main/java/org/miaixz/bus/notify/metric/upyun/UpyunSmsProvider.java +++ b/bus-notify/src/main/java/org/miaixz/bus/notify/metric/upyun/UpyunSmsProvider.java @@ -28,7 +28,7 @@ package org.miaixz.bus.notify.metric.upyun; import org.miaixz.bus.core.lang.MediaType; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.xyz.CollKit; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.extra.json.JsonKit; @@ -63,8 +63,8 @@ public Message send(UpyunMaterial entity) { bodys.put("vars", StringKit.split(entity.getParams(), "|").toString()); Map headers = new HashMap<>(); - headers.put(Header.CONTENT_TYPE, MediaType.APPLICATION_JSON); - headers.put(Header.AUTHORIZATION, entity.getToken()); + headers.put(HTTP.CONTENT_TYPE, MediaType.APPLICATION_JSON); + headers.put(HTTP.AUTHORIZATION, entity.getToken()); String response = Httpx.post(this.getUrl(entity), bodys, headers); Collection list = JsonKit.toList(response, UpyunMaterial.MessageId.class); diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java index 7aa5a9c1be..7aa5399a96 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/Checker.java @@ -29,7 +29,7 @@ import org.miaixz.bus.cache.metric.ExtendCache; import org.miaixz.bus.core.lang.exception.AuthorizedException; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.oauth.magic.Callback; import org.miaixz.bus.oauth.magic.ErrorCode; @@ -84,21 +84,21 @@ public static void checkConfig(Context context, Complex complex) { if (StringKit.isEmpty(redirectUri)) { throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } - if (!HTTP.isHttp(redirectUri) && !HTTP.isHttps(redirectUri)) { + if (!Protocol.isHttp(redirectUri) && !Protocol.isHttps(redirectUri)) { throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } // facebook的回调地址必须为https的链接 - if (Registry.FACEBOOK == complex && !HTTP.isHttps(redirectUri)) { + if (Registry.FACEBOOK == complex && !Protocol.isHttps(redirectUri)) { // FacebookScope's redirect uri must use the HTTPS protocol throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } // 微软的回调地址必须为https的链接或者localhost,不允许使用http - if (Registry.MICROSOFT == complex && !HTTP.isHttpsOrLocalHost(redirectUri)) { + if (Registry.MICROSOFT == complex && !Protocol.isHttpsOrLocalHost(redirectUri)) { // MicrosoftScope's redirect uri must use the HTTPS or localhost throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } // 微软中国的回调地址必须为https的链接或者localhost,不允许使用http - if (Registry.MICROSOFT_CN == complex && !HTTP.isHttpsOrLocalHost(redirectUri)) { + if (Registry.MICROSOFT_CN == complex && !Protocol.isHttpsOrLocalHost(redirectUri)) { // MicrosoftScope's redirect uri must use the HTTPS or localhost throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), complex); } diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java index f1a17071a3..ca5162b253 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/alipay/AlipayProvider.java @@ -39,7 +39,7 @@ import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Gender; import org.miaixz.bus.core.lang.exception.AuthorizedException; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.oauth.Builder; import org.miaixz.bus.oauth.Checker; @@ -109,7 +109,7 @@ protected void check(Context context) { } // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1 - if (HTTP.isLocalHost(context.getRedirectUri())) { + if (Protocol.isLocalHost(context.getRedirectUri())) { // The redirect uri of alipay is forbidden to use localhost or 127.0.0.1 throw new AuthorizedException(ErrorCode.ILLEGAL_REDIRECT_URI.getCode(), Registry.ALIPAY); } diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/amazon/AmazonProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/amazon/AmazonProvider.java index c4be08ac95..99a820fc6f 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/amazon/AmazonProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/amazon/AmazonProvider.java @@ -34,7 +34,7 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.AuthorizedException; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.RandomKit; import org.miaixz.bus.http.Httpx; @@ -165,8 +165,8 @@ public Message refresh(AccToken accToken) { private AccToken getToken(Map param, String url) { Map header = new HashMap<>(); - header.put(Header.HOST, "api.amazon.com"); - header.put(Header.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED + ";charset=UTF-8"); + header.put(HTTP.HOST, "api.amazon.com"); + header.put(HTTP.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED + ";charset=UTF-8"); String response = Httpx.post(url, param, header); JSONObject jsonObject = JSONObject.parseObject(response); @@ -201,8 +201,8 @@ protected Material getUserInfo(AccToken accToken) { String accessToken = accToken.getAccessToken(); this.checkToken(accessToken); Map header = new HashMap<>(); - header.put(Header.HOST, "api.amazon.com"); - header.put(Header.AUTHORIZATION, "bearer " + accessToken); + header.put(HTTP.HOST, "api.amazon.com"); + header.put(HTTP.AUTHORIZATION, "bearer " + accessToken); String userInfo = Httpx.get(this.complex.userInfo(), new HashMap<>(0), header); JSONObject jsonObject = JSONObject.parseObject(userInfo); diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/eleme/ElemeProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/eleme/ElemeProvider.java index 4870dbf68d..83b716565d 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/eleme/ElemeProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/eleme/ElemeProvider.java @@ -36,7 +36,7 @@ import org.miaixz.bus.core.lang.MediaType; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.AuthorizedException; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.oauth.Builder; import org.miaixz.bus.oauth.Context; @@ -198,10 +198,10 @@ private String getBasic(String appKey, String appSecret) { private Map buildHeader(String contentType, String requestId, boolean auth) { Map header = new HashMap<>(); - header.put(Header.ACCEPT, "text/xml,text/javascript,text/html"); - header.put(Header.CONTENT_TYPE, contentType); - header.put(Header.ACCEPT_ENCODING, "gzip"); - header.put(Header.USER_AGENT, "eleme-openapi-java-sdk"); + header.put(HTTP.ACCEPT, "text/xml,text/javascript,text/html"); + header.put(HTTP.CONTENT_TYPE, contentType); + header.put(HTTP.ACCEPT_ENCODING, "gzip"); + header.put(HTTP.USER_AGENT, "eleme-openapi-java-sdk"); header.put("x-eleme-requestid", requestId); if (auth) { diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/linkedin/LinkedinProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/linkedin/LinkedinProvider.java index 67a7e17a76..ad475597ff 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/linkedin/LinkedinProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/linkedin/LinkedinProvider.java @@ -34,7 +34,7 @@ import org.miaixz.bus.core.lang.Gender; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.AuthorizedException; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.oauth.Builder; import org.miaixz.bus.oauth.Context; @@ -205,7 +205,7 @@ private void checkResponse(JSONObject object) { private AccToken getToken(String accessTokenUrl) { Map header = new HashMap(); header.put("Host", "www.linkedin.com"); - header.put(Header.CONTENT_TYPE, "application/x-www-form-urlencoded"); + header.put(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded"); String response = Httpx.post(accessTokenUrl, null, header); JSONObject accessTokenObject = JSONObject.parseObject(response); diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/stackoverflow/StackOverflowProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/stackoverflow/StackOverflowProvider.java index 48b2408a4a..e3f4e09e01 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/stackoverflow/StackOverflowProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/stackoverflow/StackOverflowProvider.java @@ -33,7 +33,7 @@ import org.miaixz.bus.core.lang.Gender; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.AuthorizedException; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.url.UrlDecoder; import org.miaixz.bus.http.Httpx; import org.miaixz.bus.oauth.Builder; @@ -70,7 +70,7 @@ protected AccToken getAccessToken(Callback callback) { UrlDecoder.decodeMap(accessTokenUrl, Charset.DEFAULT_UTF_8).forEach(form::put); Map header = new HashMap<>(); - header.put(Header.CONTENT_TYPE, "application/x-www-form-urlencoded"); + header.put(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded"); String response = Httpx.post(accessTokenUrl, form, header); JSONObject accessTokenObject = JSONObject.parseObject(response); diff --git a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/twitter/TwitterProvider.java b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/twitter/TwitterProvider.java index dbec155bf7..f077ee17ca 100644 --- a/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/twitter/TwitterProvider.java +++ b/bus-oauth/src/main/java/org/miaixz/bus/oauth/metric/twitter/TwitterProvider.java @@ -33,7 +33,7 @@ import org.miaixz.bus.core.lang.Algorithm; import org.miaixz.bus.core.lang.Charset; import org.miaixz.bus.core.lang.Symbol; -import org.miaixz.bus.core.net.Header; +import org.miaixz.bus.core.net.HTTP; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.http.Httpx; @@ -163,7 +163,7 @@ protected AccToken getAccessToken(Callback callback) { Map header = new HashMap<>(); header.put("Authorization", buildHeader(headerMap)); - header.put(Header.CONTENT_TYPE, "application/x-www-form-urlencoded"); + header.put(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded"); Map form = new HashMap<>(3); form.put("oauth_verifier", callback.getOauth_verifier()); diff --git a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java index f9b80cf4a2..ddeb2fa65b 100644 --- a/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java +++ b/bus-pay/src/main/java/org/miaixz/bus/pay/metric/AbstractProvider.java @@ -35,7 +35,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.PaymentException; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.net.tls.SSLContextBuilder; import org.miaixz.bus.core.net.url.UrlEncoder; import org.miaixz.bus.core.xyz.FileKit; @@ -289,7 +289,7 @@ public static Message post(String url, Map formMap, Map Date: Thu, 20 Jun 2024 10:44:34 +0800 Subject: [PATCH 08/20] fix protocol --- .../bus/core/compare/VersionCompare.java | 3 +- .../bus/core/compare/WindowsCompare.java | 110 ++++++++++++++++++ .../java/org/miaixz/bus/core/net/HTTP.java | 35 +++++- .../org/miaixz/bus/core/net/Protocol.java | 25 +++- .../bus/http/metric/http/StatusLine.java | 2 +- .../main/java/org/miaixz/bus/image/Node.java | 4 +- .../bus/image/metric/ApplicationEntity.java | 3 +- .../miaixz/bus/image/metric/Connection.java | 27 ++--- .../bus/image/metric/WebApplication.java | 2 +- .../acquire/HL7ApplicationExtension.java | 4 +- .../metric/acquire/HL7DeviceExtension.java | 3 +- .../metric/internal/hl7/HL7Application.java | 3 +- .../org/miaixz/bus/image/plugin/HL7Rcv.java | 3 +- .../java/org/miaixz/bus/socket/Context.java | 14 +-- .../socket/{Protocol.java => Message.java} | 8 +- .../java/org/miaixz/bus/socket/Session.java | 8 +- .../java/org/miaixz/bus/socket/Status.java | 2 +- .../miaixz/bus/socket/accord/AioClient.java | 8 +- .../miaixz/bus/socket/accord/AioServer.java | 24 ++-- .../bus/socket/accord/UdpBootstrap.java | 10 +- .../kcp/{KcpProtocol.java => KcpMessage.java} | 4 +- .../ByteArrayMessage.java} | 4 +- .../FixedLengthBytesMessage.java} | 6 +- .../StringMessage.java} | 10 +- .../{protocol => message}/package-info.java | 2 +- .../org/miaixz/bus/socket/package-info.java | 2 +- .../starter/socket/SocketQuickService.java | 6 +- 27 files changed, 235 insertions(+), 97 deletions(-) create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/compare/WindowsCompare.java rename bus-socket/src/main/java/org/miaixz/bus/socket/{Protocol.java => Message.java} (88%) rename bus-socket/src/main/java/org/miaixz/bus/socket/accord/kcp/{KcpProtocol.java => KcpMessage.java} (96%) rename bus-socket/src/main/java/org/miaixz/bus/socket/metric/{protocol/ByteArrayProtocol.java => message/ByteArrayMessage.java} (95%) rename bus-socket/src/main/java/org/miaixz/bus/socket/metric/{protocol/FixedLengthBytesProtocol.java => message/FixedLengthBytesMessage.java} (94%) rename bus-socket/src/main/java/org/miaixz/bus/socket/metric/{protocol/StringProtocol.java => message/StringMessage.java} (95%) rename bus-socket/src/main/java/org/miaixz/bus/socket/metric/{protocol => message}/package-info.java (97%) diff --git a/bus-core/src/main/java/org/miaixz/bus/core/compare/VersionCompare.java b/bus-core/src/main/java/org/miaixz/bus/core/compare/VersionCompare.java index cf6a1df9a1..d435090b40 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/compare/VersionCompare.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/compare/VersionCompare.java @@ -44,11 +44,12 @@ */ public class VersionCompare extends NullCompare implements Serializable { + private static final long serialVersionUID = -1L; + /** * 单例 */ public static final VersionCompare INSTANCE = new VersionCompare(); - private static final long serialVersionUID = -1L; /** * 默认构造 diff --git a/bus-core/src/main/java/org/miaixz/bus/core/compare/WindowsCompare.java b/bus-core/src/main/java/org/miaixz/bus/core/compare/WindowsCompare.java new file mode 100644 index 0000000000..51bf88cfd0 --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/compare/WindowsCompare.java @@ -0,0 +1,110 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +package org.miaixz.bus.core.compare; + +import org.miaixz.bus.core.xyz.StringKit; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Windows 资源管理器风格字符串比较器 + * 此比较器模拟了 Windows 资源管理器的文件名排序方式,可得到与其相同的排序结果。 + * + * 假设有一个数组,包含若干个文件名 {@code {"xyz2.doc", "xyz1.doc", "xyz12.doc"}}
+ *调用 {@code Arrays.sort(filenames);} 时,得到 {@code {"xyz1.doc", "xyz12.doc", "xyz2.doc" }}
+ *调用 {@code Arrays.sort(filenames, new WindowsCompare());} 时,得到 {@code {"xyz1.doc", "xyz2.doc", "xyz12.doc" }},这与在资源管理器中看到的相同
+ * + * @author Kimi Liu + * @see Java - Sort Strings like Windows Explorer + * @since Java 17+ + */ +public class WindowsCompare implements Comparator{ + + /** + * 单例 + */ + public static final WindowsCompare INSTANCE = new WindowsCompare(); + + @Override + public int compare(final CharSequence str1, final CharSequence str2) { + final Iterator i1 = splitStringPreserveDelimiter(str1).iterator(); + final Iterator i2 = splitStringPreserveDelimiter(str2).iterator(); + while (true) { + // 直到这里都是平等的 + if (!i1.hasNext() && !i2.hasNext()) { + return 0; + } + // i1 没有其他部分 -> 排在最前面 + if (!i1.hasNext()) { + return -1; + } + // i1 的部分比 i2 多 -> 紧随其后 + if (!i2.hasNext()) { + return 1; + } + + final String data1 = i1.next(); + final String data2 = i2.next(); + int result; + try { + // 如果两个数据都是数字,则比较数字 + result = Long.compare(Long.parseLong(data1), Long.parseLong(data2)); + // 如果数字相等,则较长者优先 + if (result == 0) { + result = -Integer.compare(data1.length(), data2.length()); + } + } catch (final NumberFormatException ex) { + // 比较文本不区分大小写 + result = data1.compareToIgnoreCase(data2); + } + + if (result != 0) { + return result; + } + } + } + + private List splitStringPreserveDelimiter(final CharSequence str) { + final Matcher matcher = Pattern.compile("\\d+|\\.|\\s").matcher(str); + final List list = new ArrayList<>(); + int pos = 0; + while (matcher.find()) { + list.add(StringKit.sub(str, pos, matcher.start())); + list.add(matcher.group()); + pos = matcher.end(); + } + list.add(StringKit.subSuf(str, pos)); + return list; + } + +} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java b/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java index 170106a7b8..29608adde4 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/HTTP.java @@ -1,3 +1,30 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ package org.miaixz.bus.core.net; /** @@ -529,19 +556,19 @@ public class HTTP { public static final String TARGET_AUTHORITY_UTF8 = ":authority"; /** - * The form data + * The use form data */ public static final String FORM = "form"; /** - * The json data + * The use json data */ public static final String JSON = "json"; /** - * The xml data + * The use xml data */ public static final String XML = "xml"; /** - * The protobuf data + * The use protobuf data */ public static final String PROTOBUF = "protobuf"; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/net/Protocol.java b/bus-core/src/main/java/org/miaixz/bus/core/net/Protocol.java index 1a9fa7c834..d955a0df5e 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/net/Protocol.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/net/Protocol.java @@ -47,6 +47,10 @@ public enum Protocol { * TCP协议 */ TCP("tcp"), + /** + * + */ + UDP("udp"), /** * http协议 */ @@ -54,12 +58,12 @@ public enum Protocol { /** * 过时的plaintext,默认情况下不使用持久套接字 */ - HTTP_1_0("http/1.0"), + HTTP_1_0("HTTP/1.0"), /** * 包含持久连接的plaintext * 此版本的Httpd实现了RFC 7230,并跟踪对该规范的修订 */ - HTTP_1_1("http/1.1"), + HTTP_1_1("HTTP/1.1"), /** * IETF的二进制框架协议,包括头压缩、在同一个套接字上多路复用多个请求和服务器推送 * HTTP/1.1语义是在HTTP/2上分层的 @@ -93,11 +97,11 @@ public enum Protocol { */ SOAP_1_2("SOAP 1.2 Protocol"), /** - * SOAP 1.2协议 + *the ws */ WS("ws"), /** - * SOAP 1.2协议 + * the wss */ WSS("wss"), /** @@ -135,7 +139,15 @@ public enum Protocol { /** * Supports RFC 5246: TLS version 1.3 */ - TLSv1_3("TLSv1.3"); + TLSv1_3("TLSv1.3"), + /** + * + */ + DICOM("dicom"), + /** + * + */ + HL7("hl7"); /** * The prefix http @@ -268,6 +280,9 @@ public static boolean isHttpsOrLocalHost(String url) { return isHttps(url) || isLocalHost(url); } + public boolean isTcp() { + return this != UDP; + } /** * 返回用于识别ALPN协议的字符串,如“http/1.1”、“spdy/3.1”或“http/2.0”. diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StatusLine.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StatusLine.java index 254d49721b..88c899c37b 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StatusLine.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/http/StatusLine.java @@ -107,7 +107,7 @@ public static StatusLine parse(String statusLine) throws IOException { @Override public String toString() { StringBuilder result = new StringBuilder(); - result.append(protocol == Protocol.HTTP_1_0 ? "HTTP/1.0" : "HTTP/1.1"); + result.append(protocol == Protocol.HTTP_1_0 ? Protocol.HTTP_1_0.name : Protocol.HTTP_1_1.name); result.append(Symbol.C_SPACE).append(code); if (null != message) { result.append(Symbol.C_SPACE).append(message); diff --git a/bus-image/src/main/java/org/miaixz/bus/image/Node.java b/bus-image/src/main/java/org/miaixz/bus/image/Node.java index 3daa1967b1..0ff6f202f4 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/Node.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/Node.java @@ -30,7 +30,7 @@ import lombok.Getter; import lombok.Setter; import org.miaixz.bus.core.lang.Normal; -import org.miaixz.bus.core.net.HTTP; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.StringKit; import org.miaixz.bus.image.metric.Association; import org.miaixz.bus.logger.Logger; @@ -88,7 +88,7 @@ public static String convertToIP(String hostname) { } catch (UnknownHostException e) { Logger.error("Cannot resolve hostname", e); } - return StringKit.hasText(hostname) ? hostname : HTTP.HOST_IPV4; + return StringKit.hasText(hostname) ? hostname : Protocol.HOST_IPV4; } public static Node buildLocalDicomNode(Association as) { diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/ApplicationEntity.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/ApplicationEntity.java index 3120bdc81c..b87e445f82 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/ApplicationEntity.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/ApplicationEntity.java @@ -30,6 +30,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.image.Device; import org.miaixz.bus.image.Dimse; @@ -463,7 +464,7 @@ void onDimseRQ(Association as, Presentation pc, Dimse cmd, } public void addConnection(Connection conn) { - if (conn.getProtocol() != Connection.Protocol.DICOM) + if (conn.getProtocol() != Protocol.DICOM) throw new IllegalArgumentException( "protocol != DICOM - " + conn.getProtocol()); diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/Connection.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/Connection.java index fefd5aa00f..d194024714 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/Connection.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/Connection.java @@ -32,6 +32,7 @@ import org.miaixz.bus.core.lang.Normal; import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.image.Device; import org.miaixz.bus.image.galaxy.Material; @@ -70,10 +71,8 @@ public class Connection implements Serializable { // 适应SunJSSE TLS应用程序数据长度16408 public static final String TLS_RSA_WITH_AES_128_CBC_SHA = "TLS_RSA_WITH_AES_128_CBC_SHA"; public static final String[] DEFAULT_TLS_PROTOCOLS = {"TLSv1.2", "TLSv1.1", "TLSv1"}; - private static final EnumMap tcpHandlers = - new EnumMap (Protocol.class); - private static final EnumMap udpHandlers = - new EnumMap (Protocol.class); + private static final EnumMap tcpHandlers = new EnumMap<>(Protocol.class); + private static final EnumMap udpHandlers = new EnumMap<>(Protocol.class); static { registerTCPProtocolHandler(Protocol.DICOM, AdvancedHandler.INSTANCE); @@ -937,7 +936,7 @@ public synchronized boolean bind() throws IOException, GeneralSecurityException throw new IllegalStateException("Not attached to Device"); if (isListening()) throw new IllegalStateException("Already listening - " + listener); - if (protocol.isTCP()) { + if (protocol.isTcp()) { TCPHandler handler = tcpHandlers.get(protocol); if (null == handler) { Logger.info("No TCP Protocol Handler for protocol {}", protocol); @@ -980,7 +979,7 @@ public synchronized void unbind() { public Socket connect(Connection remoteConn) throws IOException, InternalException, GeneralSecurityException { checkInstalled(); - if (!protocol.isTCP()) + if (!protocol.isTcp()) throw new IllegalStateException("Not a TCP Connection"); checkCompatible(remoteConn); SocketAddress bindPoint = getClientBindPoint(); @@ -1038,7 +1037,7 @@ public Socket connect(Connection remoteConn) public DatagramSocket createDatagramSocket() throws IOException { checkInstalled(); - if (protocol.isTCP()) + if (protocol.isTcp()) throw new IllegalStateException("Not a UDP Connection"); DatagramSocket ds = new DatagramSocket(getClientBindPoint()); @@ -1106,7 +1105,7 @@ public boolean isCompatible(Connection remoteConn) { if (remoteConn.protocol != protocol) return false; - if (!protocol.isTCP()) + if (!protocol.isTcp()) return true; if (!isTls()) @@ -1165,18 +1164,6 @@ public void reconfigure(Connection from) { setInstalled(from.installed); } - public enum Protocol { - DICOM, HL7, SYSLOG_TLS, SYSLOG_UDP, HTTP; - - public boolean isTCP() { - return this != SYSLOG_UDP; - } - - public boolean isSyslog() { - return this == SYSLOG_TLS || this == SYSLOG_UDP; - } - } - private static class HTTPResponse extends ByteArrayOutputStream { private final String rsp; diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java index 6ac55e269e..3556d77e13 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/WebApplication.java @@ -155,7 +155,7 @@ public KeycloakClient getKeycloakClient() { } public void addConnection(Connection conn) { - if (conn.getProtocol() != Connection.Protocol.HTTP) + if (conn.getProtocol() != Protocol.HTTP) throw new IllegalArgumentException( "Web Application does not support protocol " + conn.getProtocol()); if (null != device && device != conn.getDevice()) diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/acquire/HL7ApplicationExtension.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/acquire/HL7ApplicationExtension.java index 749ca6d810..adf5cde47c 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/acquire/HL7ApplicationExtension.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/acquire/HL7ApplicationExtension.java @@ -45,9 +45,7 @@ public final HL7Application getHL7Application() { public void setHL7Application(HL7Application hl7App) { if (null != hl7App && null != this.hl7App) - throw new IllegalStateException( - "already owned by HL7 Application: " - + hl7App.getApplicationName()); + throw new IllegalStateException("already owned by HL7 Application: " + hl7App.getApplicationName()); this.hl7App = hl7App; } diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/acquire/HL7DeviceExtension.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/acquire/HL7DeviceExtension.java index 2000c06b0b..675e24d808 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/acquire/HL7DeviceExtension.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/acquire/HL7DeviceExtension.java @@ -28,6 +28,7 @@ package org.miaixz.bus.image.metric.acquire; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.image.Builder; import org.miaixz.bus.image.metric.Connection; import org.miaixz.bus.image.metric.internal.hl7.*; @@ -43,7 +44,7 @@ public class HL7DeviceExtension extends DeviceExtension { static { - Connection.registerTCPProtocolHandler(Connection.Protocol.HL7, HL7Handler.INSTANCE); + Connection.registerTCPProtocolHandler(Protocol.HL7, HL7Handler.INSTANCE); } private final LinkedHashMap hl7apps = new LinkedHashMap<>(); diff --git a/bus-image/src/main/java/org/miaixz/bus/image/metric/internal/hl7/HL7Application.java b/bus-image/src/main/java/org/miaixz/bus/image/metric/internal/hl7/HL7Application.java index 0b906dec46..1cd2d74390 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/metric/internal/hl7/HL7Application.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/metric/internal/hl7/HL7Application.java @@ -29,6 +29,7 @@ import org.miaixz.bus.core.lang.Symbol; import org.miaixz.bus.core.lang.exception.InternalException; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.image.Builder; import org.miaixz.bus.image.Device; import org.miaixz.bus.image.metric.Compatible; @@ -202,7 +203,7 @@ public final void setHL7MessageListener(HL7MessageListener listener) { } public void addConnection(Connection conn) { - if (conn.getProtocol() != Connection.Protocol.HL7) + if (conn.getProtocol() != Protocol.HL7) throw new IllegalArgumentException( "protocol != HL7 - " + conn.getProtocol()); diff --git a/bus-image/src/main/java/org/miaixz/bus/image/plugin/HL7Rcv.java b/bus-image/src/main/java/org/miaixz/bus/image/plugin/HL7Rcv.java index 9d49696074..9c2f039b9b 100755 --- a/bus-image/src/main/java/org/miaixz/bus/image/plugin/HL7Rcv.java +++ b/bus-image/src/main/java/org/miaixz/bus/image/plugin/HL7Rcv.java @@ -28,6 +28,7 @@ package org.miaixz.bus.image.plugin; import org.miaixz.bus.core.lang.Symbol; +import org.miaixz.bus.core.net.Protocol; import org.miaixz.bus.image.Device; import org.miaixz.bus.image.galaxy.io.SAXTransformer; import org.miaixz.bus.image.metric.Connection; @@ -74,7 +75,7 @@ public class HL7Rcv { }; public HL7Rcv() { - conn.setProtocol(Connection.Protocol.HL7); + conn.setProtocol(Protocol.HL7); device.addDeviceExtension(hl7Ext); device.addConnection(conn); hl7Ext.addHL7Application(hl7App); diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/Context.java b/bus-socket/src/main/java/org/miaixz/bus/socket/Context.java index 2fc8605f68..52dff8dd1c 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/Context.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/Context.java @@ -77,9 +77,9 @@ public final class Context { */ private Handler processor; /** - * 协议编解码 + * 消息编解码 */ - private Protocol protocol; + private Message message; /** * Socket 配置 @@ -144,12 +144,12 @@ public Monitor getMonitor() { return monitor; } - public Protocol getProtocol() { - return protocol; + public Message getProtocol() { + return message; } - public void setProtocol(Protocol protocol) { - this.protocol = protocol; + public void setProtocol(Message message) { + this.message = message; } public Handler getProcessor() { @@ -233,7 +233,7 @@ public String toString() { ", port=" + port + ", backlog=" + backlog + ", processor=" + processor + - ", protocol=" + protocol + + ", protocol=" + message + ", socketOptions=" + socketOptions + ", threadNum=" + threadNum + ", bufferFactory=" + bufferFactory + diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/Protocol.java b/bus-socket/src/main/java/org/miaixz/bus/socket/Message.java similarity index 88% rename from bus-socket/src/main/java/org/miaixz/bus/socket/Protocol.java rename to bus-socket/src/main/java/org/miaixz/bus/socket/Message.java index 451b331a85..b3c8e33054 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/Protocol.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/Message.java @@ -33,17 +33,17 @@ import java.nio.ByteBuffer; /** - * 消息传输采用的协议 + * 消息传输采用的模式 * - * 根据通信双方约定的协议规范实现{@code Protocol}接口,使用时将该实现类注册至服务启动类{@link AioClient}、{@link AioServer} + * 根据通信双方约定的模式规范实现{@code Message}接口,使用时将该实现类注册至服务启动类{@link AioClient}、{@link AioServer} *
- * 注意:框架本身的所有Socket链路复用同一个Protocol,请勿在其实现类的成员变量中存储特定链路的数据。 + * 注意:框架本身的所有Socket链路复用同一个Message,请勿在其实现类的成员变量中存储特定链路的数据。 * * @param消息对象实体类型 * @author Kimi Liu * @since Java 17+ */ -public interface Protocol { +public interface Message { /** * 对于从Socket流中获取到的数据采用当前Protocol的实现类协议进行解析。 diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/Session.java b/bus-socket/src/main/java/org/miaixz/bus/socket/Session.java index 1ff4d6bf87..c7b27f67d5 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/Session.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/Session.java @@ -88,7 +88,7 @@ public abstract class Session { /** * 强制关闭当前Session - * 若此时还存留待输出的数据,则会导致该部分数据丢失
+ * 若此时还存留待输出的数据,则会导致该部分数据丢失 */ public final void close() { close(true); @@ -166,13 +166,9 @@ public final void setAttachment(A attachment) { public abstract InetSocketAddress getRemoteAddress() throws IOException; /** - * 获得数据输入流对象。 - *+ * 获得数据输入流对象 * faster模式下调用该方法会触发UnsupportedOperationException异常。 - *
- ** Handler采用异步处理消息的方式时,调用该方法可能会出现异常。 - *
* * @return 输入流 * @throws IOException IO异常 diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/Status.java b/bus-socket/src/main/java/org/miaixz/bus/socket/Status.java index 822b1791d7..f72179e9b7 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/Status.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/Status.java @@ -62,7 +62,7 @@ public enum Status { PROCESS_EXCEPTION, /** * 协议解码异常 - * 执行{@link Protocol#decode(ByteBuffer, Session)}期间发生未捕获的异常 + * 执行{@link Message#decode(ByteBuffer, Session)}期间发生未捕获的异常 */ DECODE_EXCEPTION, /** diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioClient.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioClient.java index c2823869f3..8980701640 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioClient.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioClient.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.socket.Context; import org.miaixz.bus.socket.Handler; -import org.miaixz.bus.socket.Protocol; +import org.miaixz.bus.socket.Message; import org.miaixz.bus.socket.Session; import org.miaixz.bus.socket.buffer.BufferFactory; import org.miaixz.bus.socket.buffer.BufferPagePool; @@ -99,13 +99,13 @@ public final class AioClient { * * @param host 远程服务器地址 * @param port 远程服务器端口号 - * @param protocol 协议编解码 + * @param message 协议编解码 * @param handler 消息处理器 */ - publicAioClient(String host, int port, Protocol protocol, Handler handler) { + public AioClient(String host, int port, Message message, Handler handler) { context.setHost(host); context.setPort(port); - context.setProtocol(protocol); + context.setProtocol(message); context.setProcessor(handler); } diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioServer.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioServer.java index 8666993566..835b6f35f3 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioServer.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioServer.java @@ -30,7 +30,7 @@ import org.miaixz.bus.core.xyz.IoKit; import org.miaixz.bus.socket.Context; import org.miaixz.bus.socket.Handler; -import org.miaixz.bus.socket.Protocol; +import org.miaixz.bus.socket.Message; import org.miaixz.bus.socket.Status; import org.miaixz.bus.socket.buffer.*; import org.miaixz.bus.socket.metric.channels.AsynchronousChannelProvider; @@ -87,25 +87,25 @@ public final class AioServer { /** * 设置服务端启动必要参数配置 * - * @param port 绑定服务端口号 - * @param protocol 协议编解码 - * @param handler 消息处理器 + * @param port 绑定服务端口号 + * @param message 协议编解码 + * @param handler 消息处理器 */ - public AioServer(int port, Protocol protocol, Handler handler) { + public AioServer(int port, Message message, Handler handler) { context.setPort(port); - context.setProtocol(protocol); + context.setProtocol(message); context.setProcessor(handler); context.setThreadNum(Runtime.getRuntime().availableProcessors()); } /** - * @param host 绑定服务端Host地址 - * @param port 绑定服务端口号 - * @param protocol 协议编解码 - * @param handler 消息处理器 + * @param host 绑定服务端Host地址 + * @param port 绑定服务端口号 + * @param message 协议编解码 + * @param handler 消息处理器 */ - public AioServer(String host, int port, Protocol protocol, Handler handler) { - this(port, protocol, handler); + public AioServer(String host, int port, Message message, Handler handler) { + this(port, message, handler); context.setHost(host); } diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpBootstrap.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpBootstrap.java index 72423ad029..3b8981a1de 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpBootstrap.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpBootstrap.java @@ -29,7 +29,7 @@ import org.miaixz.bus.socket.Context; import org.miaixz.bus.socket.Handler; -import org.miaixz.bus.socket.Protocol; +import org.miaixz.bus.socket.Message; import org.miaixz.bus.socket.Worker; import org.miaixz.bus.socket.buffer.BufferFactory; import org.miaixz.bus.socket.buffer.BufferPagePool; @@ -59,13 +59,13 @@ public class UdpBootstrap { private boolean innerWorker = false; - public UdpBootstrap(Protocol protocol, Handler handler, Worker worker) { - this(protocol, handler); + public UdpBootstrap(Message message, Handler handler, Worker worker) { + this(message, handler); this.worker = worker; } - public UdpBootstrap(Protocol protocol, Handler handler) { - context.setProtocol(protocol); + public UdpBootstrap(Message message, Handler handler) { + context.setProtocol(message); context.setProcessor(handler); } diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/kcp/KcpProtocol.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/kcp/KcpMessage.java similarity index 96% rename from bus-socket/src/main/java/org/miaixz/bus/socket/accord/kcp/KcpProtocol.java rename to bus-socket/src/main/java/org/miaixz/bus/socket/accord/kcp/KcpMessage.java index c09bcfbdaf..5ebbe6bbd5 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/kcp/KcpProtocol.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/kcp/KcpMessage.java @@ -27,7 +27,7 @@ */ package org.miaixz.bus.socket.accord.kcp; -import org.miaixz.bus.socket.Protocol; +import org.miaixz.bus.socket.Message; import org.miaixz.bus.socket.Session; import java.nio.ByteBuffer; @@ -36,7 +36,7 @@ * @author Kimi Liu * @since Java 17+ */ -public class KcpProtocol implements Protocol { +public class KcpMessage implements Message { @Override public KcpPacket decode(ByteBuffer readBuffer, Session session) { diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/ByteArrayProtocol.java b/bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/ByteArrayMessage.java similarity index 95% rename from bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/ByteArrayProtocol.java rename to bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/ByteArrayMessage.java index 9a1624edeb..24625e9b73 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/ByteArrayProtocol.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/ByteArrayMessage.java @@ -25,7 +25,7 @@ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */ -package org.miaixz.bus.socket.metric.protocol; +package org.miaixz.bus.socket.metric.message; import org.miaixz.bus.socket.Session; @@ -35,7 +35,7 @@ * @author Kimi Liu * @since Java 17+ */ -public class ByteArrayProtocol extends FixedLengthBytesProtocol { +public class ByteArrayMessage extends FixedLengthBytesMessage { @Override protected byte[] decode(byte[] bytes, Session session) { diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/FixedLengthBytesProtocol.java b/bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/FixedLengthBytesMessage.java similarity index 94% rename from bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/FixedLengthBytesProtocol.java rename to bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/FixedLengthBytesMessage.java index 9c82f2594c..5893db4d17 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/FixedLengthBytesProtocol.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/FixedLengthBytesMessage.java @@ -25,9 +25,9 @@ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */ -package org.miaixz.bus.socket.metric.protocol; +package org.miaixz.bus.socket.metric.message; -import org.miaixz.bus.socket.Protocol; +import org.miaixz.bus.socket.Message; import org.miaixz.bus.socket.Session; import java.nio.ByteBuffer; @@ -38,7 +38,7 @@ * @author Kimi Liu * @since Java 17+ */ -public abstract class FixedLengthBytesProtocol implements Protocol { +public abstract class FixedLengthBytesMessage implements Message { @Override public final T decode(ByteBuffer readBuffer, Session session) { diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/StringProtocol.java b/bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/StringMessage.java similarity index 95% rename from bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/StringProtocol.java rename to bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/StringMessage.java index fb0d8067e0..f7ba37d415 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/StringProtocol.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/StringMessage.java @@ -25,9 +25,9 @@ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */ -package org.miaixz.bus.socket.metric.protocol; +package org.miaixz.bus.socket.metric.message; -import org.miaixz.bus.socket.Protocol; +import org.miaixz.bus.socket.Message; import org.miaixz.bus.socket.Session; import org.miaixz.bus.socket.metric.decoder.FixedLengthFrameDecoder; @@ -42,18 +42,18 @@ * @author Kimi Liu * @since Java 17+ */ -public class StringProtocol implements Protocol { +public class StringMessage implements Message { private final Charset charset; private final Map decoderMap = new ConcurrentHashMap<>(); private long lastClearTime = System.currentTimeMillis(); - public StringProtocol(Charset charset) { + public StringMessage(Charset charset) { this.charset = charset; } - public StringProtocol() { + public StringMessage() { this(org.miaixz.bus.core.lang.Charset.UTF_8); } diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/package-info.java b/bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/package-info.java similarity index 97% rename from bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/package-info.java rename to bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/package-info.java index 599bef8ca4..0cd894d635 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/metric/protocol/package-info.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/metric/message/package-info.java @@ -31,4 +31,4 @@ * @author Kimi Liu * @since Java 17+ */ -package org.miaixz.bus.socket.metric.protocol; \ No newline at end of file +package org.miaixz.bus.socket.metric.message; \ No newline at end of file diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/package-info.java b/bus-socket/src/main/java/org/miaixz/bus/socket/package-info.java index df8942e239..26aab11291 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/package-info.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/package-info.java @@ -28,7 +28,7 @@ /** * 定义用户进行通信开发所需实现的接口 * - * 用户进行通信开发时需要实现该package中的接口,通常情况下仅需实现{@link org.miaixz.bus.socket.Protocol}/{@link org.miaixz.bus.socket.Handler}即可。 + * 用户进行通信开发时需要实现该package中的接口,通常情况下仅需实现{@link org.miaixz.bus.socket.Message}/{@link org.miaixz.bus.socket.Handler}即可。 * 如需仅需通讯层面的监控,本项目提供了接口{@link org.miaixz.bus.socket.Monitor}以供使用。 *
*diff --git a/bus-starter/src/main/java/org/miaixz/bus/starter/socket/SocketQuickService.java b/bus-starter/src/main/java/org/miaixz/bus/starter/socket/SocketQuickService.java index bfce4649bd..2ce12e1bda 100644 --- a/bus-starter/src/main/java/org/miaixz/bus/starter/socket/SocketQuickService.java +++ b/bus-starter/src/main/java/org/miaixz/bus/starter/socket/SocketQuickService.java @@ -29,7 +29,7 @@ import jakarta.annotation.Resource; import org.miaixz.bus.socket.Handler; -import org.miaixz.bus.socket.Protocol; +import org.miaixz.bus.socket.Message; import org.miaixz.bus.socket.accord.AioServer; import java.io.IOException; @@ -44,7 +44,7 @@ public class SocketQuickService { @Resource private Handler handler; @Resource - private Protocol protocol; + private Message message; private AioServer aioQuickServer; public SocketQuickService(SocketProperties properties) { @@ -52,7 +52,7 @@ public SocketQuickService(SocketProperties properties) { } public void start() { - this.aioQuickServer = new AioServer(this.properties.getPort(), protocol, handler); + this.aioQuickServer = new AioServer(this.properties.getPort(), message, handler); try { aioQuickServer.start(); } catch (IOException e) { From 8ce1c3ff043a6329c61ff4fe55e7f2ef3dbf3457 Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Thu, 20 Jun 2024 15:33:02 +0800 Subject: [PATCH 09/20] fix socket --- .../org/miaixz/bus/core/tree/NodeConfig.java | 3 +- .../core/tree/parser/DefaultNodeParser.java | 1 - ...paceCache.java => UniversalNamespace.java} | 52 +++++++++---------- .../java/org/miaixz/bus/core/xml/XPath.java | 2 +- .../java/org/miaixz/bus/core/xyz/SPIKit.java | 1 - .../miaixz/bus/socket/accord/AioClient.java | 6 +++ .../miaixz/bus/socket/accord/AioServer.java | 20 ++++--- .../miaixz/bus/socket/accord/TcpSession.java | 26 ++++++---- .../bus/socket/accord/UdpBootstrap.java | 27 +++++++++- .../miaixz/bus/socket/accord/UdpChannel.java | 9 ++++ 10 files changed, 95 insertions(+), 52 deletions(-) rename bus-core/src/main/java/org/miaixz/bus/core/xml/{UniversalNamespaceCache.java => UniversalNamespace.java} (72%) diff --git a/bus-core/src/main/java/org/miaixz/bus/core/tree/NodeConfig.java b/bus-core/src/main/java/org/miaixz/bus/core/tree/NodeConfig.java index 2a5639e5cb..aaa54e014f 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/tree/NodeConfig.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/tree/NodeConfig.java @@ -37,11 +37,12 @@ */ public class NodeConfig implements Serializable { + private static final long serialVersionUID = -1L; + /** * 默认属性配置对象 */ public static final NodeConfig DEFAULT_CONFIG = new NodeConfig(); - private static final long serialVersionUID = -1L; /** * 属性名配置字段 */ diff --git a/bus-core/src/main/java/org/miaixz/bus/core/tree/parser/DefaultNodeParser.java b/bus-core/src/main/java/org/miaixz/bus/core/tree/parser/DefaultNodeParser.java index 7814536d76..06edf52b45 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/tree/parser/DefaultNodeParser.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/tree/parser/DefaultNodeParser.java @@ -37,7 +37,6 @@ * 默认的简单转换器 * * @param
ID类型 - * liangbaikai * @author Kimi Liu * @since Java 17+ */ diff --git a/bus-core/src/main/java/org/miaixz/bus/core/xml/UniversalNamespaceCache.java b/bus-core/src/main/java/org/miaixz/bus/core/xml/UniversalNamespace.java similarity index 72% rename from bus-core/src/main/java/org/miaixz/bus/core/xml/UniversalNamespaceCache.java rename to bus-core/src/main/java/org/miaixz/bus/core/xml/UniversalNamespace.java index 054ed230a7..12c478549b 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/xml/UniversalNamespaceCache.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/xml/UniversalNamespace.java @@ -44,27 +44,27 @@ * @author Kimi Liu * @since Java 17+ */ -public class UniversalNamespaceCache implements NamespaceContext { +public class UniversalNamespace implements NamespaceContext { private static final String DEFAULT_NS = "DEFAULT"; private final BiMap prefixUri = new BiMap<>(new HashMap<>()); /** - * This constructor parses the document and stores all namespaces it can - * find. If toplevelOnly is true, only namespaces in the root are used. + * 此构造函数解析文档并存储其能找到的所有命名空间。 + * 如果 toplevelOnly 为 true,则仅使用根目录中的命名空间。 * - * @param node source Node - * @param toplevelOnly restriction of the search to enhance performance + * @param node 源节点 + * @param toplevelOnly 限制搜索以提高性能 */ - public UniversalNamespaceCache(final Node node, final boolean toplevelOnly) { + public UniversalNamespace(final Node node, final boolean toplevelOnly) { examineNode(node.getFirstChild(), toplevelOnly); } /** - * A single node is read, the namespace attributes are extracted and stored. + *取单个节点,提取并存储命名空间属性。 * - * @param node to examine - * @param attributesOnly, if true no recursion happens + * @param node 检查节点 + * @param attributesOnly 如果为真,则不发生递归 */ private void examineNode(final Node node, final boolean attributesOnly) { final NamedNodeMap attributes = node.getAttributes(); @@ -78,7 +78,6 @@ private void examineNode(final Node node, final boolean attributesOnly) { if (!attributesOnly) { final NodeList childNodes = node.getChildNodes(); - //noinspection ConstantConditions if (null != childNodes) { Node item; final int childLength = childNodes.getLength(); @@ -92,34 +91,32 @@ private void examineNode(final Node node, final boolean attributesOnly) { } /** - * This method looks at an attribute and stores it, if it is a namespace - * attribute. + * 如果它是命名空间属性,则此方法查看该属性并将其存储。 * - * @param attribute to examine + * @param node 检查节点 */ - private void storeAttribute(final Node attribute) { - if (null == attribute) { + private void storeAttribute(final Node node) { + if (null == node) { return; } - // examine the attributes in namespace xmlns - if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attribute.getNamespaceURI())) { - // Default namespace xmlns="uri goes here" - if (XMLConstants.XMLNS_ATTRIBUTE.equals(attribute.getNodeName())) { - prefixUri.put(DEFAULT_NS, attribute.getNodeValue()); + // 检查命名空间 xmlns 中的属性 + if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(node.getNamespaceURI())) { + // 默认命名空间 xmlns="uri goes here" + if (XMLConstants.XMLNS_ATTRIBUTE.equals(node.getNodeName())) { + prefixUri.put(DEFAULT_NS, node.getNodeValue()); } else { - // The defined prefixes are stored here - prefixUri.put(attribute.getLocalName(), attribute.getNodeValue()); + // 定义的前缀存储在这里 + prefixUri.put(node.getLocalName(), node.getNodeValue()); } } } /** - * This method is called by XPath. It returns the default namespace, if the - * prefix is null or "". + * 此方法由 XPath 调用。如果前缀为 null 或“”,则返回默认命名空间。 * - * @param prefix to search for - * @return uri + * @param prefix 前缀 + * @return 命名空间URI */ @Override public String getNamespaceURI(final String prefix) { @@ -131,8 +128,7 @@ public String getNamespaceURI(final String prefix) { } /** - * This method is not needed in this context, but can be implemented in a - * similar way. + * 在这种情况下不需要这种方法,但可以用类似的方式实现。 */ @Override public String getPrefix(final String namespaceURI) { diff --git a/bus-core/src/main/java/org/miaixz/bus/core/xml/XPath.java b/bus-core/src/main/java/org/miaixz/bus/core/xml/XPath.java index 77098d82d7..de35b4ad5c 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/xml/XPath.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/xml/XPath.java @@ -105,7 +105,7 @@ public static Node getNodeByXPath(final String expression, final Object source) public static Object getByXPath(final String expression, final Object source, final QName returnType) { NamespaceContext nsContext = null; if (source instanceof Node) { - nsContext = new UniversalNamespaceCache((Node) source, false); + nsContext = new UniversalNamespace((Node) source, false); } return getByXPath(expression, source, returnType, nsContext); } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/xyz/SPIKit.java b/bus-core/src/main/java/org/miaixz/bus/core/xyz/SPIKit.java index 202bac8ed9..eff2891b46 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/xyz/SPIKit.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/xyz/SPIKit.java @@ -36,7 +36,6 @@ /** * 服务提供接口SPI(Service Provider interface)相关类 - * * SPI机制中的服务加载工具类,流程如下 * *
diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioClient.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioClient.java index 8980701640..088eb4a610 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioClient.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioClient.java @@ -57,6 +57,9 @@ */ public final class AioClient { + /** + * 健康检查 + */ private static final ScheduledExecutorService CONNECT_TIMEOUT_EXECUTOR = Executors.newSingleThreadScheduledExecutor(r -> { Thread thread = new Thread(r, "connection-timeout-monitor"); thread.setDaemon(true); @@ -73,6 +76,9 @@ public final class AioClient { * @see TcpSession */ private TcpSession session; + /** + * ByteBuffer内存池 + */ private BufferPagePool innerBufferPool = null; /** * IO事件处理线程组 diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioServer.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioServer.java index 835b6f35f3..0869170027 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioServer.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/AioServer.java @@ -55,6 +55,9 @@ */ public final class AioServer { + /** + * 线程序号 + */ private static long threadSeqNumber; /** * 客户端服务配置 @@ -66,11 +69,11 @@ public final class AioServer { */ private BufferPagePool innerBufferPool = null; /** - * asynchronousServerSocketChannel + * 异步服务器套接字通道 */ private AsynchronousServerSocketChannel serverSocketChannel = null; /** - * asynchronousChannelGroup + * 异步通道组 */ private AsynchronousChannelGroup asynchronousChannelGroup; /** @@ -81,7 +84,9 @@ public final class AioServer { * 内存池 */ private BufferPagePool bufferPool = null; - + /** + * 虚拟缓冲区工厂 + */ private VirtualBufferFactory readBufferFactory = bufferPage -> bufferPage.allocate(context.getReadBufferSize()); /** @@ -136,13 +141,13 @@ public void start(AsynchronousChannelGroup asynchronousChannelGroup) throws IOEx } this.serverSocketChannel = AsynchronousServerSocketChannel.open(asynchronousChannelGroup); - // set socket options + // 设置套接字选项 if (context.getSocketOptions() != null) { for (Map.Entry, Object> entry : context.getSocketOptions().entrySet()) { this.serverSocketChannel.setOption(entry.getKey(), entry.getValue()); } } - // bind host + // 绑定主机 if (context.getHost() != null) { serverSocketChannel.bind(new InetSocketAddress(context.getHost(), context.getPort()), context.getBacklog()); } else { @@ -183,6 +188,7 @@ public void failed(Throwable exc, Void attachment) { * 为每个新建立的连接创建Session对象 * * @param channel 当前已建立连接通道 + * @param function */ private void createSession(AsynchronousSocketChannel channel, Function function) { // 连接成功则构造Session对象 @@ -298,7 +304,7 @@ public AioServer setBacklog(int backlog) { } /** - * 设置内存池。 + * 设置内存池 * 通过该方法设置的内存池,在AioServer执行shutdown时不会触发内存池的释放。 * 该方法适用于多个AioServer、AioClient共享内存池的场景。 * 在启用内存池的情况下会有更好的性能表现 @@ -313,7 +319,7 @@ public AioServer setBufferPagePool(BufferPagePool bufferPool) { } /** - * 设置内存池的构造工厂。 + * 设置内存池的构造工厂 * 通过工厂形式生成的内存池会强绑定到当前AioServer对象, * 在AioServer执行shutdown时会释放内存池。 * 在启用内存池的情况下会有更好的性能表现 diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/TcpSession.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/TcpSession.java index dc11d9c51b..5c8ff7a61e 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/TcpSession.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/TcpSession.java @@ -68,6 +68,7 @@ * @since Java 17+ */ public final class TcpSession extends Session { + /** * 底层通信channel对象 */ @@ -76,15 +77,21 @@ public final class TcpSession extends Session { * 输出流 */ private final WriteBuffer byteBuf; + /** + * 缓冲页 + */ private final BufferPage bufferPage; /** * 服务上下文 */ private final Context context; + /** + * 缓冲函数 + */ private final Function function; /** - * 读缓冲。 - * 大小取决于AioClient/AioServer设置的setReadBufferSize
+ * 读缓冲 + * 大小取决于AioClient/AioServer设置的setReadBufferSize */ private VirtualBuffer readBuffer; /** @@ -118,7 +125,7 @@ void doRead() { /** * 触发AIO的写操作, - *需要调用控制同步
+ * 需要调用控制同步 */ void writeCompleted(int result) { Monitor monitor = context.getMonitor(); @@ -139,11 +146,11 @@ void writeCompleted(int result) { return; } byteBuf.finishWrite(); - //此时可能是Closing或Closed状态 + // 此时可能是Closing或Closed状态 if (status != SESSION_STATUS_ENABLED) { close(); } else { - //也许此时有新的消息通过write方法添加到writeCacheQueue中 + // 也许此时有新的消息通过write方法添加到writeCacheQueue中 byteBuf.flush(); } } @@ -270,7 +277,7 @@ public void signalRead() { break; } - //处理消息 + // 处理消息 try { handler.process(this, dataEntry); if (modCount != this.modCount) { @@ -293,14 +300,14 @@ public void signalRead() { byteBuf.flush(); readBuffer.compact(); - //读缓冲区已满 + // 读缓冲区已满 if (!readBuffer.hasRemaining()) { InternalException exception = new InternalException("readBuffer overflow. The current TCP connection will be closed. Please fix your " + context.getProtocol().getClass().getSimpleName() + "#decode bug."); handler.stateEvent(this, Status.DECODE_EXCEPTION, exception); throw exception; } - //read from channel + // 从通道读取 Monitor monitor = context.getMonitor(); if (monitor != null) { monitor.beforeRead(this); @@ -485,8 +492,6 @@ public void close() { } } - - /** * 写事件回调处理 */ @@ -515,5 +520,4 @@ public void failed(Throwable exc, TcpSession session) { } }; - } diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpBootstrap.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpBootstrap.java index 3b8981a1de..93be01d2de 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpBootstrap.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpBootstrap.java @@ -54,16 +54,39 @@ public class UdpBootstrap { * 内存池 */ private BufferPagePool bufferPool; + /** + * 缓冲页池 + */ private BufferPagePool innerBufferPool = null; + /** + * 工作者 + */ private Worker worker; + /** + * 内部工作者 + */ private boolean innerWorker = false; - + /** + * 构造 + * + * @param message 消息处理 + * @param handler 拦截器 + * @param worker 工作者 + * @param当前请求 + */ public UdpBootstrap(Message message, Handler handler, Worker worker) { this(message, handler); this.worker = worker; } + /** + * 构造 + * + * @param message 消息处理 + * @param handler 拦截器 + * @param 当前请求 + */ public UdpBootstrap(Message message, Handler handler) { context.setProtocol(message); context.setProcessor(handler); @@ -166,7 +189,7 @@ public final UdpBootstrap setBufferPagePool(BufferPagePool bufferPool) { } /** - * 设置内存池的构造工厂。 + * 设置内存池的构造工厂 * 通过工厂形式生成的内存池会强绑定到当前UdpBootstrap对象, * 在UdpBootstrap执行shutdown时会释放内存池。 * 在启用内存池的情况下会有更好的性能表现 diff --git a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpChannel.java b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpChannel.java index a96cbc0616..bc5eba5f63 100644 --- a/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpChannel.java +++ b/bus-socket/src/main/java/org/miaixz/bus/socket/accord/UdpChannel.java @@ -56,6 +56,9 @@ public final class UdpChannel { * 服务上下文 */ public final Context context; + /** + * 缓冲页 + */ private final BufferPage bufferPage; /** * 真实的UDP通道 @@ -65,7 +68,13 @@ public final class UdpChannel { * 待输出消息 */ private ConcurrentLinkedQueue responseTasks; + /** + * 工作者 + */ private Worker worker; + /** + * 注册者key + */ private SelectionKey selectionKey; /** * 发送失败的 From 10920ea5bb528e60dbcf6d5bee4cf6a65394d433 Mon Sep 17 00:00:00 2001 From: Kimi Liu <839536@qq.com> Date: Fri, 21 Jun 2024 18:18:40 +0800 Subject: [PATCH 10/20] add plumrain --- .../bus/core/center/date/culture/Galaxy.java | 5 +- .../bus/core/center/date/culture/Holiday.java | 6 +- .../center/date/culture/cn/birth/Fortune.java | 2 +- .../date/culture/cn/plumrain/PlumRain.java | 74 ++++++ .../date/culture/cn/plumrain/PlumRainDay.java | 58 +++++ .../culture/cn/plumrain/package-info.java | 34 +++ .../date/culture/cn/star/six/SixStar.java | 62 +++++ .../culture/cn/star/six/package-info.java | 34 +++ .../center/date/culture/lunar/LunarDay.java | 83 ++++--- .../date/culture/lunar/LunarFestival.java | 41 ++- .../center/date/culture/lunar/LunarHour.java | 31 +-- .../center/date/culture/lunar/LunarMonth.java | 6 +- .../center/date/culture/lunar/LunarWeek.java | 3 +- .../center/date/culture/solar/SolarDay.java | 87 ++++--- .../date/culture/solar/SolarFestival.java | 31 ++- .../date/culture/solar/SolarHalfYear.java | 2 +- .../center/date/culture/solar/SolarMonth.java | 2 +- .../date/culture/solar/SolarQuarter.java | 2 +- .../center/date/culture/solar/SolarTerms.java | 4 +- .../center/date/culture/solar/SolarTime.java | 26 +- .../center/date/culture/solar/SolarWeek.java | 3 +- .../miaixz/bus/http/metric/anget/Browser.java | 80 ++++-- .../metric/anget/{Divice.java => Device.java} | 74 +++--- .../miaixz/bus/http/metric/anget/Engine.java | 31 ++- .../org/miaixz/bus/http/metric/anget/NOS.java | 31 ++- .../bus/http/metric/anget/UserAgent.java | 233 ++++++++---------- .../org/miaixz/bus/http/socket/Handshake.java | 4 +- .../main/java/org/miaixz/bus/pay/Complex.java | 5 +- 28 files changed, 665 insertions(+), 389 deletions(-) create mode 100755 bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/PlumRain.java create mode 100755 bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/PlumRainDay.java create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/package-info.java create mode 100755 bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/star/six/SixStar.java create mode 100644 bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/star/six/package-info.java rename bus-http/src/main/java/org/miaixz/bus/http/metric/anget/{Divice.java => Device.java} (69%) diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Galaxy.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Galaxy.java index 2057f06976..f8f82b5432 100644 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Galaxy.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Galaxy.java @@ -658,10 +658,7 @@ public static double qiAccurate2(double jd) { if (a - jd > 5) { return qiAccurate(w - d); } - if (a - jd < -5) { - return qiAccurate(w + d); - } - return a; + return a - jd < -5 ? qiAccurate(w + d) : a; } } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Holiday.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Holiday.java index 7c91ac7c74..2269c17a0e 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Holiday.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/Holiday.java @@ -280,12 +280,10 @@ public Holiday(int year, int month, int day, String data) { public static Holiday fromYmd(int year, int month, int day) { Matcher matcher = Pattern.compile(String.format("%04d%02d%02d[0-1][0-8][\\+|-]\\d{2}", year, month, day)).matcher(DATA); - if (!matcher.find()) { - return null; - } - return new Holiday(year, month, day, matcher.group()); + return !matcher.find() ? null : new Holiday(year, month, day, matcher.group()); } + public Holiday next(int n) { SolarMonth m = day.getMonth(); int year = m.getYear().getYear(); diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/birth/Fortune.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/birth/Fortune.java index 5f33449c14..49575631b9 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/birth/Fortune.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/birth/Fortune.java @@ -59,7 +59,7 @@ public Fortune(ChildLimit childLimit, int index) { * * @param childLimit 童限 * @param index 序号 - * @return 大运 + * @return 小运 */ public static Fortune fromChildLimit(ChildLimit childLimit, int index) { return new Fortune(childLimit, index); diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/PlumRain.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/PlumRain.java new file mode 100755 index 0000000000..a2221631e1 --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/PlumRain.java @@ -0,0 +1,74 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org 6tail and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +*/ +package org.miaixz.bus.core.center.date.culture.cn.plumrain; + +import org.miaixz.bus.core.center.date.culture.Samsara; + +/** + * 梅雨 + * + * @author Kimi Liu + * @since Java 17+ + */ +public class PlumRain extends Samsara { + + public static final String[] NAMES = {"入梅", "出梅"}; + + public PlumRain(String name) { + super(NAMES, name); + } + + public PlumRain(int index) { + super(NAMES, index); + } + + /** + * 从名称初始化 + * + * @param name 名称 + * @return 梅雨 + */ + public static PlumRain fromName(String name) { + return new PlumRain(name); + } + + /** + * 从索引初始化 + * + * @param index 索引 + * @return 梅雨 + */ + public static PlumRain fromIndex(int index) { + return new PlumRain(index); + } + + public PlumRain next(int n) { + return fromIndex(nextIndex(n)); + } + +} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/PlumRainDay.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/PlumRainDay.java new file mode 100755 index 0000000000..b50a170c4a --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/PlumRainDay.java @@ -0,0 +1,58 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org 6tail and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +*/ +package org.miaixz.bus.core.center.date.culture.cn.plumrain; + +import org.miaixz.bus.core.center.date.culture.Replenish; + +/** + * 梅雨天 + * + * @author Kimi Liu + * @since Java 17+ + */ +public class PlumRainDay extends Replenish { + + public PlumRainDay(PlumRain plumRain, int dayIndex) { + super(plumRain, dayIndex); + } + + /** + * 梅雨 + * + * @return 梅雨 + */ + public PlumRain getPlumRain() { + return (PlumRain) tradition; + } + + @Override + public String toString() { + return getPlumRain().getIndex() == 0 ? super.toString() : tradition.getName(); + } + +} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/package-info.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/package-info.java new file mode 100644 index 0000000000..83c6146538 --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/plumrain/package-info.java @@ -0,0 +1,34 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +/** + * 梅雨 + * + * @author Kimi Liu + * @since Java 17+ + */ +package org.miaixz.bus.core.center.date.culture.cn.plumrain; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/star/six/SixStar.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/star/six/SixStar.java new file mode 100755 index 0000000000..81ce893cae --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/star/six/SixStar.java @@ -0,0 +1,62 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org 6tail and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +*/ +package org.miaixz.bus.core.center.date.culture.cn.star.six; + +import org.miaixz.bus.core.center.date.culture.Samsara; + +/** + * 六曜(孔明六曜星、小六壬) + * + * @author Kimi Liu + * @since Java 17+ + */ +public class SixStar extends Samsara { + + public static final String[] NAMES = {"先胜", "友引", "先负", "佛灭", "大安", "赤口"}; + + public SixStar(int index) { + super(NAMES, index); + } + + public SixStar(String name) { + super(NAMES, name); + } + + public static SixStar fromIndex(int index) { + return new SixStar(index); + } + + public static SixStar fromName(String name) { + return new SixStar(name); + } + + public SixStar next(int n) { + return fromIndex(nextIndex(n)); + } + +} diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/star/six/package-info.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/star/six/package-info.java new file mode 100644 index 0000000000..d4c13a2ff7 --- /dev/null +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/cn/star/six/package-info.java @@ -0,0 +1,34 @@ +/* + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ ~ + ~ The MIT License (MIT) ~ + ~ ~ + ~ Copyright (c) 2015-2024 miaixz.org and other contributors. ~ + ~ ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy ~ + ~ of this software and associated documentation files (the "Software"), to deal ~ + ~ in the Software without restriction, including without limitation the rights ~ + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ~ + ~ copies of the Software, and to permit persons to whom the Software is ~ + ~ furnished to do so, subject to the following conditions: ~ + ~ ~ + ~ The above copyright notice and this permission notice shall be included in ~ + ~ all copies or substantial portions of the Software. ~ + ~ ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ~ + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ~ + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ~ + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ~ + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ~ + ~ THE SOFTWARE. ~ + ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + */ +/** + * 六曜(孔明六曜星、小六壬) + * + * @author Kimi Liu + * @since Java 17+ + */ +package org.miaixz.bus.core.center.date.culture.cn.star.six; diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarDay.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarDay.java index 4dbd7998b5..efad450622 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarDay.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarDay.java @@ -37,6 +37,7 @@ import org.miaixz.bus.core.center.date.culture.cn.sixty.HeavenStem; import org.miaixz.bus.core.center.date.culture.cn.sixty.SixtyCycle; import org.miaixz.bus.core.center.date.culture.cn.star.nine.NineStar; +import org.miaixz.bus.core.center.date.culture.cn.star.six.SixStar; import org.miaixz.bus.core.center.date.culture.cn.star.twelve.TwelveStar; import org.miaixz.bus.core.center.date.culture.cn.star.twentyeight.TwentyEightStar; import org.miaixz.bus.core.center.date.culture.solar.SolarDay; @@ -125,21 +126,21 @@ public LunarDay next(int n) { return fromYmd(month.getYear().getYear(), month.getMonthWithLeap(), day); } int d = day + n; - LunarMonth lm = month; - int daysInMonth = lm.getDayCount(); + LunarMonth m = month; + int daysInMonth = m.getDayCount(); boolean forward = n > 0; int add = forward ? 1 : -1; while (forward ? (d > daysInMonth) : (d <= 0)) { if (forward) { d -= daysInMonth; } - lm = lm.next(add); - daysInMonth = lm.getDayCount(); + m = m.next(add); + daysInMonth = m.getDayCount(); if (!forward) { d += daysInMonth; } } - return fromYmd(lm.getYear().getYear(), lm.getMonthWithLeap(), d); + return fromYmd(m.getYear().getYear(), m.getMonthWithLeap(), d); } /** @@ -149,21 +150,19 @@ public LunarDay next(int n) { * @return true/false */ public boolean isBefore(LunarDay target) { + LunarMonth bMonth = target.getMonth(); int aYear = month.getYear().getYear(); - LunarMonth targetMonth = target.getMonth(); - int bYear = targetMonth.getYear().getYear(); - if (aYear == bYear) { - int aMonth = month.getMonth(); - int bMonth = targetMonth.getMonth(); - if (aMonth == bMonth) { - if (month.isLeap() && !targetMonth.isLeap()) { - return false; - } - return day < target.getDay(); - } - return aMonth < bMonth; + int bYear = bMonth.getYear().getYear(); + if (aYear != bYear) { + return aYear < bYear; + } + if (month.getMonth() != bMonth.getMonth()) { + return month.getMonth() < bMonth.getMonth(); + } + if (month.isLeap() && !bMonth.isLeap()) { + return false; } - return aYear < bYear; + return day < target.getDay(); } /** @@ -173,21 +172,19 @@ public boolean isBefore(LunarDay target) { * @return true/false */ public boolean isAfter(LunarDay target) { + LunarMonth bMonth = target.getMonth(); int aYear = month.getYear().getYear(); - LunarMonth targetMonth = target.getMonth(); - int bYear = targetMonth.getYear().getYear(); - if (aYear == bYear) { - int aMonth = month.getMonth(); - int bMonth = targetMonth.getMonth(); - if (aMonth == bMonth) { - if (month.isLeap() && !targetMonth.isLeap()) { - return true; - } - return day > target.getDay(); - } - return aMonth > bMonth; + int bYear = bMonth.getYear().getYear(); + if (aYear != bYear) { + return aYear > bYear; + } + if (month.getMonth() != bMonth.getMonth()) { + return month.getMonth() > bMonth.getMonth(); + } + if (month.isLeap() && !bMonth.isLeap()) { + return true; } - return aYear > bYear; + return day > target.getDay(); } /** @@ -196,11 +193,11 @@ public boolean isAfter(LunarDay target) { * @return 星期 */ public Week getWeek() { - return getSolarDay().getJulianDay().getWeek(); + return getSolarDay().getWeek(); } /** - * 当天的年干支 + * 当天的年干支(立春换) * * @return 干支 */ @@ -224,7 +221,7 @@ public SixtyCycle getYearSixtyCycle() { } /** - * 当天的月干支 + * 当天的月干支(节气换) * * @return 干支 */ @@ -306,10 +303,7 @@ public NineStar getNineStar() { */ public Direction getJupiterDirection() { int index = getSixtyCycle().getIndex(); - if (index % 12 < 6) { - return Direction.fromIndex(new int[]{2, 8, 4, 6, 0}[index / 12]); - } - return month.getYear().getJupiterDirection(); + return index % 12 < 6 ? Direction.fromIndex(new int[]{2, 8, 4, 6, 0}[index / 12]) : month.getYear().getJupiterDirection(); } /** @@ -330,6 +324,15 @@ public Phase getPhase() { return Phase.fromIndex(day - 1); } + /** + * 六曜 + * + * @return 六曜 + */ + public SixStar getSixStar() { + return SixStar.fromIndex((month.getMonth() + day - 2) % 6); + } + /** * 公历日 * @@ -354,10 +357,10 @@ public TwentyEightStar getTwentyEightStar() { * @return 农历传统节日 */ public LunarFestival getFestival() { - LunarMonth m = getMonth(); - return LunarFestival.fromYmd(m.getYear().getYear(), m.getMonthWithLeap(), day); + return LunarFestival.fromYmd(month.getYear().getYear(), month.getMonthWithLeap(), day); } + @Override public boolean equals(Object o) { if (!(o instanceof LunarDay)) { diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarFestival.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarFestival.java index 58696efc87..b6877ab136 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarFestival.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarFestival.java @@ -87,21 +87,22 @@ public static LunarFestival fromIndex(int year, int index) { throw new IllegalArgumentException(String.format("illegal index: %d", index)); } Matcher matcher = Pattern.compile(String.format("@%02d\\d+", index)).matcher(DATA); - if (matcher.find()) { - String data = matcher.group(); - EnumMap.Festival type = EnumMap.Festival.fromCode(data.charAt(3) - '0'); - switch (type) { - case DAY: - return new LunarFestival(type, LunarDay.fromYmd(year, Integer.parseInt(data.substring(4, 6), 10), Integer.parseInt(data.substring(6), 10)), null, data); - case TERM: - SolarTerms solarTerms = SolarTerms.fromIndex(year, Integer.parseInt(data.substring(4), 10)); - return new LunarFestival(type, solarTerms.getJulianDay().getSolarDay().getLunarDay(), solarTerms, data); - case EVE: - return new LunarFestival(type, LunarDay.fromYmd(year + 1, 1, 1).next(-1), null, data); - default: - } + if (!matcher.find()) { + return null; + } + String data = matcher.group(); + EnumMap.Festival type = EnumMap.Festival.fromCode(data.charAt(3) - '0'); + switch (type) { + case DAY: + return new LunarFestival(type, LunarDay.fromYmd(year, Integer.parseInt(data.substring(4, 6), 10), Integer.parseInt(data.substring(6), 10)), null, data); + case TERM: + SolarTerms solarTerm = SolarTerms.fromIndex(year, Integer.parseInt(data.substring(4), 10)); + return new LunarFestival(type, solarTerm.getJulianDay().getSolarDay().getLunarDay(), solarTerm, data); + case EVE: + return new LunarFestival(type, LunarDay.fromYmd(year + 1, 1, 1).next(-1), null, data); + default: + return null; } - return null; } public static LunarFestival fromYmd(int year, int month, int day) { @@ -120,14 +121,12 @@ public static LunarFestival fromYmd(int year, int month, int day) { } } matcher = Pattern.compile("@\\d{2}2").matcher(DATA); - if (matcher.find()) { - LunarDay lunarDay = LunarDay.fromYmd(year, month, day); - LunarDay nextDay = lunarDay.next(1); - if (nextDay.getMonth().getMonth() == 1 && nextDay.getDay() == 1) { - return new LunarFestival(EnumMap.Festival.EVE, lunarDay, null, matcher.group()); - } + if (!matcher.find()) { + return null; } - return null; + LunarDay lunarDay = LunarDay.fromYmd(year, month, day); + LunarDay nextDay = lunarDay.next(1); + return nextDay.getMonth().getMonth() == 1 && nextDay.getDay() == 1 ? new LunarFestival(EnumMap.Festival.EVE, lunarDay, null, matcher.group()) : null; } public LunarFestival next(int n) { diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarHour.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarHour.java index 709bfd41a2..db4564f293 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarHour.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarHour.java @@ -151,6 +151,11 @@ public String toString() { return day + getSixtyCycle().getName() + "时"; } + /** + * 位于当天的索引 + * + * @return 索引 + */ public int getIndexInDay() { return (hour + 1) / 2; } @@ -166,8 +171,8 @@ public LunarHour next(int n) { days--; } LunarDay d = day.next(days); - LunarMonth month = d.getMonth(); - return fromYmdHms(month.getYear().getYear(), month.getMonthWithLeap(), d.getDay(), hour, minute, second); + LunarMonth m = d.getMonth(); + return fromYmdHms(m.getYear().getYear(), m.getMonthWithLeap(), d.getDay(), hour, minute, second); } /** @@ -180,12 +185,10 @@ public boolean isBefore(LunarHour target) { if (!day.equals(target.getDay())) { return day.isBefore(target.getDay()); } - int bHour = target.getHour(); - if (hour == bHour) { - int bMinute = target.getMinute(); - return minute == bMinute ? second < target.getSecond() : minute < bMinute; + if (hour != target.getHour()) { + return hour < target.getHour(); } - return hour < bHour; + return minute != target.getMinute() ? minute < target.getMinute() : second < target.getSecond(); } /** @@ -198,16 +201,14 @@ public boolean isAfter(LunarHour target) { if (!day.equals(target.getDay())) { return day.isAfter(target.getDay()); } - int bHour = target.getHour(); - if (hour == bHour) { - int bMinute = target.getMinute(); - return minute == bMinute ? second > target.getSecond() : minute > bMinute; + if (hour != target.getHour()) { + return hour > target.getHour(); } - return hour > bHour; + return minute != target.getMinute() ? minute > target.getMinute() : second > target.getSecond(); } /** - * 当时的年干支 + * 当时的年干支(立春换) * * @return 干支 */ @@ -231,7 +232,7 @@ public SixtyCycle getYearSixtyCycle() { } /** - * 当时的月干支 + * 当时的月干支(节气换) * * @return 干支 */ @@ -253,7 +254,7 @@ public SixtyCycle getMonthSixtyCycle() { */ public SixtyCycle getDaySixtyCycle() { SixtyCycle d = day.getSixtyCycle(); - return hour > 22 ? d.next(1) : d; + return hour < 23 ? d : d.next(1); } /** diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarMonth.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarMonth.java index 6dfeaff76f..ccad062c23 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarMonth.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarMonth.java @@ -106,15 +106,11 @@ public LunarMonth(int year, int month) { w -= 29.53; } - // 计算正月初一的偏移 - LunarYear prevYear = LunarYear.fromYear(year - 1); - int prevLeapMonth = prevYear.getLeapMonth(); - // 正常情况正月初一为第3个朔日,但有些特殊的 int offset = 2; if (year > 8 && year < 24) { offset = 1; - } else if (prevLeapMonth > 10 && year != 239 && year != 240) { + } else if (LunarYear.fromYear(year - 1).getLeapMonth() > 10 && year != 239 && year != 240) { offset = 3; } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarWeek.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarWeek.java index a26b924f1f..4306576b2f 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarWeek.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/lunar/LunarWeek.java @@ -159,8 +159,7 @@ public LunarWeek next(int n) { * @return 农历日 */ public LunarDay getFirstDay() { - LunarMonth m = getMonth(); - LunarDay firstDay = LunarDay.fromYmd(m.getYear().getYear(), m.getMonthWithLeap(), 1); + LunarDay firstDay = LunarDay.fromYmd(month.getYear().getYear(), month.getMonthWithLeap(), 1); return firstDay.next(index * 7 - indexOf(firstDay.getWeek().getIndex() - start.getIndex(), 7)); } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarDay.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarDay.java index 41849a68fa..378053f4d6 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarDay.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarDay.java @@ -37,6 +37,8 @@ import org.miaixz.bus.core.center.date.culture.cn.dog.DogDay; import org.miaixz.bus.core.center.date.culture.cn.nine.Nine; import org.miaixz.bus.core.center.date.culture.cn.nine.NineDay; +import org.miaixz.bus.core.center.date.culture.cn.plumrain.PlumRain; +import org.miaixz.bus.core.center.date.culture.cn.plumrain.PlumRainDay; import org.miaixz.bus.core.center.date.culture.en.Constellation; import org.miaixz.bus.core.center.date.culture.lunar.LunarDay; import org.miaixz.bus.core.center.date.culture.lunar.LunarMonth; @@ -173,15 +175,13 @@ public SolarDay next(int n) { * @return true/false */ public boolean isBefore(SolarDay target) { + SolarMonth bMonth = target.getMonth(); int aYear = month.getYear().getYear(); - SolarMonth targetMonth = target.getMonth(); - int bYear = targetMonth.getYear().getYear(); - if (aYear == bYear) { - int aMonth = month.getMonth(); - int bMonth = targetMonth.getMonth(); - return aMonth == bMonth ? day < target.getDay() : aMonth < bMonth; + int bYear = bMonth.getYear().getYear(); + if (aYear != bYear) { + return aYear < bYear; } - return aYear < bYear; + return month.getMonth() != bMonth.getMonth() ? month.getMonth() < bMonth.getMonth() : day < target.getDay(); } /** @@ -191,15 +191,13 @@ public boolean isBefore(SolarDay target) { * @return true/false */ public boolean isAfter(SolarDay target) { + SolarMonth bMonth = target.getMonth(); int aYear = month.getYear().getYear(); - SolarMonth targetMonth = target.getMonth(); - int bYear = targetMonth.getYear().getYear(); - if (aYear == bYear) { - int aMonth = month.getMonth(); - int bMonth = targetMonth.getMonth(); - return aMonth == bMonth ? day > target.getDay() : aMonth > bMonth; + int bYear = bMonth.getYear().getYear(); + if (aYear != bYear) { + return aYear > bYear; } - return aYear > bYear; + return month.getMonth() != bMonth.getMonth() ? month.getMonth() > bMonth.getMonth() : day > target.getDay(); } /** @@ -235,7 +233,7 @@ public SolarTermDay getTermDay() { public SolarWeek getSolarWeek(int start) { int y = month.getYear().getYear(); int m = month.getMonth(); - return SolarWeek.fromYm(y, m, (int) Math.ceil((day + SolarDay.fromYmd(y, m, 1).getWeek().next(-start).getIndex()) / 7D) - 1, start); + return SolarWeek.fromYm(y, m, (int) Math.ceil((day + fromYmd(y, m, 1).getWeek().next(-start).getIndex()) / 7D) - 1, start); } /** @@ -295,10 +293,7 @@ public DogDay getDogDay() { start = start.next(10); days = subtract(start); } - if (days < 10) { - return new DogDay(Dog.fromIndex(2), days); - } - return null; + return days >= 10 ? null : new DogDay(Dog.fromIndex(2), days); } /** @@ -320,25 +315,45 @@ public NineDay getNineDay() { return new NineDay(Nine.fromIndex(days / 9), days % 9); } + /** + * 梅雨天(芒种后的第1个丙日入梅,小暑后的第1个未日出梅) + * + * @return 梅雨天 + */ + public PlumRainDay getPlumRainDay() { + // 芒种 + SolarTerms grainInEar = SolarTerms.fromIndex(month.getYear().getYear(), 11); + SolarDay start = grainInEar.getJulianDay().getSolarDay(); + int add = 2 - start.getLunarDay().getSixtyCycle().getHeavenStem().getIndex(); + if (add < 0) { + add += 10; + } + // 芒种后的第1个丙日 + start = start.next(add); + + // 小暑 + SolarTerms slightHeat = grainInEar.next(2); + SolarDay end = slightHeat.getJulianDay().getSolarDay(); + add = 7 - end.getLunarDay().getSixtyCycle().getEarthBranch().getIndex(); + if (add < 0) { + add += 12; + } + // 小暑后的第1个未日 + end = end.next(add); + + if (isBefore(start) || isAfter(end)) { + return null; + } + return equals(end) ? new PlumRainDay(PlumRain.fromIndex(1), 0) : new PlumRainDay(PlumRain.fromIndex(0), subtract(start)); + } + /** * 位于当年的索引 * * @return 索引 */ public int getIndexInYear() { - int m = month.getMonth(); - int y = month.getYear().getYear(); - int days = 0; - for (int i = 1; i < m; i++) { - days += SolarMonth.fromYm(y, i).getDayCount(); - } - int d = day; - if (1582 == y && 10 == m) { - if (d >= 15) { - d -= 10; - } - } - return days + d - 1; + return subtract(fromYmd(month.getYear().getYear(), 1, 1)); } /** @@ -380,9 +395,8 @@ public LunarDay getLunarDay() { * * @return 法定假日 */ - public Holiday getLegalHoliday() { - SolarMonth m = getMonth(); - return Holiday.fromYmd(m.getYear().getYear(), m.getMonth(), day); + public Holiday getHoliday() { + return Holiday.fromYmd(month.getYear().getYear(), month.getMonth(), day); } /** @@ -391,8 +405,7 @@ public Holiday getLegalHoliday() { * @return 公历现代节日 */ public SolarFestival getFestival() { - SolarMonth m = getMonth(); - return SolarFestival.fromYmd(m.getYear().getYear(), m.getMonth(), day); + return SolarFestival.fromYmd(month.getYear().getYear(), month.getMonth(), day); } } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarFestival.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarFestival.java index a1863e5cc5..72368275a3 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarFestival.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarFestival.java @@ -86,29 +86,26 @@ public static SolarFestival fromIndex(int year, int index) { throw new IllegalArgumentException(String.format("illegal index: %d", index)); } Matcher matcher = Pattern.compile(String.format("@%02d\\d+", index)).matcher(DATA); - if (matcher.find()) { - String data = matcher.group(); - EnumMap.Festival type = EnumMap.Festival.fromCode(data.charAt(3) - '0'); - if (type == EnumMap.Festival.DAY) { - int startYear = Integer.parseInt(data.substring(8), 10); - if (year >= startYear) { - return new SolarFestival(type, SolarDay.fromYmd(year, Integer.parseInt(data.substring(4, 6), 10), Integer.parseInt(data.substring(6, 8), 10)), startYear, data); - } - } + if (!matcher.find()) { + return null; } - return null; + String data = matcher.group(); + EnumMap.Festival type = EnumMap.Festival.fromCode(data.charAt(3) - '0'); + if (type != EnumMap.Festival.DAY) { + return null; + } + int startYear = Integer.parseInt(data.substring(8), 10); + return year < startYear ? null : new SolarFestival(type, SolarDay.fromYmd(year, Integer.parseInt(data.substring(4, 6), 10), Integer.parseInt(data.substring(6, 8), 10)), startYear, data); } public static SolarFestival fromYmd(int year, int month, int day) { Matcher matcher = Pattern.compile(String.format("@\\d{2}0%02d%02d\\d+", month, day)).matcher(DATA); - if (matcher.find()) { - String data = matcher.group(); - int startYear = Integer.parseInt(data.substring(8), 10); - if (year >= startYear) { - return new SolarFestival(EnumMap.Festival.DAY, SolarDay.fromYmd(year, month, day), startYear, data); - } + if (!matcher.find()) { + return null; } - return null; + String data = matcher.group(); + int startYear = Integer.parseInt(data.substring(8), 10); + return year < startYear ? null : new SolarFestival(EnumMap.Festival.DAY, SolarDay.fromYmd(year, month, day), startYear, data); } public SolarFestival next(int n) { diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarHalfYear.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarHalfYear.java index da2a8fb33e..0144032100 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarHalfYear.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarHalfYear.java @@ -59,10 +59,10 @@ public class SolarHalfYear extends Loops { * @param index 索引,0-1 */ public SolarHalfYear(int year, int index) { - this.year = SolarYear.fromYear(year); if (index < 0 || index > 1) { throw new IllegalArgumentException(String.format("illegal solar half year index: %d", index)); } + this.year = SolarYear.fromYear(year); this.index = index; } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarMonth.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarMonth.java index e7413e01c7..40cb99aab0 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarMonth.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarMonth.java @@ -67,10 +67,10 @@ public class SolarMonth extends Loops { * @param month 月 */ public SolarMonth(int year, int month) { - this.year = SolarYear.fromYear(year); if (month < 1 || month > 12) { throw new IllegalArgumentException(String.format("illegal solar month: %d", month)); } + this.year = SolarYear.fromYear(year); this.month = month; } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarQuarter.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarQuarter.java index 14630f9ddf..9b5b38068f 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarQuarter.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarQuarter.java @@ -58,10 +58,10 @@ public class SolarQuarter extends Loops { * @param index 索引,0-3 */ public SolarQuarter(int year, int index) { - this.year = SolarYear.fromYear(year); if (index < 0 || index > 3) { throw new IllegalArgumentException(String.format("illegal solar season index: %d", index)); } + this.year = SolarYear.fromYear(year); this.index = index; } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarTerms.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarTerms.java index b07ad7de15..ba35a1041f 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarTerms.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarTerms.java @@ -85,7 +85,7 @@ public SolarTerms next(int n) { } /** - * 是否节 + * 是否节令 * * @return true/false */ @@ -94,7 +94,7 @@ public boolean isJie() { } /** - * 是否气 + * 是否气令 * * @return true/false */ diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarTime.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarTime.java index 9d7f35c3c8..4b63fc865d 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarTime.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarTime.java @@ -146,12 +146,10 @@ public boolean isBefore(SolarTime target) { if (!day.equals(target.getDay())) { return day.isBefore(target.getDay()); } - int bHour = target.getHour(); - if (hour == bHour) { - int bMinute = target.getMinute(); - return minute == bMinute ? second < target.getSecond() : minute < bMinute; + if (hour != target.getHour()) { + return hour < target.getHour(); } - return hour < bHour; + return minute != target.getMinute() ? minute < target.getMinute() : second < target.getSecond(); } /** @@ -164,12 +162,10 @@ public boolean isAfter(SolarTime target) { if (!day.equals(target.getDay())) { return day.isAfter(target.getDay()); } - int bHour = target.getHour(); - if (hour == bHour) { - int bMinute = target.getMinute(); - return minute == bMinute ? second > target.getSecond() : minute > bMinute; + if (hour != target.getHour()) { + return hour > target.getHour(); } - return hour > bHour; + return minute != target.getMinute() ? minute > target.getMinute() : second > target.getSecond(); } /** @@ -191,8 +187,8 @@ public SolarTerms getTerm() { * @return 儒略日 */ public JulianDay getJulianDay() { - SolarMonth month = day.getMonth(); - return JulianDay.fromYmdHms(month.getYear().getYear(), month.getMonth(), day.getDay(), hour, minute, second); + SolarMonth m = day.getMonth(); + return JulianDay.fromYmdHms(m.getYear().getYear(), m.getMonth(), day.getDay(), hour, minute, second); } /** @@ -222,8 +218,8 @@ public int subtract(SolarTime target) { */ public SolarTime next(int n) { if (n == 0) { - SolarMonth month = day.getMonth(); - return SolarTime.fromYmdHms(month.getYear().getYear(), month.getMonth(), day.getDay(), hour, minute, second); + SolarMonth m = day.getMonth(); + return SolarTime.fromYmdHms(m.getYear().getYear(), m.getMonth(), day.getDay(), hour, minute, second); } int ts = second + n; int tm = minute + ts / 60; @@ -246,7 +242,7 @@ public SolarTime next(int n) { } SolarDay d = day.next(td); - SolarMonth m = d.getMonth(); + SolarMonth m = day.getMonth(); return SolarTime.fromYmdHms(m.getYear().getYear(), m.getMonth(), d.getDay(), th, tm, ts); } diff --git a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarWeek.java b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarWeek.java index 101e720578..4d219f761f 100755 --- a/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarWeek.java +++ b/bus-core/src/main/java/org/miaixz/bus/core/center/date/culture/solar/SolarWeek.java @@ -149,8 +149,7 @@ public SolarWeek next(int n) { while (forward ? (d >= weeksInMonth) : (d < 0)) { if (forward) { d -= weeksInMonth; - } - if (!forward) { + } else { if (!SolarDay.fromYmd(m.getYear().getYear(), m.getMonth(), 1).getWeek().equals(start)) { d += add; } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Browser.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Browser.java index a8946177cf..93cfe9948c 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Browser.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Browser.java @@ -59,11 +59,11 @@ public class Browser extends UserAgent { // 企业微信 企业微信使用微信浏览器内核,会包含 MicroMessenger 所以要放在前面 new Browser("wxwork", "wxwork", "wxwork\\/([\\d\\w\\.\\-]+)"), // 微信 - new Browser("MicroMessenger", "MicroMessenger", "MicroMessenger\\/([\\d\\w\\.\\-]+)"), + new Browser("MicroMessenger", "MicroMessenger", OTHER_VERSION), // 微信小程序 - new Browser("miniProgram", "miniProgram", "miniProgram\\/([\\d\\w\\.\\-]+)"), + new Browser("miniProgram", "miniProgram", OTHER_VERSION), // QQ浏览器 - new Browser("QQBrowser", "MQQBrowser", "MQQBrowser\\/([\\d\\w\\.\\-]+)"), + new Browser("QQBrowser", "QQBrowser", "QQBrowser\\/([\\d\\w\\.\\-]+)"), // 钉钉PC端浏览器 new Browser("DingTalk-win", "dingtalk-win", "DingTalk\\(([\\d\\w\\.\\-]+)\\)"), // 钉钉内置浏览器 @@ -73,13 +73,17 @@ public class Browser extends UserAgent { // 淘宝内置浏览器 new Browser("Taobao", "taobao", "AliApp\\(TB\\/([\\d\\w\\.\\-]+)\\)"), // UC浏览器 - new Browser("UCBrowser", "UCBrowser", "UCBrowser\\/([\\d\\w\\.\\-]+)"), - // Quark浏览器 - new Browser("Quark", "Quark", "Quark\\/([\\d\\w\\.\\-]+)"), - // Lenovo浏览器 + new Browser("UCBrowser", "UC?Browser", "UC?Browser\\/([\\d\\w\\.\\-]+)"), + // XiaoMi 浏览器 + new Browser("MiuiBrowser", "MiuiBrowser|mibrowser", "MiuiBrowser\\/([\\d\\w\\.\\-]+)"), + // 夸克浏览器 + new Browser("Quark", "Quark", OTHER_VERSION), + // 联想浏览器 new Browser("Lenovo", "SLBrowser", "SLBrowser/([\\d\\w\\.\\-]+)"), new Browser("MSEdge", "Edge|Edg", "(?:edge|Edg|EdgA)\\/([\\d\\w\\.\\-]+)"), - new Browser("Chrome", "chrome", OTHER_VERSION), + // issues I7OTCU + new Browser("Chrome", "chrome|(iphone.*crios.*safari)", "(?:Chrome|CriOS)\\/([\\d\\w\\.\\-]+)"), + //new Browser("Chrome", "chrome", Other_Version), new Browser("Firefox", "firefox", OTHER_VERSION), new Browser("IEMobile", "iemobile", OTHER_VERSION), new Browser("Android Browser", "android", "version\\/([\\d\\w\\.\\-]+)"), @@ -96,43 +100,60 @@ public class Browser extends UserAgent { new Browser("Evolution", "evolution", OTHER_VERSION), new Browser("MSIE", "msie", "msie ([\\d\\w\\.\\-]+)"), new Browser("MSIE11", "rv:11", "rv:([\\d\\w\\.\\-]+)"), - new Browser("Gabble", "Gabble", "Gabble\\/([\\d\\w\\.\\-]+)"), + new Browser("Gabble", "Gabble", OTHER_VERSION), new Browser("Yammer Desktop", "AdobeAir", "([\\d\\w\\.\\-]+)\\/Yammer"), new Browser("Yammer Mobile", "Yammer[\\s]+([\\d\\w\\.\\-]+)", "Yammer[\\s]+([\\d\\w\\.\\-]+)"), new Browser("Apache HTTP Client", "Apache\\\\-HttpClient", "Apache\\-HttpClient\\/([\\d\\w\\.\\-]+)"), new Browser("BlackBerry", "BlackBerry", "BlackBerry[\\d]+\\/([\\d\\w\\.\\-]+)"), - // 小米浏览器 - new Browser("MiuiBrowser", "MiuiBrowser|mibrowser", "MiuiBrowser\\/([\\d\\w\\.\\-]+)") - + // issue#I847JY 百度浏览器 + new Browser("Baidu", "Baidu", "baiduboxapp\\/([\\d\\w\\.\\-]+)") ); - private Pattern versionPattern; + /** + * 匹配正则 + */ + private Pattern pattern; /** * 构造 * - * @param name 浏览器名称 - * @param regex 关键字或表达式 - * @param versionRegex 匹配版本的正则 + * @param name 浏览器名称 + * @param rule 关键字或表达式 + * @param regex 匹配版本的正则 */ - public Browser(String name, String regex, String versionRegex) { - super(name, regex); - if (OTHER_VERSION.equals(versionRegex)) { - versionRegex = name + versionRegex; + public Browser(final String name, final String rule, String regex) { + super(name, rule); + if (OTHER_VERSION.equals(regex)) { + regex = name + regex; } - if (null != versionRegex) { - this.versionPattern = Pattern.compile(versionRegex, Pattern.CASE_INSENSITIVE); + if (null != regex) { + this.pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); } } + + /** + * 添加自定义的浏览器类型 + * + * @param name 浏览器名称 + * @param rule 关键字或表达式 + * @param regex 匹配版本的正则 + */ + synchronized public static void addCustomBrowser(final String name, final String rule, final String regex) { + BROWERS.add(new Browser(name, rule, regex)); + } + /** * 获取浏览器版本 * - * @param agentString User-Agent字符串 + * @param text User-Agent字符串 * @return 版本 */ - public String getVersion(String agentString) { - return PatternKit.getGroup1(this.versionPattern, agentString); + public String getVersion(final String text) { + if (isUnknown()) { + return null; + } + return PatternKit.getGroup1(this.pattern, text); } /** @@ -141,7 +162,14 @@ public String getVersion(String agentString) { * @return 是否移动浏览器 */ public boolean isMobile() { - return "PSP".equals(this.getName()); + final String name = this.getName(); + return "PSP".equals(name) || + "Yammer Mobile".equals(name) || + "Android Browser".equals(name) || + "IEMobile".equals(name) || + "MicroMessenger".equals(name) || + "miniProgram".equals(name) || + "DingTalk".equals(name); } } diff --git a/bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Divice.java b/bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Device.java similarity index 69% rename from bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Divice.java rename to bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Device.java index 1636fb1e32..5003c0bdaa 100644 --- a/bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Divice.java +++ b/bus-http/src/main/java/org/miaixz/bus/http/metric/anget/Device.java @@ -28,9 +28,9 @@ package org.miaixz.bus.http.metric.anget; import org.miaixz.bus.core.lang.Normal; +import org.miaixz.bus.core.xyz.CollKit; import org.miaixz.bus.core.xyz.ListKit; -import java.util.ArrayList; import java.util.List; /** @@ -39,87 +39,81 @@ * @author Kimi Liu * @since Java 17+ */ -public class Divice extends UserAgent { +public class Device extends UserAgent { /** * 未知 */ - public static final Divice UNKNOWN = new Divice(Normal.UNKNOWN, null); + public static final Device UNKNOWN = new Device(Normal.UNKNOWN, null); /** - * iPhone + * Iphone */ - public static final Divice IPHONE = new Divice("iPhone", "iphone"); + public static final Device IPHONE = new Device("iPhone", "iphone"); /** - * iPod + * ipod */ - public static final Divice IPOD = new Divice("iPod", "ipod"); + public static final Device IPOD = new Device("iPod", "ipod"); /** - * iPad + * ipad */ - public static final Divice IPAD = new Divice("iPad", "ipad"); + public static final Device IPAD = new Device("iPad", "ipad"); /** - * Android + * android */ - public static final Divice ANDROID = new Divice("Android", "android"); + public static final Device ANDROID = new Device("Android", "android"); /** - * Android + * android */ - public static final Divice GOOGLE_TV = new Divice("GoogleTV", "googletv"); + public static final Device GOOGLE_TV = new Device("GoogleTV", "googletv"); /** * Windows Phone */ - public static final Divice WINDOWS_PHONE = new Divice("Windows Phone", "windows (ce|phone|mobile)( os)?"); + public static final Device WINDOWS_PHONE = new Device("Windows Phone", "windows (ce|phone|mobile)( os)?"); /** * 支持的移动平台类型 */ - public static final List MOBILE_DIVICES = ListKit.of( + public static final List MOBILE_DEVICE = ListKit.of( WINDOWS_PHONE, IPAD, IPOD, IPHONE, + new Device("Android", "XiaoMi|MI\\s+"), ANDROID, GOOGLE_TV, - new Divice("htcFlyer", "htc_flyer"), - new Divice("Symbian", "symbian(os)?"), - new Divice("Blackberry", "blackberry"), - new Divice("Android", "XiaoMi|MI\\s+") + new Device("htcFlyer", "htc_flyer"), + new Device("Symbian", "symbian(os)?"), + new Device("Blackberry", "blackberry") ); /** * 支持的桌面平台类型 */ - public static final List DESKTOP_DIVICES = ListKit.of( - new Divice("Windows", "windows"), - new Divice("Mac", "(macintosh|darwin)"), - new Divice("Linux", "linux"), - new Divice("Wii", "wii"), - new Divice("Playstation", "playstation"), - new Divice("Java", "java") + public static final List DESKTOP_DEVICE = ListKit.of( + new Device("Windows", "windows"), + new Device("Mac", "(macintosh|darwin)"), + new Device("Linux", "linux"), + new Device("Wii", "wii"), + new Device("Playstation", "playstation"), + new Device("Java", "java") ); /** * 支持的平台类型 */ - public static final List