Skip to content

Commit

Permalink
various stubs, more work towards httpclient
Browse files Browse the repository at this point in the history
  • Loading branch information
wagyourtail committed Jun 7, 2024
1 parent 286f52b commit 356f26f
Show file tree
Hide file tree
Showing 24 changed files with 1,173 additions and 28 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ Note that certain things like reflection and dynamic class definition downgradin
downgrading.
dynamic class definitions being things like `MethodHandles$Lookup#defineClass` and classloader shenanigans.

add my maven in `settings.gradle`:
~~add my maven in `settings.gradle`:~~
JvmDowngrader is now on the gradle plugin portal, so you can skip this step, unless you want to use a snapshot version.

```gradle
pluginManagement {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package xyz.wagyourtail.jvmdg.j11.impl;
package xyz.wagyourtail.jvmdg.j11.impl.http;


import xyz.wagyourtail.jvmdg.j11.stub.java_net_http.J_N_H_HttpClient;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package xyz.wagyourtail.jvmdg.j11.impl;
package xyz.wagyourtail.jvmdg.j11.impl.http;

import jdk.incubator.http.HttpRequest;
import xyz.wagyourtail.jvmdg.exc.MissingStubError;
import xyz.wagyourtail.jvmdg.j11.stub.java_net_http.J_N_H_HttpClient;
import xyz.wagyourtail.jvmdg.j11.stub.java_net_http.J_N_H_HttpResponse;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import java.io.IOException;
import java.net.Authenticator;
import java.net.CookieHandler;
import java.net.ProxySelector;
import java.time.Duration;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;


Expand Down Expand Up @@ -83,6 +88,19 @@ public Optional<Executor> executor() {
return Optional.ofNullable(executor);
}

//TODO
@Override
public <T> J_N_H_HttpResponse<T> send(HttpRequest var1, J_N_H_HttpResponse.BodyHandler<T> handler) throws IOException, InterruptedException {
throw MissingStubError.create();
}

@Override
public <T> CompletableFuture<J_N_H_HttpResponse<T>> sendAsync(HttpRequest var1, J_N_H_HttpResponse.BodyHandler<T> handler) {
throw MissingStubError.create();
}

@Override
public <T> CompletableFuture<J_N_H_HttpResponse<T>> sendAsync(HttpRequest var1, J_N_H_HttpResponse.BodyHandler<T> handler, J_N_H_HttpResponse.PushPromiseHandler<T> pushPromiseHandler) {
throw MissingStubError.create();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package xyz.wagyourtail.jvmdg.j11.impl.http;

import java.util.Iterator;
import java.util.concurrent.Flow;

public class IterablePublisher<T> implements Flow.Publisher<T> {
private final Iterable<T> iterable;
private final Throwable throwable;

public IterablePublisher(Iterable<T> iterable, Throwable throwable) {
this.iterable = iterable;
this.throwable = throwable;
}

public IterablePublisher(Iterable<T> iterable) {
this(iterable, null);
}

@Override
public void subscribe(Flow.Subscriber<? super T> subscriber) {
subscriber.onSubscribe(new Subscription(subscriber));
}

private class Subscription implements Flow.Subscription {
private final Flow.Subscriber<? super T> subscriber;
private final Iterator<T> iterator;
private volatile boolean completed;
private volatile boolean cancelled;
private volatile Throwable error;

public Subscription(Flow.Subscriber<? super T> subscriber) {
this.subscriber = subscriber;
this.iterator = iterable.iterator();
this.error = throwable;
}

@Override
public void request(long n) {
if (n <= 0) {
subscriber.onError(new IllegalArgumentException("n <= 0"));
return;
}
if (completed || cancelled) {
return;
}
if (error != null) {
completed = true;
subscriber.onError(error);
return;
}
try {
synchronized (this) {
for (long i = 0; i < n; i++) {
if (cancelled) {
break;
}
if (iterator.hasNext()) {
subscriber.onNext(iterator.next());
} else {
completed = true;
subscriber.onComplete();
break;
}
}
}
} catch (Throwable t) {
error = t;
subscriber.onError(t);
completed = true;
}
}

@Override
public void cancel() {
cancelled = true;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package xyz.wagyourtail.jvmdg.j11.impl.http;

import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.function.Supplier;

public class StreamIterator implements Iterator<ByteBuffer> {
public static final int BUFSIZE = Integer.parseInt(System.getProperty("jdk.httpclient.bufsize", "16384"));

final InputStream is;
final Supplier<? extends ByteBuffer> bufSupplier;
private volatile boolean eof;
volatile ByteBuffer nextBuffer;
volatile boolean need2Read = true;
volatile boolean haveNext;

public StreamIterator(InputStream is) {
this(is, () -> ByteBuffer.allocate(BUFSIZE));
}

StreamIterator(InputStream is, Supplier<? extends ByteBuffer> bufSupplier) {
this.is = is;
this.bufSupplier = bufSupplier;
}

// Throwable error() {
// return error;
// }

private int read() throws IOException {
if (eof)
return -1;
nextBuffer = bufSupplier.get();
nextBuffer.clear();
byte[] buf = nextBuffer.array();
int offset = nextBuffer.arrayOffset();
int cap = nextBuffer.capacity();
int n = is.read(buf, offset, cap);
if (n == -1) {
eof = true;
return -1;
}
//flip
nextBuffer.limit(n);
nextBuffer.position(0);
return n;
}

/**
* Close stream in this instance.
* UncheckedIOException may be thrown if IOE happens at InputStream::close.
*/
private void closeStream() {
try {
is.close();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

@Override
public synchronized boolean hasNext() {
if (need2Read) {
try {
haveNext = read() != -1;
if (haveNext) {
need2Read = false;
}
} catch (IOException e) {
haveNext = false;
need2Read = false;
throw new UncheckedIOException(e);
} finally {
if (!haveNext) {
closeStream();
}
}
}
return haveNext;
}

@Override
public synchronized ByteBuffer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
need2Read = true;
return nextBuffer;
}

}
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package xyz.wagyourtail.jvmdg.j11.stub.java_net_http;


import xyz.wagyourtail.jvmdg.j11.impl.HttpClientBuilderImpl;
import jdk.incubator.http.HttpRequest;
import xyz.wagyourtail.jvmdg.j11.impl.http.HttpClientBuilderImpl;
import xyz.wagyourtail.jvmdg.version.Adapter;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import java.io.IOException;
import java.net.Authenticator;
import java.net.CookieHandler;
import java.net.ProxySelector;
import java.time.Duration;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;

@Adapter("Ljava/net/http/HttpClient;")
Expand Down Expand Up @@ -43,6 +46,12 @@ public static Builder newBuilder() {

public abstract Optional<Executor> executor();

public abstract <T> J_N_H_HttpResponse<T> send(HttpRequest var1, J_N_H_HttpResponse.BodyHandler<T> handler) throws IOException, InterruptedException;

public abstract <T>CompletableFuture<J_N_H_HttpResponse<T>> sendAsync(HttpRequest var1, J_N_H_HttpResponse.BodyHandler<T> handler);

public abstract <T> CompletableFuture<J_N_H_HttpResponse<T>> sendAsync(HttpRequest var1, J_N_H_HttpResponse.BodyHandler<T> handler, J_N_H_HttpResponse.PushPromiseHandler<T> pushPromiseHandler);

@Adapter("Ljava/net/http/HttpClient$Redirect;")
public enum Redirect {
NEVER,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package xyz.wagyourtail.jvmdg.j11.stub.java_net_http;

import xyz.wagyourtail.jvmdg.version.Adapter;

@Adapter("Ljava/net/http/HttpHeaders;")
public class J_N_H_HttpHeaders {
}
Loading

0 comments on commit 356f26f

Please sign in to comment.