diaosj commented on issue #4010:
URL: https://github.com/apache/apisix/issues/4010#issuecomment-816365499


   > > What's the default unit?
   > 
   > `ngx_conf_set_msec_slot` calls `ngx_parse_time`, in such a case, when the 
time doesn't contain the unit, nginx treats it a duration in seconds.
   > 
   Sorry, I reopen this issue.
   Just to make sure.
   I see `ngx_parse_time` is called in `ngx_conf_set_msec_slot` 
(https://github.com/nginx/nginx/blob/eb52de83114e8d98722cd17ec8435c47956b6315/src/core/ngx_conf_file.c#L1276):
   ```c
   *msp = ngx_parse_time(&value[1], 0);
   ```
   
   I jumped to the definition of `ngx_parse_time` 
(https://github.com/nginx/nginx/blob/eb52de83114e8d98722cd17ec8435c47956b6315/src/core/ngx_parse.c#L112):
   ```c
   ngx_int_t
   ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec)Ruslan Ermilov, 10 years 
ago: • Improved ngx_parse_time() code readability.
   {
       u_char      *p, *last;
       ngx_int_t    value, total, scale;
       ngx_int_t    max, cutoff, cutlim;
       ngx_uint_t   valid;
       enum {
           st_start = 0,
           st_year,
           st_month,
           st_week,
           st_day,
           st_hour,
           st_min,
           st_sec,
           st_msec,
           st_last
       } step;
   
       valid = 0;
       value = 0;
       total = 0;
       cutoff = NGX_MAX_INT_T_VALUE / 10;
       cutlim = NGX_MAX_INT_T_VALUE % 10;
       step = is_sec ? st_start : st_month;
   
       p = line->data;
       last = p + line->len;
   
       while (p < last) {
   
           if (*p >= '0' && *p <= '9') {
               if (value >= cutoff && (value > cutoff || *p - '0' > cutlim)) {
                   return NGX_ERROR;
               }
   
               value = value * 10 + (*p++ - '0');
               valid = 1;
               continue;
           }
   
           switch (*p++) {
   
           case 'y':
               if (step > st_start) {
                   return NGX_ERROR;
               }
               step = st_year;
               max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 365);
               scale = 60 * 60 * 24 * 365;
               break;
   
           case 'M':
               if (step >= st_month) {
                   return NGX_ERROR;
               }
               step = st_month;
               max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 30);
               scale = 60 * 60 * 24 * 30;
               break;
   
           case 'w':
               if (step >= st_week) {
                   return NGX_ERROR;
               }
               step = st_week;
               max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 7);
               scale = 60 * 60 * 24 * 7;
               break;
   
           case 'd':
               if (step >= st_day) {
                   return NGX_ERROR;
               }
               step = st_day;
               max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24);
               scale = 60 * 60 * 24;
               break;
   
           case 'h':
               if (step >= st_hour) {
                   return NGX_ERROR;
               }
               step = st_hour;
               max = NGX_MAX_INT_T_VALUE / (60 * 60);
               scale = 60 * 60;
               break;
   
           case 'm':
               if (p < last && *p == 's') {
                   if (is_sec || step >= st_msec) {
                       return NGX_ERROR;
                   }
                   p++;
                   step = st_msec;
                   max = NGX_MAX_INT_T_VALUE;
                   scale = 1;
                   break;
               }
   
               if (step >= st_min) {
                   return NGX_ERROR;
               }
               step = st_min;
               max = NGX_MAX_INT_T_VALUE / 60;
               scale = 60;
               break;
   
           case 's':
               if (step >= st_sec) {
                   return NGX_ERROR;
               }
               step = st_sec;
               max = NGX_MAX_INT_T_VALUE;
               scale = 1;
               break;
   
           case ' ':
               if (step >= st_sec) {
                   return NGX_ERROR;
               }
               step = st_last;
               max = NGX_MAX_INT_T_VALUE;
               scale = 1;
               break;
   
           default:
               return NGX_ERROR;
           }
   
           if (step != st_msec && !is_sec) {
               scale *= 1000;
               max /= 1000;
           }
   
           if (value > max) {
               return NGX_ERROR;
           }
   
           value *= scale;
   
           if (total > NGX_MAX_INT_T_VALUE - value) {
               return NGX_ERROR;
           }
   
           total += value;
   
           value = 0;
   
           while (p < last && *p == ' ') {
               p++;
           }
       }
   
       if (!valid) {
           return NGX_ERROR;
       }
   
       if (!is_sec) {
           if (value > NGX_MAX_INT_T_VALUE / 1000) {
               return NGX_ERROR;
           }
   
           value *= 1000;
       }
   
       if (total > NGX_MAX_INT_T_VALUE - value) {
           return NGX_ERROR;
       }
   
       return total + value;
   }
   ```
   
   The input param `is_sec` is 0. So the variable `step` in L136 is assigned to 
`st_month`. 
   ```c
   step = is_sec ? st_start : st_month;
   ```
   
   Seems like to go to `case ' ':` branch. Then the variable `step` in L233 is 
assigned to `st_last`. 
   ```c
   step = st_last;
   ```
   
   Then the `if (step != st_msec && !is_sec)` branch in L242 makes `scale` to 
1000 timed. 
   ```c
   scale *= 1000;
   ```
   
   Is this what you said, "nginx treats it a duration in seconds"?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to