Merge lp:~tjoneslo/akiban-server/add-http-session-table into lp:~akiban-technologies/akiban-server/trunk

Proposed by Thomas Jones-Low
Status: Merged
Approved by: Mike McMahon
Approved revision: 2646
Merged at revision: 2653
Proposed branch: lp:~tjoneslo/akiban-server/add-http-session-table
Merge into: lp:~akiban-technologies/akiban-server/trunk
Diff against target: 536 lines (+400/-8)
5 files modified
src/main/java/com/akiban/http/HttpConductorImpl.java (+81/-6)
src/main/java/com/akiban/http/SimpleHandlerList.java (+14/-0)
src/test/java/com/akiban/http/HttpMonitorVerifyIT.java (+106/-0)
src/test/java/com/akiban/http/HttpMonitorVerifySSLIT.java (+199/-0)
src/test/java/com/akiban/http/HttpThreadedLoginIT.java (+0/-2)
To merge this branch: bzr merge lp:~tjoneslo/akiban-server/add-http-session-table
Reviewer Review Type Date Requested Status
Mike McMahon Approve
Review via email: mp+161259@code.launchpad.net

Description of the change

Per the demo today, add the ability for the HttpConnections to be seen in the IS.SERVER_SESSIONS table. This allows both the REST and Postgres server connections to be tracked and some accounting performed.

This is still mostly infrastructure. There are some basic statistics capture, but a further review of the business requirements should drive design of more statistics capture.

Also add test to verify this.

To post a comment you must log in.
Revision history for this message
Mike McMahon (mmcm) wrote :

This gives the HTTP server connection a Session, but it isn't otherwise used. Would it be feasible for REST resources, many of which create new sessions each request today, to get access to this one?

review: Needs Information
Revision history for this message
Thomas Jones-Low (tjoneslo) wrote :

It is possible to allow the REST processing to use the session created for the HTTP connection.

It requires a chunk of refactoring that I'd prefer to do in a separate commit.

Revision history for this message
Thomas Jones-Low (tjoneslo) wrote :

It's possible, but is it ok to use the same Session across multiple threads?

The interaction of the HTTP connection (jetty) and the Servlet processing (Jersey) is via a (theoretical) thread pool. As each request comes across the wire into the connection, it gets packaged into the Request/Response and given to the servlet to process on its own thread. When the Servlet finishes, the the Response it picked up by the connection thread and sent back across the wire.

So the safe thing to do is to create a new session for each Servlet request (i.e. as we do now). Nathan and I had a discussion on the wiki page regarding the REST processing not mapping directly to the Postgres processing, and this is one of those points.

Revision history for this message
Mike McMahon (mmcm) wrote :

Okay, seems that at the least more throught is required to do anything there.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/main/java/com/akiban/http/HttpConductorImpl.java'
2--- src/main/java/com/akiban/http/HttpConductorImpl.java 2013-04-22 22:58:39 +0000
3+++ src/main/java/com/akiban/http/HttpConductorImpl.java 2013-04-26 23:40:34 +0000
4@@ -22,8 +22,15 @@
5 import com.akiban.server.service.monitor.MonitorService;
6 import com.akiban.server.service.monitor.ServerMonitor;
7 import com.akiban.server.service.security.SecurityService;
8-import com.akiban.sql.embedded.EmbeddedJDBCService;
9+import com.akiban.server.service.session.Session;
10+import com.akiban.server.service.session.SessionService;
11+import com.akiban.sql.server.ServerSessionMonitor;
12 import com.google.inject.Inject;
13+
14+import org.eclipse.jetty.io.AsyncEndPoint;
15+import org.eclipse.jetty.io.Connection;
16+import org.eclipse.jetty.io.nio.AsyncConnection;
17+import org.eclipse.jetty.io.nio.SslConnection;
18 import org.eclipse.jetty.servlets.CrossOriginFilter;
19 import org.eclipse.jetty.util.security.Constraint;
20 import org.eclipse.jetty.security.Authenticator;
21@@ -32,6 +39,7 @@
22 import org.eclipse.jetty.security.LoginService;
23 import org.eclipse.jetty.security.authentication.BasicAuthenticator;
24 import org.eclipse.jetty.security.authentication.DigestAuthenticator;
25+import org.eclipse.jetty.server.AsyncHttpConnection;
26 import org.eclipse.jetty.server.Connector;
27 import org.eclipse.jetty.server.Server;
28 import org.eclipse.jetty.server.handler.ContextHandler;
29@@ -44,6 +52,8 @@
30
31 import javax.servlet.FilterRegistration;
32 import javax.servlet.ServletException;
33+
34+import java.nio.channels.SocketChannel;
35 import java.util.Collections;
36 import java.util.HashSet;
37 import java.util.Set;
38@@ -66,10 +76,12 @@
39 private static final String CONFIG_XORIGIN_CREDENTIALS = CONFIG_XORIGIN_PREFIX + "allow_credentials";
40
41 private static final String REST_ROLE = "rest-user";
42+ public static final String SERVER_TYPE = "REST";
43
44 private final ConfigurationService configurationService;
45 private final SecurityService securityService;
46 private final MonitorService monitorService;
47+ private final SessionService sessionService;
48
49 private final Object lock = new Object();
50 private SimpleHandlerList handlerList;
51@@ -84,10 +96,12 @@
52 @Inject
53 public HttpConductorImpl(ConfigurationService configurationService,
54 SecurityService securityService,
55- MonitorService monitor) {
56+ MonitorService monitor,
57+ SessionService session) {
58 this.configurationService = configurationService;
59 this.securityService = securityService;
60 this.monitorService = monitor;
61+ this.sessionService = session;
62
63 jerseyLogging = java.util.logging.Logger.getLogger("com.sun.jersey");
64 jerseyLogging.setLevel(java.util.logging.Level.OFF);
65@@ -182,14 +196,14 @@
66 Server localServer = new Server();
67 SelectChannelConnector connector;
68 if (!ssl) {
69- connector = new SelectChannelConnector();
70+ connector = new SelectChannelConnectorExtended();
71 }
72 else {
73 // Share keystore configuration with PSQL.
74 SslContextFactory sslFactory = new SslContextFactory();
75 sslFactory.setKeyStorePath(System.getProperty("javax.net.ssl.keyStore"));
76 sslFactory.setKeyStorePassword(System.getProperty("javax.net.ssl.keyStorePassword"));
77- connector = new SslSelectChannelConnector(sslFactory);
78+ connector = new SslSelectChannelConnectorExtended(sslFactory);
79 }
80 connector.setPort(portLocal);
81 connector.setThreadPool(new QueuedThreadPool(200));
82@@ -262,7 +276,7 @@
83 @Override
84 public void stop() {
85 Server localServer;
86- monitorService.deregisterServerMonitor(monitorService.getServerMonitors().get(ConnectionMonitor.SERVER_TYPE));
87+ monitorService.deregisterServerMonitor(monitorService.getServerMonitors().get(SERVER_TYPE));
88 synchronized (lock) {
89 xOriginFilterEnabled = false;
90 localServer = server;
91@@ -313,7 +327,6 @@
92 }
93
94 private class ConnectionMonitor implements ServerMonitor {
95- public static final String SERVER_TYPE = "REST";
96 private final SelectChannelConnector connector;
97 private final AtomicLong _statsStartedAt = new AtomicLong(System.currentTimeMillis());
98
99@@ -341,4 +354,66 @@
100 return connector.getConnections();
101 }
102 }
103+
104+ private class SelectChannelConnectorExtended extends SelectChannelConnector {
105+ private Session session;
106+ @Override
107+ protected AsyncConnection newConnection(SocketChannel channel,final AsyncEndPoint endpoint)
108+ {
109+ AsyncHttpConnection conn = (AsyncHttpConnection)super.newConnection(channel, endpoint);
110+ ServerSessionMonitor sessionMonitor = new ServerSessionMonitor(SERVER_TYPE,
111+ monitorService.allocateSessionId());
112+
113+ conn.setAssociatedObject(sessionMonitor);
114+ this.session = sessionService.createSession();
115+ monitorService.registerSessionMonitor(sessionMonitor, session);
116+ return conn;
117+ }
118+
119+ @Override
120+ protected void connectionClosed(Connection connection) {
121+ if (connection instanceof AsyncHttpConnection) {
122+ AsyncHttpConnection conn = (AsyncHttpConnection)connection;
123+ ServerSessionMonitor monitor = (ServerSessionMonitor)conn.getAssociatedObject();
124+ if (monitor != null) {
125+ monitorService.deregisterSessionMonitor(monitor, session);
126+ conn.setAssociatedObject(null);
127+ }
128+ }
129+ super.connectionClosed(connection);
130+ }
131+ }
132+
133+ private class SslSelectChannelConnectorExtended extends SslSelectChannelConnector {
134+ private Session session;
135+ public SslSelectChannelConnectorExtended(SslContextFactory sslFactory) {
136+ super(sslFactory);
137+ }
138+
139+ @Override
140+ protected AsyncConnection newConnection(SocketChannel channel,final AsyncEndPoint endpoint)
141+ {
142+ AsyncHttpConnection conn = (AsyncHttpConnection)((SslConnection)super.newConnection(channel, endpoint)).getSslEndPoint().getConnection();
143+ ServerSessionMonitor sessionMonitor = new ServerSessionMonitor(SERVER_TYPE,
144+ monitorService.allocateSessionId());
145+
146+ conn.setAssociatedObject(sessionMonitor);
147+ this.session = sessionService.createSession();
148+ monitorService.registerSessionMonitor(sessionMonitor, session);
149+ return conn;
150+ }
151+
152+ @Override
153+ protected void connectionClosed (Connection connection) {
154+ if (connection instanceof SslConnection) {
155+ AsyncHttpConnection conn = (AsyncHttpConnection)((SslConnection) connection).getSslEndPoint().getConnection();
156+ ServerSessionMonitor monitor = (ServerSessionMonitor)conn.getAssociatedObject();
157+ if (monitor != null) {
158+ monitorService.deregisterSessionMonitor(monitor, session);
159+ conn.setAssociatedObject(null);
160+ }
161+ }
162+ super.connectionClosed(connection);
163+ }
164+ }
165 }
166
167=== modified file 'src/main/java/com/akiban/http/SimpleHandlerList.java'
168--- src/main/java/com/akiban/http/SimpleHandlerList.java 2013-04-22 22:37:46 +0000
169+++ src/main/java/com/akiban/http/SimpleHandlerList.java 2013-04-26 23:40:34 +0000
170@@ -22,6 +22,8 @@
171 import org.eclipse.jetty.server.handler.AbstractHandler;
172 import org.eclipse.jetty.util.MultiException;
173
174+import com.akiban.server.service.monitor.MonitorStage;
175+import com.akiban.sql.server.ServerSessionMonitor;
176 import com.akiban.util.tap.InOutTap;
177 import com.akiban.util.tap.Tap;
178
179@@ -53,10 +55,18 @@
180 Request baseRequest,
181 HttpServletRequest request,
182 HttpServletResponse response) throws IOException, ServletException {
183+ ServerSessionMonitor monitor = null;
184 if(!isStarted()) {
185 return;
186 }
187 REST_TAP.in();
188+ Object obj = baseRequest.getConnection().getAssociatedObject();
189+ if (obj instanceof ServerSessionMonitor) {
190+ monitor = (ServerSessionMonitor)obj;
191+ monitor.setRemoteAddress(request.getRemoteAddr());
192+ monitor.startStatement(request.getMethod(), request.getRequestURI());
193+ monitor.enterStage(MonitorStage.EXECUTE);
194+ }
195 try {
196 for(Handler h : handlers) {
197 h.handle(target,baseRequest, request, response);
198@@ -70,6 +80,10 @@
199 }
200 }finally {
201 REST_TAP.out();
202+ if (monitor != null) {
203+ monitor.leaveStage();
204+ monitor.endStatement(1);
205+ }
206 }
207 }
208
209
210=== added file 'src/test/java/com/akiban/http/HttpMonitorVerifyIT.java'
211--- src/test/java/com/akiban/http/HttpMonitorVerifyIT.java 1970-01-01 00:00:00 +0000
212+++ src/test/java/com/akiban/http/HttpMonitorVerifyIT.java 2013-04-26 23:40:34 +0000
213@@ -0,0 +1,106 @@
214+/**
215+ * Copyright (C) 2009-2013 Akiban Technologies, Inc.
216+ *
217+ * This program is free software: you can redistribute it and/or modify
218+ * it under the terms of the GNU Affero General Public License as published by
219+ * the Free Software Foundation, either version 3 of the License, or
220+ * (at your option) any later version.
221+ *
222+ * This program is distributed in the hope that it will be useful,
223+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
224+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
225+ * GNU Affero General Public License for more details.
226+ *
227+ * You should have received a copy of the GNU Affero General Public License
228+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
229+ */
230+package com.akiban.http;
231+
232+import static org.junit.Assert.assertEquals;
233+
234+import java.net.URI;
235+import java.util.Arrays;
236+import java.util.HashMap;
237+import java.util.Map;
238+
239+import org.apache.http.HttpResponse;
240+import org.apache.http.client.HttpClient;
241+import org.apache.http.client.methods.HttpGet;
242+import org.apache.http.impl.client.DefaultHttpClient;
243+import org.apache.http.util.EntityUtils;
244+import org.junit.Before;
245+import org.junit.Test;
246+import org.slf4j.Logger;
247+import org.slf4j.LoggerFactory;
248+
249+import com.akiban.rest.RestService;
250+import com.akiban.rest.RestServiceImpl;
251+import com.akiban.server.service.monitor.MonitorService;
252+import com.akiban.server.service.security.SecurityService;
253+import com.akiban.server.service.security.SecurityServiceImpl;
254+import com.akiban.server.service.servicemanager.GuicedServiceManager;
255+import com.akiban.server.test.it.ITBase;
256+import com.akiban.sql.embedded.EmbeddedJDBCService;
257+import com.akiban.sql.embedded.EmbeddedJDBCServiceImpl;
258+
259+public class HttpMonitorVerifyIT extends ITBase {
260+
261+ private static final Logger LOG = LoggerFactory.getLogger(HttpMonitorVerifyIT.class);
262+
263+ @Override
264+ protected GuicedServiceManager.BindingsConfigurationProvider serviceBindingsProvider() {
265+ return super.serviceBindingsProvider()
266+ .bindAndRequire(SecurityService.class, SecurityServiceImpl.class)
267+ .bindAndRequire(EmbeddedJDBCService.class, EmbeddedJDBCServiceImpl.class)
268+ .bindAndRequire(RestService.class, RestServiceImpl.class);
269+ }
270+
271+ @Before
272+ public void setUp() {
273+ SecurityService securityService = securityService();
274+ securityService.addRole("rest-user");
275+ securityService.addUser("user1", "password", Arrays.asList("rest-user"));
276+ }
277+
278+ protected SecurityService securityService() {
279+ return serviceManager().getServiceByClass(SecurityService.class);
280+ }
281+
282+ protected HttpConductor httpConductor() {
283+ return serviceManager().getServiceByClass(HttpConductor.class);
284+ }
285+
286+ protected MonitorService monitorService () {
287+ return serviceManager().getServiceByClass(MonitorService.class);
288+ }
289+
290+ @Override
291+ protected Map<String, String> startupConfigProperties() {
292+ Map<String, String> properties = new HashMap<>();
293+ properties.put("akserver.http.login", "basic"); // "digest"
294+ properties.put("akserver.restrict_user_schema", "true");
295+ return properties;
296+ }
297+
298+ private static int openRestURL(HttpClient client, String userInfo, int port, String path) throws Exception {
299+ URI uri = new URI("http", userInfo, "localhost", port, path, null, null);
300+ HttpGet get = new HttpGet(uri);
301+ HttpResponse response = client.execute(get);
302+ int code = response.getStatusLine().getStatusCode();
303+ EntityUtils.consume(response.getEntity());
304+ return code;
305+ }
306+
307+ @Test
308+ public void runTest () throws Exception {
309+ MonitorService monitor = monitorService();
310+
311+ HttpClient client = new DefaultHttpClient();
312+ openRestURL(client, "user1:password", httpConductor().getPort(), "/version");
313+
314+ assertEquals(monitor.getSessionMonitors().size(), 1);
315+
316+ client.getConnectionManager().shutdown();
317+ }
318+
319+}
320
321=== added file 'src/test/java/com/akiban/http/HttpMonitorVerifySSLIT.java'
322--- src/test/java/com/akiban/http/HttpMonitorVerifySSLIT.java 1970-01-01 00:00:00 +0000
323+++ src/test/java/com/akiban/http/HttpMonitorVerifySSLIT.java 2013-04-26 23:40:34 +0000
324@@ -0,0 +1,199 @@
325+/**
326+ * Copyright (C) 2009-2013 Akiban Technologies, Inc.
327+ *
328+ * This program is free software: you can redistribute it and/or modify
329+ * it under the terms of the GNU Affero General Public License as published by
330+ * the Free Software Foundation, either version 3 of the License, or
331+ * (at your option) any later version.
332+ *
333+ * This program is distributed in the hope that it will be useful,
334+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
335+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
336+ * GNU Affero General Public License for more details.
337+ *
338+ * You should have received a copy of the GNU Affero General Public License
339+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
340+ */
341+package com.akiban.http;
342+
343+import static org.junit.Assert.assertEquals;
344+
345+import java.net.URI;
346+import java.security.cert.CertificateException;
347+import java.security.cert.X509Certificate;
348+import java.util.Arrays;
349+import java.util.HashMap;
350+import java.util.Map;
351+import java.util.Properties;
352+
353+import javax.net.ssl.SSLContext;
354+import javax.net.ssl.TrustManager;
355+import javax.net.ssl.X509TrustManager;
356+
357+import org.apache.http.HttpResponse;
358+import org.apache.http.client.HttpClient;
359+import org.apache.http.client.methods.HttpGet;
360+import org.apache.http.conn.ClientConnectionManager;
361+import org.apache.http.conn.scheme.Scheme;
362+import org.apache.http.conn.scheme.SchemeRegistry;
363+import org.apache.http.conn.ssl.SSLSocketFactory;
364+import org.apache.http.impl.client.DefaultHttpClient;
365+import org.apache.http.util.EntityUtils;
366+import org.junit.Before;
367+import org.junit.Ignore;
368+import org.junit.Test;
369+import org.slf4j.Logger;
370+import org.slf4j.LoggerFactory;
371+
372+import com.akiban.rest.RestService;
373+import com.akiban.rest.RestServiceImpl;
374+import com.akiban.server.service.monitor.MonitorService;
375+import com.akiban.server.service.security.SecurityService;
376+import com.akiban.server.service.security.SecurityServiceImpl;
377+import com.akiban.server.service.servicemanager.GuicedServiceManager;
378+import com.akiban.server.test.it.ITBase;
379+import com.akiban.sql.embedded.EmbeddedJDBCService;
380+import com.akiban.sql.embedded.EmbeddedJDBCServiceImpl;
381+
382+/**
383+ * In order to run this test, you need to generate a key store, then update the
384+ * javax.net.ssl.keyStore system property (set below), to the path where you put the
385+ * keystore file.
386+ * <pre>
387+ * $ keytool -keystore keystore -alias akiban -genkey -keyalg RSA
388+ * Enter keystore password: password
389+ * Re-enter new password: password
390+ * What is your first and last name?
391+ * [Unknown]: akiban.com
392+ * What is the name of your organizational unit?
393+ * [Unknown]: akiban.com
394+ * What is the name of your organization?
395+ * [Unknown]: akiban
396+ * What is the name of your City or Locality?
397+ * [Unknown]:
398+ * What is the name of your State or Province?
399+ * [Unknown]:
400+ * What is the two-letter country code for this unit?
401+ * [Unknown]:
402+ * Is CN=akiban.com, OU=akiban.com, O=akiban, L=Unknown, ST=Unknown, C=Unknown correct?
403+ * [no]: yes
404+ * </pre>
405+ * Because we don't want to be shipping a half completed SSL certificate with the source
406+ * code, This is a manual step required for this (otherwise) disabled test.
407+ * @author tjoneslo
408+ *
409+ */
410+public class HttpMonitorVerifySSLIT extends ITBase {
411+ private static final Logger LOG = LoggerFactory.getLogger(HttpMonitorVerifySSLIT.class);
412+
413+ @Override
414+ protected GuicedServiceManager.BindingsConfigurationProvider serviceBindingsProvider() {
415+ return super.serviceBindingsProvider()
416+ .bindAndRequire(SecurityService.class, SecurityServiceImpl.class)
417+ .bindAndRequire(EmbeddedJDBCService.class, EmbeddedJDBCServiceImpl.class)
418+ .bindAndRequire(RestService.class, RestServiceImpl.class);
419+ }
420+
421+ @Before
422+ public void setUp() {
423+ SecurityService securityService = securityService();
424+ securityService.addRole("rest-user");
425+ securityService.addRole("admin");
426+ securityService.addUser("user1", "password", Arrays.asList("rest-user"));
427+ securityService.addUser("akiban", "topsecret", Arrays.asList("rest-user", "admin"));
428+ }
429+
430+ protected SecurityService securityService() {
431+ return serviceManager().getServiceByClass(SecurityService.class);
432+ }
433+
434+ protected HttpConductor httpConductor() {
435+ return serviceManager().getServiceByClass(HttpConductor.class);
436+ }
437+
438+ protected MonitorService monitorService () {
439+ return serviceManager().getServiceByClass(MonitorService.class);
440+ }
441+
442+ @Override
443+ protected Map<String, String> startupConfigProperties() {
444+ Map<String, String> properties = new HashMap<>();
445+ properties.put("akserver.http.login", "digest"); // "digest"
446+ properties.put("akserver.http.ssl", "true");
447+ properties.put("akserver.restrict_user_schema", "true");
448+
449+ Properties p = new Properties(System.getProperties());
450+ p.put("javax.net.ssl.keyStore", "./keystore");
451+ p.put("javax.net.ssl.keyStorePassword", "password");
452+ System.setProperties(p);
453+ return properties;
454+ }
455+
456+ private static int openRestURL(HttpClient client, String userInfo, int port, String path) throws Exception {
457+ URI uri = new URI("https", userInfo, "localhost", port, path, null, null);
458+ HttpGet get = new HttpGet(uri);
459+ HttpResponse response = client.execute(get);
460+ int code = response.getStatusLine().getStatusCode();
461+ EntityUtils.consume(response.getEntity());
462+ return code;
463+ }
464+
465+ @Ignore ("need setup")
466+ @Test
467+ public void runTest () throws Exception {
468+ MonitorService monitor = monitorService();
469+
470+ HttpClient client = new DefaultHttpClient();
471+ client = wrapClient(client);
472+
473+ openRestURL(client, "user1:password", httpConductor().getPort(), "/version");
474+
475+ assertEquals(monitor.getSessionMonitors().size(), 1);
476+
477+ client.getConnectionManager().shutdown();
478+ }
479+
480+
481+ /**
482+ * This code sets up the httpclient to accept any SSL certificate. The
483+ * SSL certificate generated by the instructions above is not correctly
484+ * signed, so we need ignore the problem.
485+ * This code should not, under any circumstances, be allowed anywhere
486+ * the production code.
487+ * @param base
488+ * @return
489+ */
490+ private HttpClient wrapClient (HttpClient base) {
491+ try {
492+ SSLContext ctx = SSLContext.getInstance("TLS");
493+
494+ ctx.init(null, new TrustManager[]{getTrustManager()}, null);
495+ SSLSocketFactory ssf = new SSLSocketFactory(ctx);
496+ ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
497+ ClientConnectionManager ccm = base.getConnectionManager();
498+ SchemeRegistry sr = ccm.getSchemeRegistry();
499+ sr.register(new Scheme("https", ssf, 8091));
500+ return new DefaultHttpClient(ccm, base.getParams());
501+ } catch (Exception ex) {
502+ ex.printStackTrace();
503+ return null;
504+ }
505+ }
506+
507+ private X509TrustManager getTrustManager() {
508+ return new X509TrustManager() {
509+
510+ public X509Certificate[] getAcceptedIssuers() {
511+ return null;
512+ }
513+
514+ @Override
515+ public void checkClientTrusted(X509Certificate[] arg0, String arg1)
516+ throws CertificateException { }
517+
518+ @Override
519+ public void checkServerTrusted(X509Certificate[] arg0, String arg1)
520+ throws CertificateException { }
521+ };
522+ }
523+}
524
525=== modified file 'src/test/java/com/akiban/http/HttpThreadedLoginIT.java'
526--- src/test/java/com/akiban/http/HttpThreadedLoginIT.java 2013-04-22 22:51:14 +0000
527+++ src/test/java/com/akiban/http/HttpThreadedLoginIT.java 2013-04-26 23:40:34 +0000
528@@ -21,8 +21,6 @@
529 import com.akiban.rest.RestServiceImpl;
530 import com.akiban.server.service.servicemanager.GuicedServiceManager;
531 import com.akiban.server.test.it.ITBase;
532-import com.akiban.sql.embedded.EmbeddedJDBCService;
533-import com.akiban.sql.embedded.EmbeddedJDBCServiceImpl;
534
535 import org.apache.http.HttpResponse;
536 import org.apache.http.HttpStatus;

Subscribers

People subscribed via source and target branches