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

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


The following commit(s) were added to refs/heads/master by this push:
     new e59c7070227 [fix](stream_load)fix bug for stream (#27752)
e59c7070227 is described below

commit e59c7070227dfabedadddb9e02f97ade7590518d
Author: xy <[email protected]>
AuthorDate: Wed Dec 20 09:47:52 2023 +0800

    [fix](stream_load)fix bug for stream (#27752)
    
    1. forbid thed  stream_load without content-length or chunked Transfer 
Encoding
    2. forbid thed  stream_load both with content-length and chunked Transfer 
Encoding
    
    Co-authored-by: xingying01 <[email protected]>
---
 be/src/http/action/stream_load.cpp                 | 12 ++++
 .../load_p0/stream_load/test_stream_load.groovy    | 71 ++++++++++++++++++++++
 2 files changed, 83 insertions(+)

diff --git a/be/src/http/action/stream_load.cpp 
b/be/src/http/action/stream_load.cpp
index 846bbbdc1ca..7d336a932b6 100644
--- a/be/src/http/action/stream_load.cpp
+++ b/be/src/http/action/stream_load.cpp
@@ -326,6 +326,18 @@ Status StreamLoadAction::_on_header(HttpRequest* http_req, 
std::shared_ptr<Strea
             ctx->is_chunked_transfer = true;
         }
     }
+    if (UNLIKELY((http_req->header(HttpHeaders::CONTENT_LENGTH).empty() &&
+                  !ctx->is_chunked_transfer))) {
+        LOG(WARNING) << "content_length is empty and 
transfer-encoding!=chunked, please set "
+                        "content_length or transfer-encoding=chunked";
+        return Status::InternalError(
+                "content_length is empty and transfer-encoding!=chunked, 
please set content_length "
+                "or transfer-encoding=chunked");
+    } else if (UNLIKELY(!http_req->header(HttpHeaders::CONTENT_LENGTH).empty() 
&&
+                        ctx->is_chunked_transfer)) {
+        LOG(WARNING) << "please do not set both content_length and 
transfer-encoding";
+        return Status::InternalError("please do not set both content_length 
and transfer-encoding");
+    }
 
     if (!http_req->header(HTTP_TIMEOUT).empty()) {
         try {
diff --git a/regression-test/suites/load_p0/stream_load/test_stream_load.groovy 
b/regression-test/suites/load_p0/stream_load/test_stream_load.groovy
index e1d32a8e00c..4e809ff2a5d 100644
--- a/regression-test/suites/load_p0/stream_load/test_stream_load.groovy
+++ b/regression-test/suites/load_p0/stream_load/test_stream_load.groovy
@@ -1575,5 +1575,76 @@ suite("test_stream_load", "p0") {
     } finally {
         sql """ DROP TABLE IF EXISTS ${tableName19} FORCE"""
     }
+
+   def sql_result = sql """ select Host, HttpPort from backends() where alive 
= true limit 1; """
+  
+   log.info(sql_result[0][0].toString())
+   log.info(sql_result[0][1].toString())
+   log.info(sql_result[0].size.toString())
+
+   def beHost=sql_result[0][0]
+   def beHttpPort=sql_result[0][1]
+   log.info("${beHost}".toString())
+   log.info("${beHttpPort}".toString());
+
+    //test be : chunked transfer + Content Length
+    try {
+       sql """ DROP TABLE IF EXISTS ${tableName16} """
+       sql """
+           CREATE TABLE IF NOT EXISTS ${tableName16} (
+               `k1` bigint(20) NULL DEFAULT "1",
+               `k2` bigint(20) NULL ,
+               `v1` tinyint(4) NULL,
+               `v2` tinyint(4) NULL,
+               `v3` tinyint(4) NULL,
+               `v4` DATETIME NULL
+           ) ENGINE=OLAP
+           DISTRIBUTED BY HASH(`k1`) BUCKETS 3
+           PROPERTIES ("replication_allocation" = "tag.location.default: 1");
+       """
+   
+       def command = "curl --location-trusted -u 
${context.config.feHttpUser}:${context.config.feHttpPassword} -H 
column_separator:| -H ${db}:${tableName16} -H Content-Length:0  -H 
Transfer-Encoding:chunked -H columns:k1,k2,v1,v2,v3 -T 
${context.dataPath}/test_chunked_transfer.csv 
http://${beHost}:${beHttpPort}/api/${db}/${tableName16}/_stream_load";
+       log.info("test chunked transfer command: ${command}")
+       def process = command.execute()
+       code = process.waitFor()
+       out = process.text
+       log.info("test chunked transfer result: ${out}".toString())
+       def json = parseJson(out)
+       assertEquals("fail", json.Status.toLowerCase())
+       assertTrue(json.Message.contains("[INTERNAL_ERROR]please do not set 
both content_length and transfer-encoding"))
+    } finally {
+       sql """ DROP TABLE IF EXISTS ${tableName16} FORCE"""
+    }
+
+
+    //test be : no chunked transfer + no Content Length
+    try {
+        sql """ DROP TABLE IF EXISTS ${tableName16} """
+        sql """
+            CREATE TABLE IF NOT EXISTS ${tableName16} (
+                `k1` bigint(20) NULL DEFAULT "1",
+                `k2` bigint(20) NULL ,
+                `v1` tinyint(4) NULL,
+                `v2` tinyint(4) NULL,
+                `v3` tinyint(4) NULL,
+                `v4` DATETIME NULL
+            ) ENGINE=OLAP
+            DISTRIBUTED BY HASH(`k1`) BUCKETS 3
+            PROPERTIES ("replication_allocation" = "tag.location.default: 1");
+        """
+
+        def command = "curl --location-trusted -u 
${context.config.feHttpUser}:${context.config.feHttpPassword} -H 
column_separator:| -H ${db}:${tableName16} -H Content-Length:  -H 
Transfer-Encoding: -T ${context.dataPath}/test_chunked_transfer.csv 
http://${beHost}:${beHttpPort}/api/${db}/${tableName16}/_stream_load";
+        log.info("test chunked transfer command: ${command}")
+        def process = command.execute()
+        code = process.waitFor()
+        out = process.text
+        log.info("test chunked transfer result: ${out}".toString())
+        def json = parseJson(out)
+        assertEquals("fail", json.Status.toLowerCase())
+        assertTrue(json.Message.contains("[INTERNAL_ERROR]content_length is 
empty and transfer-encoding!=chunked, please set content_length or 
transfer-encoding=chunked"))
+    } finally {
+        sql """ DROP TABLE IF EXISTS ${tableName16} FORCE"""
+    }
+
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to