ngx_uint_t
ndk_http_count_phase_handlers (ngx_http_core_main_conf_t *cmcf)
{
    ngx_http_phase_handler_t    *ph;
    ngx_uint_t                   i;
    
    ph = cmcf->phase_engine.handlers;
    
    for (i=0; ph[i].checker; i++) /* void */;
        
    return  i;        
}


ngx_uint_t
ndk_http_parse_request_method (ngx_str_t *m)
{
    switch (m->len) {

        case 3:
            
#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
        {
            u_char    t[4];
            
            ngx_memcpy (t, m->data, 3);
            t[3] = ' ';
            
            if (ndk_str3_cmp (t, 'G', 'E', 'T', ' ')) {
                return  NGX_HTTP_GET;
            }

            if (ndk_str3_cmp (t, 'P', 'U', 'T', ' ')) {
                return  NGX_HTTP_PUT;
            }
        }
            
#else

            if (ndk_str3_cmp (m->data, 'G', 'E', 'T', ' ')) {
                return  NGX_HTTP_GET;
            }

            if (ndk_str3_cmp (m->data, 'P', 'U', 'T', ' ')) {
                return  NGX_HTTP_PUT;
            }

#endif
            break;

        case 4:
            
            if  (m->data[1] == 'O') {

                if (ndk_str3Ocmp (m->data, 'P', 'O', 'S', 'T')) {
                    return  NGX_HTTP_POST;
                }

                if (ndk_str3Ocmp (m->data, 'C', 'O', 'P', 'Y')) {
                    return  NGX_HTTP_COPY;
                }

                if (ndk_str3Ocmp (m->data, 'M', 'O', 'V', 'E')) {
                    return  NGX_HTTP_MOVE;
                }

                if (ndk_str3Ocmp (m->data, 'L', 'O', 'C', 'K')) {
                    return  NGX_HTTP_LOCK;
                }

            } else {

                if (ndk_str4cmp (m->data, 'H', 'E', 'A', 'D')) {
                    return  NGX_HTTP_HEAD;
                }
            }

            break;

        case 5:
            
            if (ndk_str5cmp (m->data, 'M', 'K', 'C', 'O', 'L')) {
                return  NGX_HTTP_MKCOL;
            }

            if (ndk_str5cmp (m->data, 'P', 'A', 'T', 'C', 'H')) {
                return  NGX_HTTP_PATCH;
            }

            if (ndk_str5cmp (m->data, 'T', 'R', 'A', 'C', 'E')) {
                return  NGX_HTTP_TRACE;
            }

            break;

        case 6:
            
            if (ndk_str6cmp (m->data, 'D', 'E', 'L', 'E', 'T', 'E')) {
                return  NGX_HTTP_DELETE;
            }

            if (ndk_str6cmp (m->data, 'U', 'N', 'L', 'O', 'C', 'K')) {
                return  NGX_HTTP_UNLOCK;
            }

            break;

        case 7:
            
            if (ndk_str7_cmp (m->data, 'O', 'P', 'T', 'I', 'O', 'N', 'S', ' '))
            {
                return  NGX_HTTP_OPTIONS;
            }

            break;

        case 8:
            
            if (ndk_str8cmp (m->data, 'P', 'R', 'O', 'P', 'F', 'I', 'N', 'D'))
            {
                return  NGX_HTTP_PROPFIND;
            }

            break;

        case 9:
            
            if (ndk_str9cmp (m->data, 'P', 'R', 'O', 'P', 'P', 'A', 'T', 'C', 'H'))
            {
                return  NGX_HTTP_PROPPATCH;
            }

            break;
    }

    return  0;
}