■スレッドリストへ戻る■ 全部 1- 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 最新50

read.cgi再開発スレ Part2

418 :◆cZfSunOs.U :2005/12/05(月) 21:39:21 ID:qOa8SuPx0
>>415 乙です.

>たぶん、HEADしてGETするとか、そういう感じなのかしら。

そのように2回サブリクエストを実行する形だと非効率になりそうなので,
雪だるま版では lookfor() で内容取得まで一緒にやってしまった方が良さそうな気もします.
その代わり,dat ファイルを読み込んでる部分をスキップすると.

----[この関数を定義しておく]------------------------------------------
#ifdef SNOWMAN
static apr_status_t rdat_filter(ap_filter_t *f, apr_bucket_brigade *b)
{
    return ap_save_brigade(f, (apr_bucket_brigade **)&f->ctx, &b, f->r->pool);
}
#endif
----[lookfor() の中]--------------------------------------------------
#ifdef SNOWMAN
    int rv;
#if defined(AP_SERVER_MINORVERSION_NUMBER) && AP_SERVER_MINORVERSION_NUMBER >= 2
    ap_filter_rec_t frec = {"READDAT", {rdat_filter}, NULL, AP_FTYPE_RESOURCE, NULL, NULL, 0, 0};
#else
    ap_filter_rec_t frec = {"READDAT", {rdat_filter}, NULL, AP_FTYPE_RESOURCE, NULL};
#endif
    ap_filter_t f = {&frec, NULL, NULL, r, r->connection};
    char *uri = apr_pstrcat(r->pool, "/", ch2->zz_bbs, "/dat/", ch2->zz_key, ".dat", NULL);
    request_rec *rdat = ap_sub_req_lookup_uri(uri, r, &f);

    if (!(rv = rdat->status == HTTP_OK ? ap_run_sub_req(rdat) : rdat->status)) {
        apr_brigade_pflatten(f.ctx, &ch2->BigBuffer, &ch2->zz_filesize, r->pool);
        apr_brigade_destroy(f.ctx);
        ch2->zz_mtime = rdat->mtime ? rdat->mtime
            : apr_date_parse_http(apr_table_get(rdat->headers_out, "Last-Modified"));
    }
    ap_destroy_sub_req(rdat);

    if (!rv) {
        ch2->where = W_LIVE;
        return 1;
    }
#else
    if(!apr_stat(&CountStat,ch2->zz_fName,APR_FINFO_MIN,r->pool)) /* found */
    {
        ch2->zz_filesize = CountStat.size ;
        ch2->zz_mtime = CountStat.mtime ;
        ch2->where = W_LIVE ;
        return 1 ;
    }
#endif
----[BigBuffer アロケート / dat 読み込みの部分はスキップ]-------------
#ifndef SNOWMAN
    ch2->BigBuffer = apr_palloc(r->pool, ch2->zz_filesize); /* ←多分こんな形で BigBuffer 領域を確保してますよね? */
    if (apr_file_open(&in,ch2->zz_fName,APR_READ,APR_OS_DEFAULT,r->pool)) {return 3011;}
    apr_file_read(in, ch2->BigBuffer, &ch2->zz_filesize);
    apr_file_close(in) ;
#endif
----------------------------------------------------------------------

284KB
新着レスの表示

スレッドリストへ戻る 全部 前100 次100 最新50

0ch BBS 2004-10-30