@Override public boolean isSecure() { return request.isSecure(); }
private URI getBaseUri(final Request request) { try { final String hostHeader = request.getValue("Host"); if (hostHeader != null) { final String scheme = request.isSecure() ? "https" : "http"; return new URI(scheme + "://" + hostHeader + "/"); } else { final Address address = request.getAddress(); return new URI(address.getScheme(), null, address.getDomain(), address.getPort(), "/", null, null); } } catch (final URISyntaxException ex) { throw new IllegalArgumentException(ex); } }
private void close(final Response response) { try { response.close(); } catch (final Exception ex) { throw new RuntimeException(ex); } }
public void handle(Request req, Response resp) { try { if (req.getPath().getPath().contains("/redirect/")) { resp.setCode(303); resp.add("Location", "/"); } else { if (req.getPath().getPath().contains("/timeout/")) { try { Thread.sleep(500); if (req.getPath().getPath().contains("/gzip/")) { if (!"gzip".equals(req.getValue("Accept-Encoding"))) { throw new IllegalStateException("Should accept gzip"); resp.set("Content-Encoding", "gzip"); GZIPOutputStream gzipOutputStream = new GZIPOutputStream(resp.getOutputStream()); gzipOutputStream.write("GZIP response".getBytes()); gzipOutputStream.close(); } else { resp.getPrintStream().append("agent=" + req.getValues("User-Agent").get(0)); } finally { try { resp.close(); } catch (IOException ignored) {
public void handle(Request request, final Response response) { if (!Tracker.ANNOUNCE_URL.equals(request.getPath().toString())) { response.setCode(404); response.setText("Not Found"); return; body = response.getOutputStream(); response.set("Content-Type", "text/plain"); response.set("Server", ""); response.setDate("Date", System.currentTimeMillis()); if ("GET".equalsIgnoreCase(request.getMethod())) { myRequestProcessor.process(request.getAddress().toString(), request.getClientAddress().getAddress().getHostAddress(), getRequestHandler(response)); } else { myMultiAnnounceRequestProcessor.process(request.getContent(), request.getAddress().toString(), request.getClientAddress().getAddress().getHostAddress(), getRequestHandler(response));
@Override public OutputStream writeResponseStatusAndHeaders(final long contentLength, final ContainerResponse context) throws ContainerException { final javax.ws.rs.core.Response.StatusType statusInfo = context.getStatusInfo(); final int code = statusInfo.getStatusCode(); final String reason = statusInfo.getReasonPhrase() == null ? Status.getDescription(code) : statusInfo.getReasonPhrase(); response.setCode(code); response.setDescription(reason); if (contentLength != -1) { response.setContentLength(contentLength); } for (final Map.Entry<String, List<String>> e : context.getStringHeaders().entrySet()) { for (final String value : e.getValue()) { response.addValue(e.getKey(), value); } } try { return response.getOutputStream(); } catch (final IOException ioe) { throw new ContainerException("Error during writing out the response headers.", ioe); } }
@Override public void handle(final Request request, final Response response) { final ResponseWriter responseWriter = new ResponseWriter(response, scheduler); final URI baseUri = getBaseUri(request); final URI requestUri = getRequestUri(request, baseUri); try { final ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri, request.getMethod(), getSecurityContext(request), new MapPropertiesDelegate()); requestContext.setEntityStream(request.getInputStream()); for (final String headerName : request.getNames()) { requestContext.headers(headerName, request.getValue(headerName)); } requestContext.setWriter(responseWriter); requestContext.setRequestScopedInitializer(injectionManager -> { injectionManager.<Ref<Request>>getInstance(RequestTYPE).set(request); injectionManager.<Ref<Response>>getInstance(ResponseTYPE).set(response); }); appHandler.handle(requestContext); } catch (final Exception ex) { throw new RuntimeException(ex); } finally { if (!responseWriter.isSuspended()) { close(response); } } }
@Override public void serveResponse(int code, String description, ByteBuffer responseData) { response.setCode(code); response.setText(description); try { responseData.rewind(); final WritableByteChannel channel = Channels.newChannel(response.getOutputStream()); channel.write(responseData); } catch (IOException e) { e.printStackTrace(); } } };
private URI getRequestUri(final Request request, final URI baseUri) { try { final String serverAddress = getServerAddress(baseUri); String uri = ContainerUtils.getHandlerPath(request.getTarget()); final String queryString = request.getQuery().toString(); if (queryString != null) { uri = uri + "?" + ContainerUtils.encodeUnsafeCharacters(queryString); } return new URI(serverAddress + uri); } catch (URISyntaxException ex) { throw new IllegalArgumentException(ex); } }
@Override public void failure(final Throwable error) { try { if (!response.isCommitted()) { response.setCode(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); response.setDescription(error.getMessage()); } } finally { logger.debugLog("failure(...) called"); commit(); rethrow(error); } }
response.setCode(400); // Bad request response.setContent("time12 must be an integer between 1 and 12"); return; response.setCode(400); // Bad request response.setContent("pm must be one of " + AMPM.values()); return; response.setCode(200); switch( pm ) response.setContent(nTime12); break; case PM: response.setContent(nTime12 + 12); break;
@Override public String getFromAddress() { Address add = baseRequest.getAddress(); if (add == null) { return null; } return add.toString(); }
/** * Write a {@link HTTPTrackerErrorMessage} to the response with the given * HTTP status code. * * @param status The HTTP status code to return. * @param error The error reported by the tracker. */ private void serveError(Status status, HTTPTrackerErrorMessage error, RequestHandler requestHandler) throws IOException { requestHandler.serveResponse(status.getCode(), status.getDescription(), error.getData()); }
@Override public String getContentType() { return request.getContentType().getType(); }
@Override public void serveResponse(int code, String description, ByteBuffer responseData) { isAnySuccess.set(isAnySuccess.get() || (code == Status.OK.getCode())); try { responseMessages.add(BDecoder.bdecode(responseData)); } catch (IOException e) { logger.warn("cannot decode message from byte buffer"); } } });
@Override public void commit() { try { response.close(); } catch (final IOException e) { logger.log(Level.SEVERE, "Unable to send 500 error response.", e); } finally { logger.debugLog("commit() called"); } }
private void writeEmptyResponse(HTTPAnnounceRequestMessage announceRequest, RequestHandler requestHandler) throws IOException { HTTPAnnounceResponseMessage announceResponse; try { announceResponse = HTTPAnnounceResponseMessage.craft( myAnnounceInterval, 0, 0, Collections.<Peer>emptyList(), announceRequest.getHexInfoHash()); requestHandler.serveResponse(Status.OK.getCode(), Status.OK.getDescription(), announceResponse.getData()); } catch (Exception e) { serveError(Status.INTERNAL_SERVER_ERROR, e.getMessage(), requestHandler); } }
public void process(final String body, final String url, final String hostAddress, final TrackerRequestProcessor.RequestHandler requestHandler) throws IOException { final List<BEValue> responseMessages = new ArrayList<BEValue>(); final AtomicBoolean isAnySuccess = new AtomicBoolean(false); for (String s : body.split("\n")) { myTrackerRequestProcessor.process(s, hostAddress, new TrackerRequestProcessor.RequestHandler() { @Override public void serveResponse(int code, String description, ByteBuffer responseData) { isAnySuccess.set(isAnySuccess.get() || (code == Status.OK.getCode())); try { responseMessages.add(BDecoder.bdecode(responseData)); } catch (IOException e) { logger.warn("cannot decode message from byte buffer"); } } }); } if (responseMessages.isEmpty()) { ByteBuffer res; Status status; res = HTTPTrackerErrorMessage.craft("").getData(); status = Status.BAD_REQUEST; requestHandler.serveResponse(status.getCode(), "", res); return; } final ByteArrayOutputStream out = new ByteArrayOutputStream(); BEncoder.bencode(responseMessages, out); requestHandler.serveResponse(isAnySuccess.get() ? Status.OK.getCode() : Status.BAD_REQUEST.getCode(), "", ByteBuffer.wrap(out.toByteArray())); } }
private void writeAnnounceResponse(TrackedTorrent torrent, Peer peer, boolean isSeeder, RequestHandler requestHandler) throws IOException { HTTPAnnounceResponseMessage announceResponse; try { announceResponse = HTTPAnnounceResponseMessage.craft( isSeeder ? SEEDER_ANNOUNCE_INTERVAL : myAnnounceInterval, torrent.seeders(), torrent.leechers(), isSeeder ? Collections.<Peer>emptyList() : torrent.getSomePeers(peer), torrent.getHexInfoHash()); requestHandler.serveResponse(Status.OK.getCode(), Status.OK.getDescription(), announceResponse.getData()); } catch (Exception e) { serveError(Status.INTERNAL_SERVER_ERROR, e.getMessage(), requestHandler); } }