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; }
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 ); }