bool saveCacheIndex(bool fast) { //clean all DEAD obj cache.syncDisk(); #ifdef ENABLE_DB_DISK_INDEX if (dci) { dci->start(ci_close,NULL); while (!dci->allWorkedDone()) { my_msleep(100); } return false; } #endif HttpObjectIndexHeader indexHeader; memset(&indexHeader,0,sizeof(HttpObjectIndexHeader)); indexHeader.head_size = sizeof(HttpObjectIndexHeader); indexHeader.block_size = sizeof(HttpObjectIndex); indexHeader.cache_dir_mask1 = CACHE_DIR_MASK1; indexHeader.cache_dir_mask2 = CACHE_DIR_MASK2; char *file_name = getCacheIndexFile(); KFile fp; bool result = true; if(!fp.open(file_name,fileWrite)){ klog(KLOG_ERR,"cann't open cache index file for write [%s]\n",file_name); xfree(file_name); return false; } fp.write((char *)&indexHeader,sizeof(HttpObjectIndexHeader)); int save_count = cache.save_disk_index(&fp); if(result){ //set the index file state is clean indexHeader.state = INDEX_STATE_CLEAN; indexHeader.object_count = save_count; fp.seek(0,seekBegin); fp.write((char *)&indexHeader,sizeof(HttpObjectIndexHeader)); klog(KLOG_ERR,"total save %d object\n",save_count); } if(file_name){ xfree(file_name); } return result; }
bool save_index_scan_state() { KStringBuf s; get_index_scan_state_filename(s); KFile fp; if (!fp.open(s.getString(),fileWrite)) { return false; } bool result = true; if (sizeof(index_scan_state_t) != fp.write((char *)&index_scan_state,sizeof(index_scan_state_t))) { result = false; } fp.close(); return result; }
bool KConfigBuilder::saveConfig() { KConfigBuilder builder; #ifdef KANGLE_ETC_DIR string configFile = KANGLE_ETC_DIR; #else string configFile = conf.path + "/etc"; #endif configFile += CONFIG_FILE; string tmpfile = configFile + ".tmp"; string lstfile = configFile + ".lst"; KFile fp; if(!fp.open(tmpfile.c_str(),fileWrite)){ fprintf(stderr, "cann't open configfile[%s] for write\n", tmpfile.c_str()); return false; } stringstream s; builder.build(s); s << "\r\n" << CONFIG_FILE_SIGN; bool result = false; if ((int)s.str().size() == fp.write(s.str().c_str(), s.str().size())) { result = true; } fp.close(); if (!result) { fprintf(stderr,"cann't write sign string\n"); return false; } unlink(lstfile.c_str()); rename(configFile.c_str(),lstfile.c_str()); rename(tmpfile.c_str(),configFile.c_str()); if (conf.mergeFiles.size()>0) { //remove the merge config files. std::list<std::string>::iterator it; for(it=conf.mergeFiles.begin();it!=conf.mergeFiles.end();it++){ unlink((*it).c_str()); } conf.mergeFiles.clear(); std::string errMsg; conf.gvm->saveConfig(errMsg); } //°Ñvh.xmlÖØÃüÃû string file = conf.path; file += VH_CONFIG_FILE; string oldfile = file + ".old"; rename(file.c_str(),oldfile.c_str()); return true; }
bool loadCacheIndex() { load_count = 0; bool result = false; char *file_name = getCacheIndexFile(); #if 0 rebuild_cache_hash = true; #endif KFile fp; if (!fp.open(file_name,fileReadWrite)) { xfree(file_name); #ifdef ENABLE_DB_DISK_INDEX if (dci) { return true; } #endif recreate_index(time(NULL)); return false; } HttpObjectIndexHeader indexHeader; if(fp.read((char *)&indexHeader,sizeof(HttpObjectIndexHeader))!=sizeof(HttpObjectIndexHeader)){ klog(KLOG_ERR,"cann't read cache index header\n"); recreate_index(time(NULL)); goto done; } #if 0 if (indexHeader.cache_dir_mask1==CACHE_DIR_MASK1 && indexHeader.cache_dir_mask2==CACHE_DIR_MASK2) { rebuild_cache_hash = false; } #endif if(indexHeader.state != INDEX_STATE_CLEAN #if 0 || rebuild_cache_hash #endif ){ klog(KLOG_ERR,"cache index file not clean.\n"); recreate_index(time(NULL)); goto done; } for(;;){ KHttpObject *obj = new KHttpObject; if (fp.read((char *)&obj->index,sizeof(HttpObjectIndex))!=sizeof(HttpObjectIndex)) { obj->release(); break; } if (create_http_object(&fp,obj)==cor_success) { load_count++; #ifdef ENABLE_DB_DISK_INDEX if (dci) { dci->start(ci_add,obj); } #endif } else { SET(obj->index.flags,FLAG_DEAD|FLAG_IN_DISK); } obj->release(); } result = true; if(load_count!=indexHeader.object_count){ klog(KLOG_ERR,"Warning not all obj have loaded,total obj count=%d,loaded=%d\n",indexHeader.object_count,load_count); debug("total object count=%d\n",cache.getCount()); } //设置index为notclean //fseeko(fp,0,SEEK_SET); fp.seek(0,seekBegin); indexHeader.state = INDEX_STATE_UNCLEAN; fp.write((char *)&indexHeader,sizeof(HttpObjectIndexHeader)); done: if(file_name){ xfree(file_name); } klog(KLOG_ERR,"total load disk obj count=%d\n",load_count); return result; }
int KHttp::getHttpFile(const KData& kServer, const KData& kHttpFile, const KData& kSaveFile, int nStartPos) { LOGD("Entry getHttpFile"); m_dtHttpServer = kServer; m_dtHttpFile = kHttpFile; m_bChunked = false; m_iWriteLen = nStartPos; m_iLength = 0; m_clientSock.close(); m_kCnnect.close(); _respHeadMap.clear(); m_iNotifyPos = 0; m_iNotifyGap = 0; m_iContentLength = 0; m_iStatusCode = 0; bool bGet = (_paramMap.size() == 0); KFile kFile; KData kHttpRequest; KData kDataPost; if (bGet) { kHttpRequest = "GET "; } else { kHttpRequest = "POST "; map<KData, KData>::iterator iter; for (iter = _paramMap.begin(); iter != _paramMap.end(); iter++) { if (iter != _paramMap.begin()) kDataPost += "&"; kDataPost += iter->first; kDataPost += "="; kDataPost += iter->second; } } kHttpRequest += kHttpFile; kHttpRequest += " HTTP/1.1"; kHttpRequest += CRLF; kHttpRequest += "Host: "; kHttpRequest += kServer; kHttpRequest += CRLF; kHttpRequest += "Accept: */*"; kHttpRequest += CRLF; if (!m_dtUserAgent.isEmpty()) { kHttpRequest += "User-Agent: "; kHttpRequest += m_dtUserAgent; kHttpRequest += CRLF; } if (nStartPos > 0) { kHttpRequest += "RANGE: bytes="; kHttpRequest += nStartPos; kHttpRequest += "-"; kHttpRequest += CRLF; } kHttpRequest += "Pragma: no-cache"; kHttpRequest += CRLF; kHttpRequest += "Cache-Control: no-cache"; kHttpRequest += CRLF; kHttpRequest += "Connection: close"; kHttpRequest += CRLF; if (!bGet) { kHttpRequest += "Content-Type: application/x-www-form-urlencoded"; kHttpRequest += CRLF; kHttpRequest += "Content-Length: "; kHttpRequest += KData((int) kDataPost.length()); kHttpRequest += CRLF; } kHttpRequest += CRLF; char szBuffer[MTU] = {0}; if (m_dtHttpProxy.isEmpty()) { LOGD("Connect to Server: %s", kServer.getData() ); m_clientSock.setServer(kServer, 80); } else { LOGD("Connect to Server: %s", m_dtHttpProxy.getData() ); m_clientSock.setServer(m_dtHttpProxy, 80); } m_clientSock.initSocket(); if (!m_clientSock.connect()) { LOGERROR("m_clientSock.connect() failed"); return -1; } m_kCnnect = m_clientSock.getConn(); m_kCnnect.setTimeout(m_timeout); if (m_kCnnect.writeData(kHttpRequest) != (int) kHttpRequest.length()) { LOGERROR(" m_conn.writeData(httpRequest) != (int)httpRequest.length() failed"); return -1; } m_iWritedBytes += kHttpRequest.length(); if (!bGet) { if (m_kCnnect.writeData(kDataPost) != (int) kDataPost.length()) { LOGERROR("m_conn.writeData(dtPost) != (int)dtPost.length() failed"); return -1; } m_iWritedBytes += kDataPost.length(); } int iRead = 0; m_iStatusCode = 0; bool bRun = true; memset(szBuffer, 0, MTU); if ((iRead = m_kCnnect.readLine(szBuffer, MTU)) <= 0) { LOGERROR( "Read command line err: %d", iRead ); m_iReadedBytes += iRead; return 0; } KData dtKData; KData dtLine(szBuffer, iRead); if (dtLine.match(SP, &dtKData, true) == NOT_FOUND) { LOGERROR("Read command line mactch space err" ); return 0; } if (dtKData != "HTTP/1.1" && dtKData != "HTTP/1.0") { LOGERROR( "GET HTTP HEAD ERR" ); return 0; } if (dtLine.match(SP, &dtKData, true) == NOT_FOUND) { LOGERROR("Read command line mactch space 2 err" ); return 0; } m_iStatusCode = (int)dtKData; LOGD("Ready to while ( (iRead = m_conn.readLine(buff,MTU)) > 0 )"); while ((iRead = m_kCnnect.readLine(szBuffer, MTU)) > 0) { m_iReadedBytes += iRead; KData dtLine(szBuffer, iRead); KData dtBefVal; if (FOUND == dtLine.match(":", &dtBefVal, true)) { dtBefVal.removeSpaces(); dtLine.removeSpaces(); if (isEqualNoCase(dtBefVal, "Content-Length")) { m_iLength = (int) dtLine + nStartPos; if (m_iNotifyPercent > 0 && m_iNotifyPercent <= 100) { m_iNotifyPos = m_iNotifyGap = m_iLength / (100 / m_iNotifyPercent); } } else if (isEqualNoCase(dtBefVal, "Transfer-Encoding")) { if (isEqualNoCase(dtLine, "chunked")) { m_bChunked = true; } } _respHeadMap[dtBefVal] = dtLine; } } if (iRead < 0) { LOGERROR("read err" ); return -1; } if (m_iStatusCode != 200 && m_iStatusCode != 206) { if (m_iStatusCode == 302) { KData dtRedirectUrl = getRespFieldValue("Location"); LOGD("Ready to return getHttpFile( dtRedirectUrl, savefile, startpos );"); return getHttpFile(dtRedirectUrl, kSaveFile, nStartPos); } LOGERROR(" m_iStatusCode!=200 && m_iStatusCode!=206"); return 0; } FILE* pkFile = 0; string strFile = kSaveFile.getData(); if (nStartPos <= 0) { pkFile = fopen(strFile.c_str(),"wb+"); } else { pkFile = fopen(strFile.c_str(), "wb+"); fclose(pkFile); pkFile = fopen(strFile.c_str(),"r+b"); if (0 == pkFile) { return -1; } fseek(pkFile, nStartPos, SEEK_SET); } if (m_bChunked) { LOGD("m_bChunked is true!"); unsigned char* pBuff = new unsigned char[MTU]; int iBuffLen = MTU; while ((iRead = m_kCnnect.readLine(szBuffer, MTU)) > 0) { m_iReadedBytes += iRead; if (iRead > 8) { return -1; } int nLength = KData(szBuffer, iRead).HexToInt(); if (nLength <= 0) { delete [] pBuff; return m_iWriteLen; } if (nLength > iBuffLen) { delete[] pBuff; iBuffLen = nLength; pBuff = new unsigned char[iBuffLen]; } int iReaded = 0; memset(pBuff, 0, nLength); m_kCnnect.readData(pBuff, nLength, iReaded); m_iReadedBytes += iReaded; kFile.write(pBuff, iReaded); m_iWriteLen += iReaded; if (m_iLength > 0) { if (m_iWriteLen >= m_iLength) { if (m_iNotifyGap > 0) { m_pNotifyCallback(m_pNotifyParam, 100, m_iWriteLen, m_iLength); } break; } if (m_iNotifyGap > 0 && m_iWriteLen > m_iNotifyPos) { int nPercent = int((m_iWriteLen / (float) m_iLength) * 100); m_iNotifyPos += m_iNotifyGap; m_pNotifyCallback(m_pNotifyParam, nPercent, m_iWriteLen, m_iLength); } } if (iReaded != nLength) { delete[] pBuff; return m_iWriteLen; } if (m_kCnnect.readLine(szBuffer, MTU) != 0) { return m_iWriteLen; } } delete[] pBuff; return m_iWriteLen; } else { string strFile = kSaveFile.getData(); while ((iRead = m_kCnnect.readn(szBuffer, MTU)) > 0 && bRun) { m_iReadedBytes += iRead; unsigned int uiWriteSize = fwrite((unsigned char*) szBuffer,1,iRead,pkFile); //kFile.write((unsigned char*) szBuffer, iRead); m_iWriteLen += iRead; if (m_iLength > 0) { if (m_iWriteLen >= m_iLength) { if (m_iNotifyGap > 0) { m_pNotifyCallback(m_pNotifyParam, 100, m_iWriteLen, m_iLength); } break; } if (m_iNotifyGap > 0 && m_iWriteLen > m_iNotifyPos) { int nPercent = int((m_iWriteLen / (float) m_iLength) * 100); m_iNotifyPos += m_iNotifyGap; m_pNotifyCallback(m_pNotifyParam, nPercent, m_iWriteLen, m_iLength); } } while (m_bPause) { vsleep(1000); } } //fclose(pkFile); } fclose(pkFile); m_kCnnect.close(); kFile.closeFile(); LOGD("return m_iWriteLen;"); return m_iWriteLen; }