/** * {@inheritDoc} */ public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { jsonRpcServer.handle(request, response); response.getOutputStream().flush(); }
/** * {@inheritDoc} */ public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { jsonRpcServer.handle(request, response); response.getOutputStream().flush(); }
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { jsonRpcServer.handle(request, response); } }
@Test public void test_contentType() throws Exception { EasyMock.expect(mockService.testMethod("Whir?inaki")).andReturn("For?est"); EasyMock.replay(mockService); MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); MockHttpServletResponse response = new MockHttpServletResponse(); request.setContentType("application/json"); request.setContent("{\"jsonrpc\":\"2.0\",\"id\":123,\"method\":\"testMethod\",\"params\":[\"Whir?inaki\"]}".getBytes(StandardCharsets.UTF_8)); jsonRpcServer.setContentType("flip/flop"); jsonRpcServer.handle(request, response); assertTrue("flip/flop".equals(response.getContentType())); checkSuccessfulResponse(response); }
@Test public void testGetMethod_base64Params() throws Exception { EasyMock.expect(mockService.testMethod("Whir?inaki")).andReturn("For?est"); EasyMock.replay(mockService); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test-get"); MockHttpServletResponse response = new MockHttpServletResponse(); request.addParameter("id", Integer.toString(123)); request.addParameter("method", "testMethod"); request.addParameter("params", net.iharder.Base64.encodeBytes("[\"Whir?inaki\"]".getBytes(StandardCharsets.UTF_8))); jsonRpcServer.handle(request, response); assertTrue("application/json-rpc".equals(response.getContentType())); checkSuccessfulResponse(response); }
@Test public void testGetMethod_unencodedParams() throws Exception { EasyMock.expect(mockService.testMethod("Whir?inaki")).andReturn("For?est"); EasyMock.replay(mockService); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test-get"); MockHttpServletResponse response = new MockHttpServletResponse(); request.addParameter("id", Integer.toString(123)); request.addParameter("method", "testMethod"); request.addParameter("params", "[\"Whir?inaki\"]"); jsonRpcServer.handle(request, response); assertTrue("application/json-rpc".equals(response.getContentType())); checkSuccessfulResponse(response); }
@Test public void testGzipRequest() throws IOException { MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); request.addHeader(CONTENT_ENCODING, "gzip"); request.setContentType("application/json"); byte[] bytes = "{\"jsonrpc\":\"2.0\",\"id\":123,\"method\":\"testMethod\",\"params\":[\"Whir?inaki\"]}".getBytes(StandardCharsets.UTF_8); ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gos = new GZIPOutputStream(baos); gos.write(bytes); gos.close(); request.setContent(baos.toByteArray()); MockHttpServletResponse response = new MockHttpServletResponse(); jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); jsonRpcServer.handle(request, response); String responseContent = new String(response.getContentAsByteArray(), StandardCharsets.UTF_8); Assert.assertEquals(responseContent, "{\"jsonrpc\":\"2.0\",\"id\":123,\"result\":null}\n"); Assert.assertNull(response.getHeader(CONTENT_ENCODING)); }
@Test public void interceptorsPreHandleJsonExceptionTest() throws IOException { String requestNotRpc = "{\"test\": 1}"; String exceptionMessage = "123"; // mockInterceptor.preHandleJson(mapper.readTree(requestNotRpc)); expectLastCall().andThrow(new RuntimeException(exceptionMessage)); replay(mockInterceptor); MockHttpServletRequest request = new MockHttpServletRequest("POST", "/v1/zone"); request.setContent(requestNotRpc.getBytes(StandardCharsets.UTF_8)); MockHttpServletResponse response = new MockHttpServletResponse(); jsonRpcServer.handle(request, response); assertEquals(400, response.getStatus()); assertEquals("", response.getContentAsString()); verify(mockInterceptor); }
@Test public void testNullRequest() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test-get"); MockHttpServletResponse response = new MockHttpServletResponse(); jsonRpcServer.handle(request, response); assertTrue(MockHttpServletResponse.SC_BAD_REQUEST == response.getStatus()); }
@Test public void testGetMethod_badRequest_noMethod() throws Exception { EasyMock.expect(mockService.testMethod("Whirinaki")).andReturn("Forest"); EasyMock.replay(mockService); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test-get"); MockHttpServletResponse response = new MockHttpServletResponse(); request.addParameter("id", Integer.toString(123)); // no method! request.addParameter("params", net.iharder.Base64.encodeBytes("[\"Whirinaki\"]".getBytes(StandardCharsets.UTF_8))); jsonRpcServer.handle(request, response); assertTrue(MockHttpServletResponse.SC_NOT_FOUND == response.getStatus()); JsonNode errorNode = error(toByteArrayOutputStream(response.getContentAsByteArray())); assertNotNull(errorNode); assertEquals(errorCode(errorNode).asLong(), (long) ErrorResolver.JsonError.METHOD_NOT_FOUND.code); }
@Test public void testGzipRequestAndResponse() throws IOException { MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); request.addHeader(CONTENT_ENCODING, "gzip"); request.addHeader(ACCEPT_ENCODING, "gzip"); request.setContentType("application/json"); byte[] bytes = "{\"jsonrpc\":\"2.0\",\"id\":123,\"method\":\"testMethod\",\"params\":[\"Whir?inaki\"]}".getBytes(StandardCharsets.UTF_8); ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gos = new GZIPOutputStream(baos); gos.write(bytes); gos.close(); request.setContent(baos.toByteArray()); MockHttpServletResponse response = new MockHttpServletResponse(); jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); jsonRpcServer.handle(request, response); byte[] compressed = response.getContentAsByteArray(); String sb = getCompressedResponseContent(compressed); Assert.assertEquals(sb, "{\"jsonrpc\":\"2.0\",\"id\":123,\"result\":null}"); Assert.assertEquals("gzip", response.getHeader(CONTENT_ENCODING)); }
@Test public void testGetMethod_badRequest_corruptParams() throws Exception { EasyMock.expect(mockService.testMethod("Whirinaki")).andReturn("Forest"); EasyMock.replay(mockService); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test-get"); MockHttpServletResponse response = new MockHttpServletResponse(); request.addParameter("id", Integer.toString(123)); request.addParameter("method", "testMethod"); request.addParameter("params", "{BROKEN}"); jsonRpcServer.handle(request, response); assertTrue(MockHttpServletResponse.SC_BAD_REQUEST == response.getStatus()); JsonNode errorNode = error(toByteArrayOutputStream(response.getContentAsByteArray())); assertNotNull(errorNode); assertEquals(errorCode(errorNode).asLong(), (long) ErrorResolver.JsonError.PARSE_ERROR.code); }
@Test public void testCorruptRequest() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); request.setContentType("application/json"); request.setContent("{NOT JSON}".getBytes(StandardCharsets.UTF_8)); MockHttpServletResponse response = new MockHttpServletResponse(); jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); jsonRpcServer.handle(request, response); String content = response.getContentAsString(); Assert.assertEquals(content, "{\"jsonrpc\":\"2.0\",\"id\":\"null\"," + "\"error\":{\"code\":-32700,\"message\":\"JSON parse error\"}}\n"); }
public static void assertHttpStatusCodeForJsonRpcRequest(InputStream message, int expectedCode, JsonRpcServer server) throws Exception { MockHttpServletRequest req = new MockHttpServletRequest(); MockHttpServletResponse res = new MockHttpServletResponse(); req.setMethod(HttpMethod.POST.name()); req.setContent(convertInputStreamToByteArray(message)); server.handle(req, res); Assert.assertEquals(expectedCode, res.getStatus()); }
@Test public void testGzipResponse() throws IOException { MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); request.addHeader(ACCEPT_ENCODING, "gzip"); request.setContentType("application/json"); request.setContent("{\"jsonrpc\":\"2.0\",\"id\":123,\"method\":\"testMethod\",\"params\":[\"Whir?inaki\"]}".getBytes(StandardCharsets.UTF_8)); MockHttpServletResponse response = new MockHttpServletResponse(); jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); jsonRpcServer.handle(request, response); byte[] compressed = response.getContentAsByteArray(); String sb = getCompressedResponseContent(compressed); Assert.assertEquals(sb, "{\"jsonrpc\":\"2.0\",\"id\":123,\"result\":null}"); Assert.assertEquals("gzip", response.getHeader(CONTENT_ENCODING)); }
public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String uri = request.getRequestURI(); JsonRpcServer skeleton = skeletonMap.get(uri); if (cors) { response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*"); response.setHeader(ACCESS_CONTROL_ALLOW_METHODS_HEADER, "POST"); response.setHeader(ACCESS_CONTROL_ALLOW_HEADERS_HEADER, "*"); } if (request.getMethod().equalsIgnoreCase("OPTIONS")) { response.setStatus(200); } else if (request.getMethod().equalsIgnoreCase("POST")) { RpcContext.getContext().setRemoteAddress(request.getRemoteAddr(), request.getRemotePort()); try { skeleton.handle(request.getInputStream(), response.getOutputStream()); } catch (Throwable e) { throw new ServletException(e); } } else { response.setStatus(500); } }
ByteArrayOutputStream os = new ByteArrayOutputStream(); try { jsonRpcServer.handle(is, os); return new Response(Response.Status.OK, "application/json", new ByteArrayInputStream(os.toByteArray())); } catch (IOException e) {