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 cbdfd2f  [OPENMEETINGS-2551] NetTest client count can be limited
     new 57d9531  Merge branch 'master' of github.com:apache/openmeetings
cbdfd2f is described below

commit cbdfd2f9731a8fe3daa9b4adf5da4a063fde161d
Author: Maxim Solodovnik <solomax...@gmail.com>
AuthorDate: Thu Jan 14 00:45:29 2021 +0700

    [OPENMEETINGS-2551] NetTest client count can be limited
---
 .../main/webapp/WEB-INF/classes/cxf-servlet.xml    |  3 ++
 .../webapp/WEB-INF/classes/openmeetings.properties |  3 ++
 .../openmeetings/webservice/NetTestWebService.java | 50 +++++++++++++++++++---
 3 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml 
b/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml
index 38d3d60..6ba3b7d 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml
@@ -23,6 +23,7 @@
                xmlns:context="http://www.springframework.org/schema/context";
                xmlns:jaxrs="http://cxf.apache.org/jaxrs";
                xmlns:jaxws="http://cxf.apache.org/jaxws";
+               xmlns:p="http://www.springframework.org/schema/p";
                xsi:schemaLocation="
                        http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd
@@ -35,6 +36,8 @@
 
        <context:annotation-config />
        <context:component-scan 
base-package="org.apache.openmeetings.webservice" />
+       <bean 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
+               p:location="classpath:openmeetings.properties" />
 
        <!-- (writeXsiType=false) -->
        <jaxrs:server id="server" address="/">
diff --git 
a/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings.properties 
b/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings.properties
index d1cd572..3dc2989 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings.properties
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings.properties
@@ -49,6 +49,9 @@ kurento.kuid=df992960-e7b0-11ea-9acd-337fb30dd93d
 ## this list can be space and/or comma separated
 kurento.ignored.kuids=
 
+################## NetTest ##################
+nettest.max.clients=50
+
 ################## SIP ##################
 ### Should be updated with real values for Asterisk ###
 sip.hostname=
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 709cb95..0af9d02 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
@@ -22,7 +22,9 @@ package org.apache.openmeetings.webservice;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.annotation.PostConstruct;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
@@ -32,10 +34,12 @@ 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;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 @Service("netTestWebService")
@@ -53,6 +57,15 @@ 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;
+
+       @PostConstruct
+       private void report() {
+               log.debug("MaxClients: {}", maxClients);
+       }
 
        @RateLimited
        @GET
@@ -60,8 +73,15 @@ public class NetTestWebService {
        @Path("/")
        public Response get(@QueryParam("type") String type, 
@QueryParam("size") int inSize) {
                final int size;
-               TestType testType = getTypeByString(type);
+               final TestType testType = getTypeByString(type);
                log.debug("Network test:: get, {}, {}", testType, inSize);
+               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) {
@@ -72,6 +92,7 @@ public class NetTestWebService {
                                size = JITTER_PACKET_SIZE;
                                break;
                        default:
+                               clientCount.incrementAndGet();
                                size = inSize;
                                break;
                }
@@ -88,6 +109,14 @@ public class NetTestWebService {
                        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");
@@ -102,13 +131,22 @@ public class NetTestWebService {
                if (size > MAX_UPLOAD_SIZE) {
                        return;
                }
+               if (clientCount.intValue() > maxClients) {
+                       log.error("Upload: Max client count reached");
+                       return;
+               }
+               clientCount.incrementAndGet();
                byte[] b = new byte[1024];
-               int totalCount = 0
-                               , count;
-               while ((count = stream.read(b)) > -1) {
-                       totalCount += count;
+               int totalCount = 0;
+               int count;
+               try {
+                       while ((count = stream.read(b)) > -1) {
+                               totalCount += count;
+                       }
+                       log.debug("Total bytes read {}", totalCount);
+               } finally {
+                       clientCount.decrementAndGet();
                }
-               log.debug("Total bytes read {}", totalCount);
        }
 
        public static TestType getTypeByString(String typeString) {

Reply via email to