|
|
@@ -43,29 +43,94 @@ |
|
|
|
|
|
|
|
package org.eclipse.jgit.http.test.util; |
|
|
|
|
|
|
|
import org.eclipse.jetty.server.DispatcherType; |
|
|
|
import org.eclipse.jetty.server.Request; |
|
|
|
import org.eclipse.jetty.server.Response; |
|
|
|
import org.eclipse.jetty.server.handler.HandlerWrapper; |
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.concurrent.Semaphore; |
|
|
|
|
|
|
|
import org.eclipse.jetty.server.Request; |
|
|
|
import org.eclipse.jetty.server.RequestLog; |
|
|
|
import org.eclipse.jetty.server.Response; |
|
|
|
import org.eclipse.jetty.util.component.AbstractLifeCycle; |
|
|
|
import javax.servlet.ServletException; |
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
|
|
|
|
/** Logs request made through {@link AppServer}. */ |
|
|
|
class TestRequestLog extends AbstractLifeCycle implements RequestLog { |
|
|
|
private final List<AccessEvent> events = new ArrayList<AccessEvent>(); |
|
|
|
|
|
|
|
/** Reset the log back to its original empty state. */ |
|
|
|
synchronized void clear() { |
|
|
|
events.clear(); |
|
|
|
} |
|
|
|
|
|
|
|
/** @return all of the events made since the last clear. */ |
|
|
|
synchronized List<AccessEvent> getEvents() { |
|
|
|
return events; |
|
|
|
} |
|
|
|
|
|
|
|
public synchronized void log(Request request, Response response) { |
|
|
|
events.add(new AccessEvent(request, response)); |
|
|
|
} |
|
|
|
class TestRequestLog extends HandlerWrapper { |
|
|
|
private static final int MAX = 16; |
|
|
|
|
|
|
|
private final List<AccessEvent> events = new ArrayList<AccessEvent>(); |
|
|
|
|
|
|
|
private final Semaphore active = new Semaphore(MAX); |
|
|
|
|
|
|
|
/** Reset the log back to its original empty state. */ |
|
|
|
void clear() { |
|
|
|
try { |
|
|
|
for (;;) { |
|
|
|
try { |
|
|
|
active.acquire(MAX); |
|
|
|
break; |
|
|
|
} catch (InterruptedException e) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
synchronized (events) { |
|
|
|
events.clear(); |
|
|
|
} |
|
|
|
} finally { |
|
|
|
active.release(MAX); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** @return all of the events made since the last clear. */ |
|
|
|
List<AccessEvent> getEvents() { |
|
|
|
try { |
|
|
|
for (;;) { |
|
|
|
try { |
|
|
|
active.acquire(MAX); |
|
|
|
break; |
|
|
|
} catch (InterruptedException e) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
synchronized (events) { |
|
|
|
return events; |
|
|
|
} |
|
|
|
} finally { |
|
|
|
active.release(MAX); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void handle(String target, Request baseRequest, HttpServletRequest request, |
|
|
|
HttpServletResponse response) throws IOException, ServletException { |
|
|
|
try { |
|
|
|
for (;;) { |
|
|
|
try { |
|
|
|
active.acquire(); |
|
|
|
break; |
|
|
|
} catch (InterruptedException e) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
super.handle(target, baseRequest, request, response); |
|
|
|
|
|
|
|
if (DispatcherType.REQUEST.equals(baseRequest.getDispatcherType())) |
|
|
|
log((Request) request, (Response) response); |
|
|
|
|
|
|
|
} finally { |
|
|
|
active.release(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void log(Request request, Response response) { |
|
|
|
synchronized (events) { |
|
|
|
events.add(new AccessEvent(request, response)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |