日期:2014-05-16 浏览次数:20942 次
lerewriterule "<head>" "<head><meta http-equiv='request-id' content='${unique_id}' />" iv
/* mod_line_edit顾名思义就是对文本内容按行进行编辑, * 因此mod要先对输出流进行整理,每一行内容收集到一个apr_bucket里, * 然后将所有行数据放到bbline中,下面的代码实现的就是这个用途。 */ bbline = apr_brigade_create(f->r->pool, f->c->bucket_alloc) ; /* first ensure we have no mid-line breaks that might be in the * middle of a search string causing us to miss it! at the same * time we split into lines to avoid pattern-matching over big * chunks of memory. */ while ( b != apr_brigade_sentinel(bb) ) { if ( !apr_bucket_is_metadata(b) ) { if ( apr_bucket_read(b, &buf, &bytes, apr_block_read) == apr_success ) { if ( bytes == 0 ) { apr_bucket_remove(b) ; } else while ( bytes > 0 ) { switch (cfg->lineend) { case lineend_unix: le = memchr(buf, '\n', bytes) ; break ; case lineend_mac: le = memchr(buf, '\r', bytes) ; break ; case lineend_dos: /* edge-case issue: if a \r\n spans buckets it'll get missed. * not a problem for present purposes, but would be an issue * if we claimed to support pattern matching on the lineends. */ found = 0 ; le = memchr(buf+1, '\n', bytes-1) ; while ( le && !found ) { if ( le[-1] == '\r' ) { found = 1 ; } else { le = memchr(le+1, '\n', bytes-1 - (le+1 - buf)) ; } } if ( !found ) le = 0 ; break; case lineend_any: case lineend_unset: /* edge-case notabug: if a \r\n spans buckets it'll get seen as * two line-ends. it'll insert the \n as a one-byte bucket. */ le_n = memchr(buf, '\n', bytes) ; le_r = memchr(buf, '\r', bytes) ; if ( le_n != null ) if ( le_n == le_r + sizeof(char)) le = le_n ; else if ( (le_r < le_n) && (le_r != null) ) le = le_r ; else le = le_n ; else le = le_r ; break; case lineend_none: le = 0 ; break; case lineend_custom: le = memchr(buf, cfg->lechar, bytes) ; break; } if ( le ) { /* found a lineend in this bucket. */ offs = 1 + ((unsigned int)le-(unsigned int)buf) / sizeof(char) ; apr_bucket_split(b, offs) ; bytes -= offs ; buf += offs ; b1 = apr_bucket_next(b) ; apr_bucket_remove(b); /* is there any previous unterminated content ? */ if ( !apr_brigade_empty(ctx->bbsave) ) { /* append this to any content waiting for a lineend */ apr_brigade_insert_ta