diff --git a/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java b/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java index 715089d968f..08871d26658 100644 --- a/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java +++ b/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java @@ -77,11 +77,10 @@ public class ClientGenerator extends Generator int maxCapacity = 4 + 4 + 2 * MAX_PARAM_LENGTH; // One FCGI_BEGIN_REQUEST + N FCGI_PARAMS + one last FCGI_PARAMS - Result result = new Result(byteBufferPool, callback); ByteBuffer beginRequestBuffer = byteBufferPool.acquire(16, false); BufferUtil.clearToFill(beginRequestBuffer); - result.add(beginRequestBuffer, true); + Result result = new Result(byteBufferPool, callback, beginRequestBuffer, true); // Generate the FCGI_BEGIN_REQUEST frame beginRequestBuffer.putInt(0x01_01_00_00 + request); @@ -95,7 +94,7 @@ public class ClientGenerator extends Generator int capacity = 8 + Math.min(maxCapacity, fieldsLength); ByteBuffer buffer = byteBufferPool.acquire(capacity, true); BufferUtil.clearToFill(buffer); - result.add(buffer, true); + result = result.append(buffer, true); // Generate the FCGI_PARAMS frame buffer.putInt(0x01_04_00_00 + request); @@ -133,7 +132,7 @@ public class ClientGenerator extends Generator ByteBuffer lastParamsBuffer = byteBufferPool.acquire(8, false); BufferUtil.clearToFill(lastParamsBuffer); - result.add(lastParamsBuffer, true); + result = result.append(lastParamsBuffer, true); // Generate the last FCGI_PARAMS frame lastParamsBuffer.putInt(0x01_04_00_00 + request); @@ -160,6 +159,6 @@ public class ClientGenerator extends Generator public Result generateRequestContent(int request, ByteBuffer content, boolean lastContent, Callback callback) { - return generateContent(request, content, lastContent, callback, FCGI.FrameType.STDIN); + return generateContent(request, content, false, lastContent, callback, FCGI.FrameType.STDIN); } } diff --git a/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/Flusher.java b/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/Flusher.java index e4b9b65c5eb..506d91099f0 100644 --- a/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/Flusher.java +++ b/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/Flusher.java @@ -83,8 +83,8 @@ public class Flusher result = queue.poll(); } active = result; - List buffers = result.getByteBuffers(); - endPoint.write(this, buffers.toArray(new ByteBuffer[buffers.size()])); + ByteBuffer[] buffers = result.getByteBuffers(); + endPoint.write(this, buffers); return false; } @@ -133,7 +133,7 @@ public class Flusher { private ShutdownResult() { - super(null, new Adapter()); + super(null, null, null, false); } @Override diff --git a/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java b/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java index 1a578f1d5ad..b0ddaf0463f 100644 --- a/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java +++ b/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java @@ -19,8 +19,6 @@ package org.eclipse.jetty.fcgi.generator; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; import org.eclipse.jetty.fcgi.FCGI; import org.eclipse.jetty.io.ByteBufferPool; @@ -38,18 +36,18 @@ public class Generator this.byteBufferPool = byteBufferPool; } - protected Result generateContent(int id, ByteBuffer content, boolean lastContent, Callback callback, FCGI.FrameType frameType) + protected Result generateContent(int id, ByteBuffer content, boolean recycle, boolean lastContent, Callback callback, FCGI.FrameType frameType) { id &= 0xFF_FF; int remaining = content == null ? 0 : content.remaining(); - Result result = new Result(byteBufferPool, callback); + Result result = new Result(byteBufferPool, callback, null, false); while (remaining > 0 || lastContent) { ByteBuffer buffer = byteBufferPool.acquire(8, false); BufferUtil.clearToFill(buffer); - result.add(buffer, true); + result = result.append(buffer, true); // Generate the frame header buffer.put((byte)0x01); @@ -67,7 +65,7 @@ public class Generator int limit = content.limit(); content.limit(content.position() + length); ByteBuffer slice = content.slice(); - result.add(slice, false); + result = result.append(slice, recycle); content.position(content.limit()); content.limit(limit); remaining -= length; @@ -80,60 +78,68 @@ public class Generator { private final ByteBufferPool byteBufferPool; private final Callback callback; - private final List buffers; - private final List recycles; + private final ByteBuffer buffer; + private final boolean recycle; + private final Result previous; - public Result(ByteBufferPool byteBufferPool, Callback callback) + public Result(ByteBufferPool byteBufferPool, Callback callback, ByteBuffer buffer, boolean recycle) { - this(byteBufferPool, callback, new ArrayList(4), new ArrayList(4)); + this(byteBufferPool, callback, buffer, recycle, null); } - public Result(Result that) - { - this(that.byteBufferPool, that.callback, that.buffers, that.recycles); - } - - private Result(ByteBufferPool byteBufferPool, Callback callback, List buffers, List recycles) + private Result(ByteBufferPool byteBufferPool, Callback callback, ByteBuffer buffer, boolean recycle, Result previous) { this.byteBufferPool = byteBufferPool; this.callback = callback; - this.buffers = buffers; - this.recycles = recycles; + this.buffer = buffer; + this.recycle = recycle; + this.previous = previous; } - public void add(ByteBuffer buffer, boolean recycle) + public Result append(ByteBuffer buffer, boolean recycle) { - buffers.add(buffer); - recycles.add(recycle); + return new Result(byteBufferPool, null, buffer, recycle, this); } - public List getByteBuffers() + public ByteBuffer[] getByteBuffers() { - return buffers; + return getByteBuffers(0); + } + + private ByteBuffer[] getByteBuffers(int length) + { + int newLength = length + (buffer == null ? 0 : 1); + ByteBuffer[] result; + result = previous != null ? previous.getByteBuffers(newLength) : new ByteBuffer[newLength]; + if (buffer != null) + result[result.length - newLength] = buffer; + return result; } @Override public void succeeded() { recycle(); - callback.succeeded(); + if (previous != null) + previous.succeeded(); + if (callback != null) + callback.succeeded(); } @Override public void failed(Throwable x) { recycle(); - callback.failed(x); + if (previous != null) + previous.failed(x); + if (callback != null) + callback.failed(x); } protected void recycle() { - for (int i = 0; i < buffers.size(); ++i) - { - ByteBuffer buffer = buffers.get(i); - if (recycles.get(i)) - byteBufferPool.release(buffer); - } + if (recycle) + byteBufferPool.release(buffer); } } } diff --git a/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java b/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java index 2d4fdf12218..d9f51e2d17b 100644 --- a/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java +++ b/fcgi-core/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java @@ -85,20 +85,12 @@ public class ServerGenerator extends Generator buffer.flip(); - return new Result(generateContent(request, buffer, false, callback, FCGI.FrameType.STDOUT)) - { - @Override - protected void recycle() - { - super.recycle(); - byteBufferPool.release(buffer); - } - }; + return generateContent(request, buffer, true, false, callback, FCGI.FrameType.STDOUT); } public Result generateResponseContent(int request, ByteBuffer content, boolean lastContent, Callback callback) { - Result result = generateContent(request, content, lastContent, callback, FCGI.FrameType.STDOUT); + Result result = generateContent(request, content, false, lastContent, callback, FCGI.FrameType.STDOUT); if (lastContent) { // Generate the FCGI_END_REQUEST @@ -109,7 +101,7 @@ public class ServerGenerator extends Generator endRequestBuffer.putInt(0x00_08_00_00); endRequestBuffer.putLong(0x00L); endRequestBuffer.flip(); - result.add(endRequestBuffer, true); + result = result.append(endRequestBuffer, true); } return result; } diff --git a/fcgi-http-client-transport/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java b/fcgi-http-client-transport/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java index b8c198789b1..c54bf0eef9a 100644 --- a/fcgi-http-client-transport/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java +++ b/fcgi-http-client-transport/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java @@ -38,7 +38,7 @@ public class HttpClientTransportOverFCGI extends AbstractHttpClientTransport public HttpClientTransportOverFCGI(String scriptRoot) { - this(Runtime.getRuntime().availableProcessors() / 2 + 1, false, scriptRoot); + this(Math.max(1, Runtime.getRuntime().availableProcessors() / 2), false, scriptRoot); } public HttpClientTransportOverFCGI(int selectors, boolean multiplexed, String scriptRoot) diff --git a/fcgi-http-client-transport/src/test/resources/jetty-logging.properties b/fcgi-http-client-transport/src/test/resources/jetty-logging.properties index 11c27cfd24f..b8df62d071d 100644 --- a/fcgi-http-client-transport/src/test/resources/jetty-logging.properties +++ b/fcgi-http-client-transport/src/test/resources/jetty-logging.properties @@ -1,3 +1,3 @@ org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog -org.eclipse.jetty.client.LEVEL=DEBUG -org.eclipse.jetty.fcgi.LEVEL=DEBUG +#org.eclipse.jetty.client.LEVEL=DEBUG +#org.eclipse.jetty.fcgi.LEVEL=DEBUG diff --git a/fcgi-proxy/src/test/resources/jetty-logging.properties b/fcgi-proxy/src/test/resources/jetty-logging.properties index 11c27cfd24f..b8df62d071d 100644 --- a/fcgi-proxy/src/test/resources/jetty-logging.properties +++ b/fcgi-proxy/src/test/resources/jetty-logging.properties @@ -1,3 +1,3 @@ org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog -org.eclipse.jetty.client.LEVEL=DEBUG -org.eclipse.jetty.fcgi.LEVEL=DEBUG +#org.eclipse.jetty.client.LEVEL=DEBUG +#org.eclipse.jetty.fcgi.LEVEL=DEBUG diff --git a/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpChannelOverFCGI.java b/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpChannelOverFCGI.java index dfdcc75b72c..24c0b5b04cb 100644 --- a/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpChannelOverFCGI.java +++ b/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpChannelOverFCGI.java @@ -60,7 +60,7 @@ public class HttpChannelOverFCGI extends HttpChannel { if (FCGI.Headers.REQUEST_METHOD.equalsIgnoreCase(field.getName())) method = field.getValue(); - else if (FCGI.Headers.REQUEST_URI.equalsIgnoreCase(field.getName())) + else if (FCGI.Headers.DOCUMENT_URI.equalsIgnoreCase(field.getName())) path = field.getValue(); else if (FCGI.Headers.QUERY_STRING.equalsIgnoreCase(field.getName())) query = field.getValue();