@Override public NextAction handleWrite(FilterChainContext context) throws IOException { Connection<?> connection = context.getConnection(); GrizzlyChannel channel = GrizzlyChannel.getOrAddChannel(connection, url, handler); try { ChannelBuffer channelBuffer = ChannelBuffers.dynamicBuffer(1024); // Do not need to close Object msg = context.getMessage(); codec.encode(channel, channelBuffer, msg); GrizzlyChannel.removeChannelIfDisconnected(connection); Buffer buffer = connection.getTransport().getMemoryManager().allocate(channelBuffer.readableBytes()); buffer.put(channelBuffer.toByteBuffer()); buffer.flip(); buffer.allowBufferDispose(true); context.setMessage(buffer); } finally { GrizzlyChannel.removeChannelIfDisconnected(connection); } return context.getInvokeAction(); }
@Override public NextAction handleRead(FilterChainContext context) throws IOException { Object message = context.getMessage(); Connection<?> connection = context.getConnection(); Channel channel = GrizzlyChannel.getOrAddChannel(connection, url, handler); try { previousData.writeBytes(grizzlyBuffer.toByteBuffer()); frame = previousData; } else { int size = previousData.readableBytes() + grizzlyBuffer.remaining(); frame = ChannelBuffers.dynamicBuffer(size > bufferSize ? size : bufferSize); frame.writeBytes(previousData, previousData.readableBytes()); frame.writeBytes(grizzlyBuffer.toByteBuffer()); return context.getStopAction(); } else { if (savedReadIndex == frame.readerIndex()) { context.setMessage(msg); return context.getInvokeAction(); } else { return context.getInvokeAction(); return context.getInvokeAction();
@Override public NextAction handleWrite(FilterChainContext ctx) throws IOException { Connection<?> connection = ctx.getConnection(); GrizzlyChannel channel = GrizzlyChannel.getOrAddChannel(connection, url, handler); try { handler.sent(channel, ctx.getMessage()); } catch (RemotingException e) { throw new IOException(StringUtils.toString(e)); } finally { GrizzlyChannel.removeChannelIfDisconnected(connection); } return ctx.getInvokeAction(); }
@Override public NextAction handleConnect(FilterChainContext ctx) throws IOException { Connection<?> connection = ctx.getConnection(); GrizzlyChannel channel = GrizzlyChannel.getOrAddChannel(connection, url, handler); try { handler.connected(channel); } catch (RemotingException e) { throw new IOException(StringUtils.toString(e)); } finally { GrizzlyChannel.removeChannelIfDisconnected(connection); } return ctx.getInvokeAction(); }
private void sendMoreDataRequestIfNeeded(final FilterChainContext ctx) throws IOException { final Connection connection = ctx.getConnection(); final HttpContext context = HttpContext.get(ctx); // Check if message is still in process if (httpRequestInProcessAttr.isSet(context)) { final MemoryManager mm = connection.getTransport().getMemoryManager(); final Buffer buffer = mm.allocate(7); buffer.put((byte) 'A'); buffer.put((byte) 'B'); buffer.putShort((short) 3); buffer.put(AjpConstants.JK_AJP13_GET_BODY_CHUNK); buffer.putShort(AjpConstants.SUGGESTED_MAX_PAYLOAD_SIZE); buffer.flip(); buffer.allowBufferDispose(true); ctx.write(buffer); } }
private static NextAction handleClientHandShake(FilterChainContext ctx, HttpContent content) { final WebSocketHolder holder = WebSocketHolder.get(ctx.getConnection()); holder.handshake.validateServerResponse((HttpResponsePacket) content.getHttpHeader()); holder.webSocket.onConnect(); if (content.getContent().hasRemaining()) { return ctx.getRerunFilterAction(); } else { content.recycle(); return ctx.getStopAction(); } } }
private void sendEndResponse(final FilterChainContext ctx) throws IOException { final Connection connection = ctx.getConnection(); final MemoryManager mm = connection.getTransport().getMemoryManager(); final Buffer buffer = mm.allocate(6); buffer.put((byte) 'A'); buffer.put((byte) 'B'); buffer.putShort((short) 2); buffer.put(AjpConstants.JK_AJP13_END_RESPONSE); buffer.put((byte) 1); buffer.flip(); buffer.allowBufferDispose(true); ctx.write(buffer); }
@Override public NextAction handleWrite(final FilterChainContext ctx) throws IOException { final Object message = ctx.getMessage(); if (message instanceof HttpTransactionContext) { ctx.setMessage(null); if (!sendAsGrizzlyRequest((HttpTransactionContext) message, ctx)) { return ctx.getSuspendAction(); } else { return ctx.getStopAction(); } } return ctx.getInvokeAction(); }
throws IOException { final MemoryManager mm = ctx.getMemoryManager(); Buffer buffer = mm.allocate(512); final byte[] b = new byte[512]; if (read > buffer.remaining()) { buffer = mm.reallocate(buffer, buffer.capacity() + 512); buffer.put(b, 0, read); buffer.trim(); if (buffer.hasRemaining()) { final HttpContent content = requestPacket.httpContentBuilder() .content(buffer) .last(true) .build(); buffer.allowBufferDispose(false); ctx.write(content, ((!requestPacket.isCommitted()) ? ctx.getTransportContext().getCompletionHandler() : null));
@Override public NextAction handleWrite(final FilterChainContext ctx) throws IOException { final Message message = ctx.getMessage(); final MemoryManager mm = ctx.getConnection().getTransport().getMemoryManager(); com.sun.enterprise.mgmt.transport.buffers.Buffer buffer = message.getPlainBuffer( Grizzly2ExpandableBufferWriter.createFactory(mm)); ctx.setMessage(buffer.underlying()); return ctx.getInvokeAction(); }
final long len = bodyLocal.getContentLength(); if (len >= 0) { requestPacket.setContentLengthLong(len); } else { requestPacket.setChunked(true); final MemoryManager mm = ctx.getMemoryManager(); boolean last = false; buffer.allowBufferDispose(true); final long readBytes = bodyLocal.read(buffer.toByteBuffer()); if (readBytes > 0) { buffer.position((int) readBytes); buffer.trim(); } else { requestPacket.httpContentBuilder().content(buffer). last(last).build(); ctx.write(content, ((!requestPacket.isCommitted()) ? ctx.getTransportContext().getCompletionHandler() : null));
private int extractType(final FilterChainContext ctx, final Buffer buffer) { return !httpRequestInProcessAttr.isSet(ctx.getConnection()) ? // if request is no in process - it should be a new Ajp message buffer.get() & 0xFF : // Ajp Data Packet AjpConstants.JK_AJP13_DATA; } }
@Override public Result find(final PUContext puContext, final FilterChainContext ctx) { final Buffer buffer = ctx.getMessage(); try { final int expectedLength = getSSLPacketSize(buffer); if (expectedLength == -1 || buffer.remaining() < expectedLength) { return Result.NEED_MORE_DATA; } } catch (SSLException e) { LOGGER.log(Level.FINE, "Packet header is not SSL", e); return Result.NOT_FOUND; } return Result.FOUND; } }
@Override public NextAction handleEvent(final FilterChainContext ctx, final FilterChainEvent event) throws IOException { if (event.type() == HttpEvents.ChangePacketInProgressEvent.TYPE) { final HttpResponsePacket responsePacket = (HttpResponsePacket) ((HttpEvents.ChangePacketInProgressEvent) event).getPacket(); httpResponseInProcessAttr.set( responsePacket.getProcessingState().getHttpContext(), responsePacket); return ctx.getStopAction(); } else { return super.handleEvent(ctx, event); } }
@Override public NextAction handleEvent(final FilterChainContext ctx, final FilterChainEvent event) throws IOException { if (event.type() == SSLSwitchingEvent.class) { final SSLSwitchingEvent se = (SSLSwitchingEvent) event; final boolean isSecure = se.isSecure(); CONNECTION_IS_SECURE.set(se.getConnection(), isSecure); // if enabling security - create SSLEngine here, because default // Grizzly SSLFilter will use host/port info from the Connection, rather // than request URL. Specifically this doesn't work with CONNECT tunnels. if (isSecure && SSLUtils.getSSLEngine(ctx.getConnection()) == null) { // if SSLEngine is not yet set for the connection - initialize it final SSLEngine sslEngine = getClientSSLEngineConfigurator() .createSSLEngine(se.getHost(), se.getPort() == -1 ? 443 : se.getPort() ); sslEngine.beginHandshake(); SSLUtils.setSSLEngine(ctx.getConnection(), sslEngine); } return ctx.getStopAction(); } return ctx.getInvokeAction(); }
private boolean sendAsGrizzlyRequest(final HttpTransactionContext httpTxCtx, final FilterChainContext ctx) throws IOException { final Connection connection = ctx.getConnection(); final boolean isUsedConnection = Boolean.TRUE.equals(USED_CONNECTION.get(connection)); if (!isUsedConnection) { USED_CONNECTION.set(connection, Boolean.TRUE); final HttpRequestPacket.Builder builder = HttpRequestPacket.builder() .protocol(Protocol.HTTP_1_1) .method(method); httpTxCtx.protocolHandler = Version.RFC6455.createHandler(true); httpTxCtx.handshake = httpTxCtx.protocolHandler.createClientHandShake(wsURI); requestPacket = (HttpRequestPacket) httpTxCtx.handshake.composeHeaders().getHttpHeader(); } catch (URISyntaxException e) { throw new IllegalArgumentException("Invalid WS URI: " + httpTxCtx.wsRequestURI); requestPacket.setSecure(secure); setupKeepAlive(requestPacket, connection); ctx.notifyDownstream(new SSLSwitchingEvent(connection, secure, uri.getHost(), uri.getPort()));
private void write(FilterChainContext ctx, UpgradeResponse response) { final HttpResponsePacket responsePacket = ((HttpRequestPacket) ((HttpContent) ctx.getMessage()).getHttpHeader()).getResponse(); responsePacket.setProtocol(Protocol.HTTP_1_1); responsePacket.setStatus(response.getStatus()); // TODO // responsePacket.setReasonPhrase(response.getReasonPhrase()); for (Map.Entry<String, List<String>> entry : response.getHeaders().entrySet()) { responsePacket.setHeader(entry.getKey(), Utils.getHeaderFromList(entry.getValue())); } ctx.write(HttpContent.builder(responsePacket).build()); }
@Override public NextAction handleEvent(final FilterChainContext ctx, final FilterChainEvent event) throws IOException { // if downstream event - pass it to the puFilter if (isDownstream(ctx)) { final FilterChainContext suspendedParentContext = puFilter.suspendedContextAttribute.get(ctx); assert suspendedParentContext != null; suspendedParentContext.notifyDownstream(event); } return ctx.getInvokeAction(); }
final Body bodyLocal = feedableBodyGenerator.createBody(); try { final MemoryManager mm = ctx.getMemoryManager(); boolean last = false; while (!last) { Buffer buffer = mm.allocate(PayloadGenerator.MAX_CHUNK_SIZE); buffer.allowBufferDispose(true); final long readBytes = bodyLocal.read(buffer.toByteBuffer()); if (readBytes > 0) { buffer.position((int) readBytes); buffer.trim(); } else {
HttpTransactionContext.bind(httpCtx, httpTxCtx); requestPacket.getProcessingState().setHttpContext(httpCtx); httpCtx.attach(ctx); requestPacket.setConnection(ctx.getConnection()); httpTxCtx.payloadGenerator = payloadGenerator; if (LOGGER.isDebugEnabled()) { LOGGER.debug("REQUEST: " + requestPacket.toString()); LOGGER.debug("REQUEST: " + requestPacket.toString()); ctx.write(requestPacket, ctx.getTransportContext().getCompletionHandler());