113 lines
3.3 KiB
Java
113 lines
3.3 KiB
Java
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
* (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package org.apache.tomcat.websocket;
|
|
|
|
import java.io.IOException;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.channels.AsynchronousSocketChannel;
|
|
import java.nio.channels.CompletionHandler;
|
|
import java.util.concurrent.ExecutionException;
|
|
import java.util.concurrent.Future;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeoutException;
|
|
|
|
/**
|
|
* Generally, just passes calls straight to the wrapped
|
|
* {@link AsynchronousSocketChannel}. In some cases exceptions may be swallowed
|
|
* to save them being swallowed by the calling code.
|
|
*/
|
|
public class AsyncChannelWrapperNonSecure implements AsyncChannelWrapper {
|
|
|
|
private static final Future<Void> NOOP_FUTURE = new NoOpFuture();
|
|
|
|
private final AsynchronousSocketChannel socketChannel;
|
|
|
|
public AsyncChannelWrapperNonSecure(
|
|
AsynchronousSocketChannel socketChannel) {
|
|
this.socketChannel = socketChannel;
|
|
}
|
|
|
|
@Override
|
|
public Future<Integer> read(ByteBuffer dst) {
|
|
return socketChannel.read(dst);
|
|
}
|
|
|
|
@Override
|
|
public <B,A extends B> void read(ByteBuffer dst, A attachment,
|
|
CompletionHandler<Integer,B> handler) {
|
|
socketChannel.read(dst, attachment, handler);
|
|
}
|
|
|
|
@Override
|
|
public Future<Integer> write(ByteBuffer src) {
|
|
return socketChannel.write(src);
|
|
}
|
|
|
|
@Override
|
|
public <B,A extends B> void write(ByteBuffer[] srcs, int offset, int length,
|
|
long timeout, TimeUnit unit, A attachment,
|
|
CompletionHandler<Long,B> handler) {
|
|
socketChannel.write(
|
|
srcs, offset, length, timeout, unit, attachment, handler);
|
|
}
|
|
|
|
@Override
|
|
public void close() {
|
|
try {
|
|
socketChannel.close();
|
|
} catch (IOException e) {
|
|
// Ignore
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Future<Void> handshake() {
|
|
return NOOP_FUTURE;
|
|
}
|
|
|
|
|
|
private static final class NoOpFuture implements Future<Void> {
|
|
|
|
@Override
|
|
public boolean cancel(boolean mayInterruptIfRunning) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean isCancelled() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean isDone() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public Void get() throws InterruptedException, ExecutionException {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Void get(long timeout, TimeUnit unit)
|
|
throws InterruptedException, ExecutionException,
|
|
TimeoutException {
|
|
return null;
|
|
}
|
|
}
|
|
}
|