dav and dav_ext, mp4 module, PROPFIND not working for files

Roman Arutyunyan arut at nginx.com
Mon Jun 30 15:16:52 UTC 2014


Hello!

On 28 Jun 2014, at 10:26, audvare <nginx-forum at nginx.us> wrote:

> Somehow uploadprogress seems to be affecting a request unrelated. I am using
> Cyberduck on Windows to test WebDAV (over HTTPS). It successfully logs in,
> lists files, etc. But it does not download any files because it does not
> like that PROPFIND on a file gives a 405 status. Cut down log:
> 
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 http request line: "PROPFIND
> /video/avgn/t_screwattack_avgn_bugsbcc_901_gt.mp4 HTTP/1.1"
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 http uri:
> "/video/avgn/t_screwattack_avgn_bugsbcc_901_gt.mp4"
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 using configuration "\.mp4$"
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 http finalize request: 405,
> "/video/avgn/t_screwattack_avgn_bugsbcc_901_gt.mp4?" a:1, c:1
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 http special response: 405,
> "/video/avgn/t_screwattack_avgn_bugsbcc_901_gt.mp4?"
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 http set discard body
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 uploadprogress error-tracker
> error: 405
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 uploadprogress error-tracker
> not tracking in this location
> 2014/06/27 23:10:50 [debug] 28436#0: *569278 HTTP/1.1 405 Not Allowed
> Server: nginx
> Date: Sat, 28 Jun 2014 06:10:50 GMT
> Content-Type: text/html
> Content-Length: 166
> Connection: keep-alive
> Keep-Alive: timeout=20
> 
> My configuration is like this (trying to keep only relevant parts):
> server {
> ...
> 
>    dav_methods off;
>    create_full_put_path on;
>    dav_access group:r all:r;
>    dav_ext_methods PROPFIND OPTIONS;
> 
>    location ~ \.mp4$ {
>        mp4;
>        mp4_buffer_size 1m;
>        mp4_max_buffer_size 5m;
>    }
> }
> 
> When I comment out the mp4 location the client downloads the file fine. But
> I do want to use the mp4 module to optimise for those files.

If you have “mp4” directive in a location, this location will only process GET and HEAD
requests and reply with "405 Not Allowed" to all other HTTP methods.  No matter if you
have dav or not you will get 405 to PROPFIND/OPTIONS/PUT/etc due to mp4 module restrictions.

Currently nginx does not seem to be able to do what you want.  If you’re ready to patch
the source here’s the patch fixing the issue.

diff -r 0dd77ef9f114 src/http/modules/ngx_http_mp4_module.c
--- a/src/http/modules/ngx_http_mp4_module.c    Fri Jun 27 13:06:09 2014 +0400
+++ b/src/http/modules/ngx_http_mp4_module.c    Mon Jun 30 19:10:59 2014 +0400
@@ -431,7 +431,7 @@ ngx_http_mp4_handler(ngx_http_request_t 
     ngx_http_core_loc_conf_t  *clcf;
 
     if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
-        return NGX_HTTP_NOT_ALLOWED;
+        return NGX_DECLINED;
     }
 
     if (r->uri.data[r->uri.len - 1] == '/') {



More information about the nginx mailing list