Exemplo n.º 1
0
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;
};
Exemplo n.º 4
0
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);
}