void KConcatFetchObject::open(KHttpRequest *rq) { KFetchObject::open(rq); KHttpObject *obj = rq->ctx->obj; SET(obj->index.flags,ANSW_LOCAL_SERVER); if (rq->ctx->lastModified > 0 && rq->ctx->lastModified == rq->file->getLastModified()) { // headResult = HEAD_NOT_MODIFIED; obj->data->status_code = STATUS_NOT_MODIFIED; handleUpstreamRecvedHead(rq); return; } //´¦Àícontent-type if (!stageContentType(rq,obj)) { handleError(rq,STATUS_FORBIDEN,"cann't find such content-type"); return; } //ÉèÖÃlast-modified SET(obj->index.flags,ANSW_LAST_MODIFIED); obj->index.content_length = rq->file->fileSize; obj->index.last_modified = rq->file->getLastModified(); char tmp_buf[42]; mk1123time(obj->index.last_modified, tmp_buf, 41); obj->insertHttpHeader(kgl_expand_string("Last-Modified"),(const char *)tmp_buf,29); if (obj->data->status_code==0) { obj->data->status_code = STATUS_OK; } init(rq); handleUpstreamRecvedHead(rq); }
int send_not_modify_from_mem(struct request *rq,struct mem_obj *obj) { char buf[512]; memset(buf,0,sizeof(buf)); strcpy(buf,"HTTP/1.1 304 Not Modified\r\nDate: "); mk1123time(time(NULL), buf+33, 40); sprintf(buf+strlen(buf),"\r\nServer: kingate/%s (cached)\r\nConnection: ",VER_ID); if(TEST(rq->flags,RQ_HAS_KEEP_CONNECTION)) { strcpy(buf+strlen(buf),"keep-alive\r\n\r\n"); } else { strcpy(buf+strlen(buf),"close\r\n\r\n"); } if(rq->server->send(buf)>0) return 6; return -1; }
int fill_mem_obj(request *rq,struct mem_obj *obj,struct mem_obj *old_obj) { // struct buff *to_server_request = NULL; char *answer=NULL; char *fake_header; head_info m_head; int fake_header_len=0; int r=CONNECT_ERR; char mk1123buff[50]; ERRBUF ; memset(&m_head,0,sizeof(m_head)); if(srv_connect(rq)<=0) goto error; /* to_server_request = alloc_buff(4*CHUNK_SIZE); if ( !to_server_request ) { // change_state(obj, OBJ_READY); obj->flags |= FLAG_DEAD; goto error; } */ // stored_obj(NULL); // printf("rq->if_modified_since=%d,obj->times.last_modified=%d\n",rq->if_modified_since,old_obj->times.last_modified); if(old_obj && !TEST(rq->flags,RQ_HAS_IF_MOD_SINCE)) { if(old_obj->times.last_modified) { if (!mk1123time(old_obj->times.last_modified, mk1123buff, sizeof(mk1123buff)) ) { klog(ERR_LOG,"cann't mk1123time obj obj->times.date=%d.\n",old_obj->times.last_modified); goto error; } } else { if (!mk1123time(obj->created, mk1123buff, sizeof(mk1123buff)) ) { klog(ERR_LOG,"cann't mk1123time obj created=%d.\n",old_obj->created); goto error; } } fake_header_len=19+sizeof(mk1123buff)+4; fake_header = (char *)malloc(fake_header_len); if ( !fake_header ) { goto error; //error goto validate_err; } // printf("fake_header=%s\n",fake_header); memset(fake_header,0,fake_header_len); snprintf(fake_header,fake_header_len-1, "If-Modified-Since: %s\r\n", mk1123buff); answer=build_direct_request("GET", &rq->url, fake_header, rq, 0); free(fake_header); // printf("client have no if-modified-since.\n"); } else { answer=build_direct_request("GET",&rq->url,NULL,rq,0);//连接远程主机 } // printf("answer=%s\n",answer); if ( !answer ) { klog(ERR_LOG,"no mem to alloc.\n"); goto error; } /* if ( attach_data(answer, strlen(answer), to_server_request) ) { free_container(to_server_request); goto error; } if(answer){ free(answer); answer = NULL; } */ r = rq->client->send(answer); // free(answer); // free_container(to_server_request); to_server_request = NULL; // printf("send data to remote is:%s",to_server_request->data); if ( r <=0 ) {//send error say_bad_request("Can't send","", ERR_TRANSFER, rq); // printf("cann't send to server.\n"); //printf("errno=%d\n",ERRNO); goto error; } r=load_head(rq,obj,m_head); switch(r) { case HEAD_OK: if(load_body(rq,obj)<=0) { //printf("load body failed.\n"); r=CONNECT_ERR; goto error; } goto done; case CONNECT_ERR: //printf("load head failed.\n"); goto error; case HEAD_NOT_MODIFIED: if(old_obj && !TEST(rq->flags,RQ_HAS_IF_MOD_SINCE)) { goto error; } else { if(rq->server->send(m_head.head,m_head.len)<0) goto error; } // printf("%s\n",m_head.head); break; default: // printf("obj->content_length=%d,path=%s\n",obj->content_length,obj->url.path); if(m_head.head) { if(rq->server->send(m_head.head,m_head.len)<0) goto error; if(create_select_pipe(rq->server,rq->client,conf.time_out[HTTP],0,-1)==-2) r=1; } } error: IF_FREE(answer); IF_FREE(m_head.head); rq->client->close(); destroy_obj(obj,0); return r; done: IF_FREE(answer); IF_FREE(m_head.head); rq->client->close(); if(!old_obj) stored_obj(obj); return r; };
void KStaticFetchObject::open(KHttpRequest *rq) { KFetchObject::open(rq); assert(!rq->file->isDirectory()); KHttpObject *obj = rq->ctx->obj; SET(obj->index.flags,ANSW_HAS_CONTENT_LENGTH|ANSW_LOCAL_SERVER); if (rq->ctx->lastModified > 0 && rq->ctx->lastModified == rq->file->getLastModified()) { if (rq->ctx->mt==modified_if_modified) { obj->data->status_code = STATUS_NOT_MODIFIED; handleUpstreamRecvedHead(rq); return; } } else if (rq->ctx->mt == modified_if_range) { CLR(rq->flags,RQ_HAVE_RANGE); } assert(rq->file); #ifdef _WIN32 /////////[51] #else const char *filename = rq->file->getName(); if (filename) { fp.open(filename,fileRead,(ad?KFILE_ASYNC:0)); } #endif if (!fp.opened()) { handleError(rq,STATUS_NOT_FOUND,"file not found"); return; } /////////[52] if (!rq->sr) { #ifdef ENABLE_TF_EXCHANGE if (rq->tf) { //静态下载无需临时文件 delete rq->tf; rq->tf = NULL; } #endif //处理content-type if (!stageContentType(rq,obj)) { handleError(rq,STATUS_FORBIDEN,"cann't find such content-type"); return; } //设置last-modified SET(obj->index.flags,ANSW_LAST_MODIFIED); obj->index.content_length = rq->file->fileSize; obj->index.last_modified = rq->file->getLastModified(); char tmp_buf[42]; mk1123time(obj->index.last_modified, tmp_buf, 41); obj->insertHttpHeader(kgl_expand_string("Last-Modified"),(const char *)tmp_buf,29); } if (TEST(rq->flags,RQ_HAVE_RANGE)) { //处理部分数据请求 SET(obj->index.flags,ANSW_HAS_CONTENT_RANGE); rq->ctx->content_range_length = rq->file->fileSize; INT64 content_length = rq->file->fileSize; if(!adjust_range(rq,rq->file->fileSize)){ handleError(rq,416,"range error"); return; } /////////[53] if (!fp.seek(rq->range_from,seekBegin)) { handleError(rq,500,"cann't seek to right position"); return ; } if (!TEST(rq->url->flags,KGL_URL_RANGED)) { KStringBuf b; char buf[INT2STRING_LEN]; b.WSTR("bytes "); b << int2string(rq->range_from, buf) << "-" ; b << int2string(rq->range_to, buf) << "/" ; b << int2string(content_length, buf); int len = b.getSize(); obj->insertHttpHeader2(xstrdup("Content-Range"),sizeof("Content-Range")-1,b.stealString(),len); obj->index.content_length = rq->file->fileSize; obj->data->status_code = STATUS_CONTENT_PARTIAL; } } else { //设置status_code if (obj->data->status_code==0) { obj->data->status_code = STATUS_OK; } } //rq->buffer << "1234"; //通知http头已经处理完成 handleUpstreamRecvedHead(rq); }