This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 060a311  [OPENMEETINGS-2551] more work on client count
060a311 is described below

commit 060a3114ad759931aeb42cd9afa9d1ebb39d3075
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Fri Jan 29 23:13:41 2021 +0700

    [OPENMEETINGS-2551] more work on client count
---
 .../openmeetings/web/pages/InternalErrorPage.java  |  4 +-
 .../openmeetings/webservice/NetTestWebService.java | 82 +++++++++++-----------
 .../webservice/util/RateLimitRequestFilter.java    |  8 +++
 3 files changed, 50 insertions(+), 44 deletions(-)

diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InternalErrorPage.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InternalErrorPage.java
index 939b5d1..55a4664 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InternalErrorPage.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InternalErrorPage.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.pages;
 
 import org.apache.openmeetings.web.app.Application;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.StatelessForm;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.IRequestParameters;
 
@@ -33,7 +33,7 @@ public class InternalErrorPage extends BaseInitedPage {
        @Override
        protected void onInitialize() {
                super.onInitialize();
-               add(new Form<Void>("form").add(
+               add(new StatelessForm<Void>("form").add(
                                new BootstrapButton("home", new 
ResourceModel("124"), Buttons.Type.Outline_Primary) {
                                        private static final long 
serialVersionUID = 1L;
 
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
index 0af9d02..44f0b50 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
@@ -33,7 +33,6 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.openmeetings.webservice.util.RateLimited;
@@ -57,10 +56,8 @@ public class NetTestWebService {
        private static final int PING_PACKET_SIZE = 64;
        private static final int JITTER_PACKET_SIZE = 1024;
        private static final int MAX_UPLOAD_SIZE = 16 * 1024 * 1024;
-       private AtomicInteger clientCount = new AtomicInteger();
-
-       @Value("${nettest.max.clients}")
-       private int maxClients = 100;
+       public static final AtomicInteger CLIENT_COUNT = new AtomicInteger();
+       public static int maxClients = 100;
 
        @PostConstruct
        private void report() {
@@ -78,10 +75,6 @@ public class NetTestWebService {
                if (TestType.UNKNOWN == testType) {
                        return Response.status(Status.BAD_REQUEST).build();
                }
-               if (clientCount.intValue() > maxClients) {
-                       log.error("Download: Max client count reached");
-                       return 
Response.status(Status.TOO_MANY_REQUESTS).build();
-               }
 
                // choose data to send
                switch (testType) {
@@ -92,38 +85,42 @@ public class NetTestWebService {
                                size = JITTER_PACKET_SIZE;
                                break;
                        default:
-                               clientCount.incrementAndGet();
+                               final int count = 
CLIENT_COUNT.incrementAndGet();
+                               log.info("... download: client count: {}", 
count);
                                size = inSize;
                                break;
                }
-               ResponseBuilder response = 
Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).entity(new InputStream() 
{
-                       int pos = 0;
-
-                       @Override
-                       public int read() throws IOException {
-                               pos++;
-                               return pos > size ? -1 : 
ThreadLocalRandom.current().nextInt(0, 0xFF);
-                       }
-
-                       @Override
-                       public int available() throws IOException {
-                               return size - pos;
-                       }
-
-                       @Override
-                       public void close() throws IOException {
-                               if (TestType.DOWNLOAD_SPEED == testType) {
-                                       clientCount.decrementAndGet();
-                               }
-                               super.close();
-                       }
-               });
-               response.header("Cache-Control", "no-cache, no-store, 
no-transform");
-               response.header("Pragma", "no-cache");
-               response.header("Content-Length", String.valueOf(size));
-               return response.build();
+               return Response.ok()
+                               
.type(MediaType.APPLICATION_OCTET_STREAM).entity(new InputStream() {
+                                       int pos = 0;
+
+                                       @Override
+                                       public int read() throws IOException {
+                                               pos++;
+                                               return pos > size ? -1 : 
ThreadLocalRandom.current().nextInt(0, 0xFF);
+                                       }
+
+                                       @Override
+                                       public int available() throws 
IOException {
+                                               return size - pos;
+                                       }
+
+                                       @Override
+                                       public void close() throws IOException {
+                                               if (TestType.DOWNLOAD_SPEED == 
testType) {
+                                                       final int count = 
CLIENT_COUNT.decrementAndGet();
+                                                       log.info("... close: 
client count: {}", count);
+                                               }
+                                               super.close();
+                                       }
+                               })
+                               .header("Cache-Control", "no-cache, no-store, 
no-transform")
+                               .header("Pragma", "no-cache")
+                               .header("Content-Length", String.valueOf(size))
+                               .build();
        }
 
+       @RateLimited
        @POST
        @Consumes(MediaType.APPLICATION_OCTET_STREAM)
        @Path("/")
@@ -131,11 +128,7 @@ public class NetTestWebService {
                if (size > MAX_UPLOAD_SIZE) {
                        return;
                }
-               if (clientCount.intValue() > maxClients) {
-                       log.error("Upload: Max client count reached");
-                       return;
-               }
-               clientCount.incrementAndGet();
+               CLIENT_COUNT.incrementAndGet();
                byte[] b = new byte[1024];
                int totalCount = 0;
                int count;
@@ -145,7 +138,7 @@ public class NetTestWebService {
                        }
                        log.debug("Total bytes read {}", totalCount);
                } finally {
-                       clientCount.decrementAndGet();
+                       CLIENT_COUNT.decrementAndGet();
                }
        }
 
@@ -162,4 +155,9 @@ public class NetTestWebService {
 
                return TestType.UNKNOWN;
        }
+
+       @Value("${nettest.max.clients}")
+       private void setMaxClients(int count) {
+               maxClients = count;
+       }
 }
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
index 89d51ae..2d071c2 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
@@ -30,9 +30,12 @@ import javax.ws.rs.core.Response.Status;
 
 import org.apache.openmeetings.webservice.NetTestWebService;
 import org.apache.openmeetings.webservice.NetTestWebService.TestType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @RateLimited
 public class RateLimitRequestFilter implements ContainerRequestFilter {
+       private static final Logger log = 
LoggerFactory.getLogger(RateLimitRequestFilter.class);
        private static final String ATTR_LAST_ACCESS_TIME = "LAST_ACCESS_TIME";
        private static final long ALLOWED_TIME = 3000;
 
@@ -53,6 +56,11 @@ public class RateLimitRequestFilter implements 
ContainerRequestFilter {
                                return;
                        }
                }
+               if (NetTestWebService.CLIENT_COUNT.get() > 
NetTestWebService.maxClients) {
+                       log.error("Download: Max client count reached");
+                       
context.abortWith(Response.status(Status.TOO_MANY_REQUESTS).build());
+                       return;
+               }
                Long lastAccessed = 
(Long)session.getAttribute(ATTR_LAST_ACCESS_TIME);
                session.setAttribute(ATTR_LAST_ACCESS_TIME, 
System.currentTimeMillis());
                if (lastAccessed != null && System.currentTimeMillis() - 
lastAccessed.longValue() < ALLOWED_TIME) {

Reply via email to