示例#1
0
int HttpReq::clone(HttpReq *pProto, SubSessInfo_t *pSubSessInfo)
{
    int ret = 0;
    //copy request headers
    m_pVHostMap = pProto->m_pVHostMap;
    m_pVHost = pProto->m_pVHost;

    m_iHttpHeaderEnd = m_iReqHeaderBufRead = m_iReqHeaderBufFinished
                       = pProto->m_iHttpHeaderEnd;
    m_headerBuf.resize(HEADER_BUF_PAD);

    int begin = m_headerBuf.size();

    m_headerBuf.append(pProto->m_headerBuf.getPointer(begin),
                       m_iHttpHeaderEnd - begin);

    memmove(&m_reqLineOff, &pProto->m_reqLineOff,
            (char *)(&m_reqURLLen + 1) - (char *)&m_reqLineOff);

    memmove(m_commonHeaderLen, &pProto->m_commonHeaderLen,
            (char *)&m_headerIdxOff - (char *)m_commonHeaderLen);

    m_iLeadingWWW = pProto->m_iLeadingWWW;
    m_iBodyType = pProto->m_iBodyType;
    m_iContextState = pProto->getContextState(DUM_BENCHMARK_TOOL);
    m_lEntityLength = pProto->m_lEntityLength;
    m_iKeepAlive = pProto->m_iKeepAlive & ~IS_KEEPALIVE;
#ifdef _ENTERPRISE_
    m_pCacheVary = pProto->m_pCacheVary;
#endif
    m_iAcceptGzip = 0; //pProto->m_iAcceptGzip &
    m_iRedirects = 0;
    clearContextState(LOG_ACCESS_404);


    if (pProto->m_headerIdxOff)
    {
        //copy unkown header index
    }

    if (pProto->m_iContextState & COOKIE_PARSED)
    {
        m_iContextState |= COOKIE_PARSED;
        m_cookies.copy(pProto->m_cookies);
    }
    if (pProto->m_commonHeaderOffset[ HttpHeader::H_COOKIE ] >
        m_iHttpHeaderEnd)
    {
        copyCookieHeaderToBufEnd(
            pProto->m_commonHeaderOffset[ HttpHeader::H_COOKIE ],
            pProto->getHeader(HttpHeader::H_COOKIE),
            pProto->getHeaderLen(HttpHeader::H_COOKIE)
        );
    }
    else if (pProto->m_commonHeaderOffset[ HttpHeader::H_COOKIE ]
             + pProto->m_commonHeaderLen[ HttpHeader::H_COOKIE ] > m_iHttpHeaderEnd)
    {
        m_headerBuf.append(pProto->m_headerBuf.getPointer(m_iHttpHeaderEnd),
                           pProto->m_commonHeaderOffset[ HttpHeader::H_COOKIE ]
                           + pProto->m_commonHeaderLen[ HttpHeader::H_COOKIE ]
                           + 2 - m_iHttpHeaderEnd);
    }

    if (pSubSessInfo->m_flag & SUB_REQ_SETREFERER)
        setReferer(pProto->getOrgReqURL(), pProto->getOrgReqURLLen());

    if ((pSubSessInfo->m_method == HttpMethod::HTTP_POST)
        && (pSubSessInfo->m_bufReqBody != NULL))
    {
        addContentLenHeader(pSubSessInfo->m_bufReqBody->size());
        updateReqHeader(HttpHeader::H_CONTENT_TYPE,
                        "application/x-www-form-urlencoded", 33);

    }

    m_iHeaderStatus = HEADER_OK;

    int totalUrlLen = pSubSessInfo->m_cacheKey.m_iUriLen;
    char *p, *pURL;
    if (pSubSessInfo->m_cacheKey.m_pQs)
        totalUrlLen += pSubSessInfo->m_cacheKey.m_iQsLen + 1;
    if (totalUrlLen <= pProto->getOrgReqURLLen())
    {
        char *pOrgEnd;
        p = pURL = m_headerBuf.getPointer(pProto->m_reqURLOff);
        pOrgEnd = p + pProto->m_reqURLLen;

        memmove(p, pSubSessInfo->m_cacheKey.m_pUri,
                pSubSessInfo->m_cacheKey.m_iUriLen);
        p += pSubSessInfo->m_cacheKey.m_iUriLen;
        if (pSubSessInfo->m_cacheKey.m_pQs
            && pSubSessInfo->m_cacheKey.m_iQsLen > 0)
        {
            if (memchr(pSubSessInfo->m_cacheKey.m_pUri, '?',
                       pSubSessInfo->m_cacheKey.m_iUriLen))
                *p++ = '&';
            else
                *p++ = '?';
            memmove(p, pSubSessInfo->m_cacheKey.m_pQs,
                    pSubSessInfo->m_cacheKey.m_iQsLen);
            p += pSubSessInfo->m_cacheKey.m_iQsLen;
        }
        while (p < pOrgEnd)
            *p++ = ' ';
        m_reqURLLen = totalUrlLen;
    }
    else
    {
        setNewOrgUrl(pSubSessInfo->m_cacheKey.m_pUri,
                     pSubSessInfo->m_cacheKey.m_iUriLen,
                     pSubSessInfo->m_cacheKey.m_pQs,
                     pSubSessInfo->m_cacheKey.m_iQsLen);

    }
    m_iHttpHeaderEnd = m_iReqHeaderBufRead = m_iReqHeaderBufFinished
                       = m_headerBuf.size();

    if ((pSubSessInfo->m_method == HttpMethod::HTTP_POST)
        && (pSubSessInfo->m_bufReqBody != NULL))
        cloneReqBody(pSubSessInfo->m_bufReqBody);

    pURL = m_headerBuf.getPointer(m_reqURLOff);
    ret = setCurrentURL(pURL, totalUrlLen, 1);
    if (ret == 0)
        m_urls[0] = m_curURL;
    return ret;
}
示例#2
0
文件: cocolog.c 项目: tsupo/xmlRPC
int
deleteCocologFiles( const char *url,        // (I)   削除したいファイルの URL
                    char       *cookie )    // (I/O) クッキー
{
    int     ret = 0;
    char    targetURL[MAX_URLLENGTH];
    char    *request;
    char    *response;
    char    path[MAX_URLLENGTH];
    char    filename[MAX_URLLENGTH];
    char    magic_token[MAX_KEYLENGTH];
    char    *p, *q;
    size_t  sz = MAX_CONTENT_SIZE * 4;

    if (!cookie || !(*cookie) ||
         !url                    )
        return ( ret );

    if ( xmlrpc_p->verbose ) {
        dprintf( "deleteCocologFiles: 削除しようとしているファイル(URL)"
                 " → %s\n",
                 url );
    }

    path[0]     = NUL;
    filename[0] = NUL;
    p = strstr( url, "://" );
    if ( !p )
        return ( ret );
    p += 3;
    q = strchr( p, '/' );
    if ( !q )
        return ( ret );
    p = q + 1;
    q = strrchr( p, '/' );
    if ( q ) {
        strncpy( path, p, q - p );
        path[q - p] = NUL;
    }
    strcpy( filename, p );

    request  = (char *)malloc( MAX_CONTENT_SIZE );
    if ( !request ) 
        return ( ret );
    response = (char *)malloc( sz );
    if ( !response ) {
        free( request );
        return ( ret );
    }
    memset( request,  0x00, MAX_CONTENT_SIZE );

    /* magic_token を取得 */
    setReferer( xmlrpc_p->blogKind == BLOGKIND_COCOLOGFREE
                    ? COCOLOGFREE_FILEMANAGER
                    : COCOLOG_FILEMANAGER );
    getMagicToken( path, magic_token, &response, &sz, cookie );

    /* ファイルを削除 */
    strcpy( targetURL,
            xmlrpc_p->blogKind == BLOGKIND_COCOLOGFREE
                ? COCOLOGFREE_FILEMANAGER
                : COCOLOG_FILEMANAGER );
    setTargetURL( targetURL );
    if ( magic_token[0] ) {
        if ( path[0] )
            sprintf( request,
                     "type=file&"
                     "__mode=delete&"
                     "magic_token=%s&"
                     "path=%s&"
                     "id=%s&"
                     "submit=%s",
                     magic_token,
                     path, filename,
                     encodeURL( sjis2utf("削除する") ) );
        else
            sprintf( request,
                     "type=file&"
                     "__mode=delete&"
                     "magic_token=%s&"
                     "path=&"
                     "id=%s&"
                     "submit=%s",
                     magic_token,
                     filename,
                     encodeURL( sjis2utf("削除する") ) );

        setUpReceiveBuffer( response, sz );
        ret = httpPostWithSession( xmlrpc_p->webServer, xmlrpc_p->webPage,
                                   "application/x-www-form-urlencoded",
                                   request, response, cookie,
                                   NULL, NULL );
        if ( response[0] ) {
            ret = 1;
            if ( xmlrpc_p->verbose )
                dputs( "deleteCocologFiles: 削除リクエスト発行成功\n" );
        }
        else {
            ret = 0;
            if ( xmlrpc_p->verbose )
                dputs( "deleteCocologFiles: 削除リクエスト発行失敗\n" );
        }
    }
    encodeURL( NULL );

    free( response );
    free( request  );

    return ( ret == -1 ? 0 : 1 );
}