@@ -59,11 +59,11 @@ char *ngx_http_uwsgi_cache_purge_conf(ngx_conf_t *cf,
5959ngx_int_t ngx_http_uwsgi_cache_purge_handler (ngx_http_request_t * r );
6060# endif /* NGX_HTTP_UWSGI */
6161
62- ngx_int_t ngx_http_cache_purge_handler (ngx_http_request_t * r ,
62+ ngx_int_t ngx_http_cache_purge_init (ngx_http_request_t * r ,
6363 ngx_http_file_cache_t * cache , ngx_http_complex_value_t * cache_key );
64+ void ngx_http_cache_purge_handler (ngx_http_request_t * r );
6465
65- ngx_int_t ngx_http_file_cache_purge (ngx_http_request_t * r ,
66- ngx_http_file_cache_t * cache , ngx_http_complex_value_t * cache_key );
66+ ngx_int_t ngx_http_file_cache_purge (ngx_http_request_t * r );
6767
6868static ngx_command_t ngx_http_cache_purge_module_commands [] = {
6969
@@ -240,8 +240,20 @@ ngx_http_fastcgi_cache_purge_handler(ngx_http_request_t *r)
240240
241241 flcf = ngx_http_get_module_loc_conf (r , ngx_http_fastcgi_module );
242242
243- return ngx_http_cache_purge_handler (r , flcf -> upstream .cache -> data ,
244- & flcf -> cache_key );
243+ if (ngx_http_cache_purge_init (r , flcf -> upstream .cache -> data ,
244+ & flcf -> cache_key )
245+ != NGX_OK )
246+ {
247+ return NGX_HTTP_INTERNAL_SERVER_ERROR ;
248+ }
249+
250+ # if defined(nginx_version ) && (nginx_version >= 8011 )
251+ r -> main -> count ++ ;
252+ # endif
253+
254+ ngx_http_cache_purge_handler (r );
255+
256+ return NGX_DONE ;
245257}
246258# endif /* NGX_HTTP_FASTCGI */
247259
@@ -352,8 +364,20 @@ ngx_http_proxy_cache_purge_handler(ngx_http_request_t *r)
352364
353365 plcf = ngx_http_get_module_loc_conf (r , ngx_http_proxy_module );
354366
355- return ngx_http_cache_purge_handler (r , plcf -> upstream .cache -> data ,
356- & plcf -> cache_key );
367+ if (ngx_http_cache_purge_init (r , plcf -> upstream .cache -> data ,
368+ & plcf -> cache_key )
369+ != NGX_OK )
370+ {
371+ return NGX_HTTP_INTERNAL_SERVER_ERROR ;
372+ }
373+
374+ # if defined(nginx_version ) && (nginx_version >= 8011 )
375+ r -> main -> count ++ ;
376+ # endif
377+
378+ ngx_http_cache_purge_handler (r );
379+
380+ return NGX_DONE ;
357381}
358382# endif /* NGX_HTTP_PROXY */
359383
@@ -437,8 +461,20 @@ ngx_http_scgi_cache_purge_handler(ngx_http_request_t *r)
437461
438462 slcf = ngx_http_get_module_loc_conf (r , ngx_http_scgi_module );
439463
440- return ngx_http_cache_purge_handler (r , slcf -> upstream .cache -> data ,
441- & slcf -> cache_key );
464+ if (ngx_http_cache_purge_init (r , slcf -> upstream .cache -> data ,
465+ & slcf -> cache_key )
466+ != NGX_OK )
467+ {
468+ return NGX_HTTP_INTERNAL_SERVER_ERROR ;
469+ }
470+
471+ # if defined(nginx_version ) && (nginx_version >= 8011 )
472+ r -> main -> count ++ ;
473+ # endif
474+
475+ ngx_http_cache_purge_handler (r );
476+
477+ return NGX_DONE ;
442478}
443479# endif /* NGX_HTTP_SCGI */
444480
@@ -527,29 +563,32 @@ ngx_http_uwsgi_cache_purge_handler(ngx_http_request_t *r)
527563
528564 ulcf = ngx_http_get_module_loc_conf (r , ngx_http_uwsgi_module );
529565
530- return ngx_http_cache_purge_handler (r , ulcf -> upstream .cache -> data ,
531- & ulcf -> cache_key );
566+ if (ngx_http_cache_purge_init (r , ulcf -> upstream .cache -> data ,
567+ & ulcf -> cache_key )
568+ != NGX_OK )
569+ {
570+ return NGX_HTTP_INTERNAL_SERVER_ERROR ;
571+ }
572+
573+ # if defined(nginx_version ) && (nginx_version >= 8011 )
574+ r -> main -> count ++ ;
575+ # endif
576+
577+ ngx_http_cache_purge_handler (r );
578+
579+ return NGX_DONE ;
532580}
533581# endif /* NGX_HTTP_UWSGI */
534582
535583ngx_int_t
536- ngx_http_cache_purge_handler (ngx_http_request_t * r ,
537- ngx_http_file_cache_t * cache , ngx_http_complex_value_t * cache_key )
584+ ngx_http_cache_purge_send_response (ngx_http_request_t * r )
538585{
539586 ngx_chain_t out ;
540587 ngx_buf_t * b ;
541588 ngx_str_t * key ;
542589 ngx_int_t rc ;
543590 size_t len ;
544591
545- rc = ngx_http_file_cache_purge (r , cache , cache_key );
546-
547- if (rc == NGX_ERROR ) {
548- return NGX_HTTP_INTERNAL_SERVER_ERROR ;
549- } else if (rc == NGX_DECLINED ) {
550- return NGX_HTTP_NOT_FOUND ;
551- }
552-
553592 key = r -> cache -> keys .elts ;
554593
555594 len = sizeof (ngx_http_cache_purge_success_page_top ) - 1
@@ -598,12 +637,12 @@ ngx_http_cache_purge_handler(ngx_http_request_t *r,
598637}
599638
600639ngx_int_t
601- ngx_http_file_cache_purge (ngx_http_request_t * r , ngx_http_file_cache_t * cache ,
640+ ngx_http_cache_purge_init (ngx_http_request_t * r , ngx_http_file_cache_t * cache ,
602641 ngx_http_complex_value_t * cache_key )
603642{
604- ngx_http_cache_t * c ;
605- ngx_str_t * key ;
606- ngx_int_t rc ;
643+ ngx_http_cache_t * c ;
644+ ngx_str_t * key ;
645+ ngx_int_t rc ;
607646
608647 rc = ngx_http_discard_request_body (r );
609648 if (rc != NGX_OK ) {
@@ -637,24 +676,63 @@ ngx_http_file_cache_purge(ngx_http_request_t *r, ngx_http_file_cache_t *cache,
637676
638677 ngx_http_file_cache_create_key (r );
639678
640- rc = ngx_http_file_cache_open (r );
679+ return NGX_OK ;
680+ }
681+
682+ void
683+ ngx_http_cache_purge_handler (ngx_http_request_t * r )
684+ {
685+ # if (NGX_HAVE_FILE_AIO )
686+ if (r -> aio ) {
687+ return ;
688+ }
689+ # endif
690+
691+ switch (ngx_http_file_cache_purge (r )) {
692+ case NGX_DECLINED :
693+ ngx_http_finalize_request (r , NGX_HTTP_NOT_FOUND );
694+ return ;
695+ case NGX_ERROR :
696+ ngx_http_finalize_request (r , NGX_HTTP_INTERNAL_SERVER_ERROR );
697+ return ;
698+ # if (NGX_HAVE_FILE_AIO )
699+ case NGX_AGAIN :
700+ r -> write_event_handler = ngx_http_cache_purge_handler ;
701+ return ;
702+ # endif
703+ default :
704+ r -> write_event_handler = ngx_http_request_empty_handler ;
705+ ngx_http_finalize_request (r , ngx_http_cache_purge_send_response (r ));
706+ }
707+ }
708+
709+ ngx_int_t
710+ ngx_http_file_cache_purge (ngx_http_request_t * r )
711+ {
712+ ngx_http_file_cache_t * cache ;
713+ ngx_http_cache_t * c ;
714+
715+ switch (ngx_http_file_cache_open (r )) {
716+ case NGX_OK :
717+ case NGX_HTTP_CACHE_STALE :
641718# if defined(nginx_version ) \
642719 && ((nginx_version >= 8001 ) \
643720 || ((nginx_version < 8000 ) && (nginx_version >= 7060 )))
644- if (rc == NGX_HTTP_CACHE_UPDATING || rc == NGX_HTTP_CACHE_STALE ) {
645- # else
646- if (rc == NGX_HTTP_CACHE_STALE ) {
721+ case NGX_HTTP_CACHE_UPDATING :
647722# endif
648- rc = NGX_OK ;
723+ break ;
724+ case NGX_DECLINED :
725+ return NGX_DECLINED ;
726+ # if (NGX_HAVE_FILE_AIO )
727+ case NGX_AGAIN :
728+ return NGX_AGAIN ;
729+ # endif
730+ default :
731+ return NGX_ERROR ;
649732 }
650733
651- if (rc != NGX_OK ) {
652- if (rc == NGX_DECLINED ) {
653- return rc ;
654- } else {
655- return NGX_ERROR ;
656- }
657- }
734+ c = r -> cache ;
735+ cache = c -> file_cache ;
658736
659737 /*
660738 * delete file from disk but *keep* in-memory node,
0 commit comments