ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: upload module 2.0.7



Я не хочу ломать ветку 2.0, поэтому решу
эту проблему отдельным патчем. См. аттач.

> Не исправили. :(
> Она все еще воспроизводится.
>
> 2008/10/18 Rauan Maemirov <rauan@xxxxxxxxxxxx>:
>> Здравствуйте, Валерий.
>>
>> Была ли решена проблема с application/octet-stream?
>>
>> Т.е. модуль принимал mime-type'ы от
>> браузеров "как есть". Была
>> проблема с Оперой, когда она вместо
>> .mkv-шного типа (matroska)
>> отправляла application/octet-stream.
>>
>> 2008/10/18 Valery Kholodkov <valery+nginxru@xxxxxxxxxxx>:
>>>
>>> Здравствуйте!
>>>
>>> После переезда я рад вернуться к
>>> OSS-проектам. На этот раз секьюрити
>>> релиз:
>>>
>>> Версия 2.0.7 (от 18 октября 2008):
>>>  * Изменение: ограничение размеров
>>> файлов и тела результативного запроса
>>> с
>>> помощью директив upload_max_file_size и
>>> upload_max_output_body_len
>>>  * Добавление: директива upload_pass_args
>>> позволяет передавать аргументы
>>> исходного запроса бакэнду. Спасибо Todd
>>> Fisher.
>>>
>>> Максимальный размер тела
>>> результативного запроса по-умолчанию
>>> установлен в 100 килобайт. Этого
>>> достаточно, чтобы содержать
>>> большинство
>>> форм, и в то же время предотвращает
>>> заполнение памяти большими
>>> нефайловыми
>>> полями.
>>>
>>> Подробности на странице модуля:
>>> http://www.grid.net.ru/nginx/upload.ru.html

-- 
Best regards,
Valery Kholodkov
Index: ngx_http_upload_module.c
===================================================================
--- ngx_http_upload_module.c    (revision 62)
+++ ngx_http_upload_module.c    (working copy)
@@ -33,6 +33,8 @@
 #define ATTACHMENT_STRING                       "attachment"
 #define FILENAME_STRING                         "filename=\""
 #define FIELDNAME_STRING                        "name=\""
+#define UNDEFINED_CONTENT_TYPE1                 "application/octet-stream"
+#define UNDEFINED_CONTENT_TYPE2                 "application/oct-stream"
 
 #define NGX_UPLOAD_MALFORMED    -1
 #define NGX_UPLOAD_NOMEM        -2
@@ -2088,7 +2090,113 @@
     upload_ctx->content_type.data = NULL;
 } /* }}} */
 
+static ngx_int_t /* {{{ ngx_upload_set_exten */
+ngx_upload_set_exten(ngx_http_upload_ctx_t *u, ngx_str_t *exten)
+{
+    ngx_int_t  i;
+
+    exten->len = 0;
+    exten->data = NULL;
+
+    for (i = u->file_name.len - 1; i > 1; i--) {
+        if (u->file_name.data[i] == '.' && u->file_name.data[i - 1] != '/') {
+
+            exten->len = u->file_name.len - i - 1;
+            exten->data = &u->file_name.data[i + 1];
+
+            break;
+
+        } else if (u->file_name.data[i] == '/') {
+            break;
+        }
+    }
+
+    return NGX_OK;
+} /* }}} */
+
+static ngx_int_t /* {{{ ngx_upload_resolve_content_type */
+ngx_upload_resolve_content_type(ngx_http_upload_ctx_t *u, ngx_str_t *exten, 
ngx_str_t *content_type)
+{
+    u_char                     c, *p, *_exten;
+    ngx_str_t                 *type;
+    ngx_uint_t                 i, hash;
+    ngx_http_core_loc_conf_t  *clcf;
+
+    clcf = ngx_http_get_module_loc_conf(u->request, ngx_http_core_module);
+
+    if (exten->len) {
+
+        hash = 0;
+
+        for (i = 0; i < exten->len; i++) {
+            c = exten->data[i];
+
+            if (c >= 'A' && c <= 'Z') {
+
+                p = ngx_palloc(u->request->pool, exten->len);
+                if (p == NULL) {
+                    return NGX_HTTP_INTERNAL_SERVER_ERROR;
+                }
+
+                hash = 0;
+                _exten = p;
+
+                for (i = 0; i < exten->len; i++) {
+                    c = ngx_tolower(exten->data[i]);
+                    hash = ngx_hash(hash, c);
+                    *p++ = c;
+                }
+
+                exten->data = _exten;
+
+                break;
+            }
+
+            hash = ngx_hash(hash, c);
+        }
+
+        type = ngx_hash_find(&clcf->types_hash, hash,
+                             exten->data, exten->len);
+
+        if (type) {
+            *content_type = *type;
+
+            return NGX_OK;
+        }
+    }
+
+    content_type->len = sizeof("application/octet-stream") - 1;
+    content_type->data = (u_char*)"application/octet-stream";
+
+    return NGX_OK;
+} /* }}} */
+
 static ngx_int_t upload_start_file(ngx_http_upload_ctx_t *upload_ctx) { /* {{{ 
*/
+    ngx_str_t                 exten, content_type;
+
+    upload_ctx->start_part_f = ngx_http_upload_start_handler;
+    upload_ctx->finish_part_f = ngx_http_upload_finish_handler;
+    upload_ctx->abort_part_f = ngx_http_upload_abort_handler;
+    upload_ctx->flush_output_buffer_f = ngx_http_upload_flush_output_buffer;
+
+    if(upload_ctx->is_file) {
+        if(upload_ctx->content_type.len == 0 ||
+            !ngx_strncasecmp(upload_ctx->content_type.data, (u_char*) 
UNDEFINED_CONTENT_TYPE1, sizeof(UNDEFINED_CONTENT_TYPE1) - 1) || 
+            !ngx_strncasecmp(upload_ctx->content_type.data, (u_char*) 
UNDEFINED_CONTENT_TYPE2, sizeof(UNDEFINED_CONTENT_TYPE2) - 1)) {
+            ngx_upload_set_exten(upload_ctx, &exten);
+
+            ngx_upload_resolve_content_type(upload_ctx, &exten, &content_type);
+
+            ngx_log_debug2(NGX_LOG_INFO, upload_ctx->log, 0
+                , "guessed content type by extension \"%V\" -> \"%V\""
+                , &exten
+                , &content_type
+                );
+
+            upload_ctx->content_type = content_type;
+        }
+    }
+
     // Call user-defined event handler
     if(upload_ctx->start_part_f)
         return upload_ctx->start_part_f(upload_ctx);


 




Copyright © Lexa Software, 1996-2009.