![JAR search and dependency download from the Maven repository](/logo.png)
org.eclipse.jetty.fcgi.server.internal.ServerFCGIConnection Maven / Gradle / Ivy
The newest version!
//
// ========================================================================
// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//
package org.eclipse.jetty.fcgi.server.internal;
import java.nio.ByteBuffer;
import java.util.Set;
import java.util.concurrent.TimeoutException;
import org.eclipse.jetty.fcgi.FCGI;
import org.eclipse.jetty.fcgi.generator.Flusher;
import org.eclipse.jetty.fcgi.generator.ServerGenerator;
import org.eclipse.jetty.fcgi.parser.ServerParser;
import org.eclipse.jetty.http.BadMessageException;
import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Content;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.server.AbstractMetaDataConnection;
import org.eclipse.jetty.server.ConnectionMetaData;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.util.Attributes;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.thread.ThreadPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ServerFCGIConnection extends AbstractMetaDataConnection implements ConnectionMetaData
{
private static final Logger LOG = LoggerFactory.getLogger(ServerFCGIConnection.class);
private final Callback fillableCallback = new FillableCallback();
private final HttpChannel.Factory httpChannelFactory = new HttpChannel.DefaultFactory();
private final Attributes attributes = new Lazy();
private final Connector connector;
private final ByteBufferPool bufferPool;
private final boolean sendStatus200;
private final Flusher flusher;
private final ServerParser parser;
private final String id;
private boolean useInputDirectByteBuffers;
private boolean useOutputDirectByteBuffers;
private RetainableByteBuffer inputBuffer;
private HttpStreamOverFCGI stream;
public ServerFCGIConnection(Connector connector, EndPoint endPoint, HttpConfiguration configuration, boolean sendStatus200)
{
super(connector, configuration, endPoint);
this.connector = connector;
this.bufferPool = connector.getByteBufferPool();
this.flusher = new Flusher(endPoint);
this.sendStatus200 = sendStatus200;
this.parser = new ServerParser(new ServerListener());
this.id = StringUtil.randomAlphaNumeric(16);
}
public long getBeginNanoTime()
{
return parser.getBeginNanoTime();
}
Flusher getFlusher()
{
return flusher;
}
public boolean isUseInputDirectByteBuffers()
{
return useInputDirectByteBuffers;
}
public void setUseInputDirectByteBuffers(boolean useInputDirectByteBuffers)
{
this.useInputDirectByteBuffers = useInputDirectByteBuffers;
}
public boolean isUseOutputDirectByteBuffers()
{
return useOutputDirectByteBuffers;
}
public void setUseOutputDirectByteBuffers(boolean useOutputDirectByteBuffers)
{
this.useOutputDirectByteBuffers = useOutputDirectByteBuffers;
}
@Override
public String getId()
{
return id;
}
@Override
public HttpVersion getHttpVersion()
{
return HttpVersion.HTTP_1_1;
}
@Override
public String getProtocol()
{
return "fcgi/1.0";
}
@Override
public boolean isPersistent()
{
return true;
}
@Override
public boolean isSecure()
{
return false;
}
@Override
public Object removeAttribute(String name)
{
return attributes.removeAttribute(name);
}
@Override
public Object setAttribute(String name, Object attribute)
{
return attributes.setAttribute(name, attribute);
}
@Override
public Object getAttribute(String name)
{
return attributes.getAttribute(name);
}
@Override
public Set getAttributeNameSet()
{
return attributes.getAttributeNameSet();
}
@Override
public void clearAttributes()
{
attributes.clearAttributes();
}
@Override
public void onOpen()
{
super.onOpen();
fillInterested(fillableCallback);
}
@Override
public void onFillable()
{
if (LOG.isDebugEnabled())
LOG.debug(">>onFillable enter {} {} {}", this, stream, inputBuffer);
acquireInputBuffer();
try
{
while (true)
{
int read = fillInputBuffer();
if (LOG.isDebugEnabled())
LOG.debug("Read {} bytes from {} {}", read, getEndPoint(), this);
if (read > 0)
{
// The inputBuffer cannot be released immediately after parse()
// even if the buffer has been fully consumed because releaseInputBuffer()
// must be called as the last release for it to be able to null out the
// inputBuffer field exactly when the latter isn't used anymore.
if (parse(inputBuffer.getByteBuffer()))
return;
}
else if (read == 0)
{
releaseInputBuffer();
fillInterested(fillableCallback);
return;
}
else
{
releaseInputBuffer();
shutdown();
return;
}
}
}
catch (Exception x)
{
if (LOG.isDebugEnabled())
LOG.debug("Unable to fill endpoint", x);
inputBuffer.clear();
releaseInputBuffer();
// TODO: fail and close ?
}
finally
{
if (LOG.isDebugEnabled())
LOG.debug("<
© 2015 - 2025 Weber Informatics LLC | Privacy Policy