77 lines
3.7 KiB
C
77 lines
3.7 KiB
C
|
#ifndef HGL_NETWORK_HTTP_INPUT_STREAM_INCLUDE
|
|||
|
#define HGL_NETWORK_HTTP_INPUT_STREAM_INCLUDE
|
|||
|
|
|||
|
#include<hgl/io/InputStream.h>
|
|||
|
#include<hgl/ut/PList.h>
|
|||
|
#include<hgl/network/IP.h>
|
|||
|
namespace hgl
|
|||
|
{
|
|||
|
namespace network
|
|||
|
{
|
|||
|
using namespace io;
|
|||
|
class TCPClient;
|
|||
|
|
|||
|
/**
|
|||
|
* HTTPInputStream流是一个针对HTTP服务器的流式访问类,用它可以从HTTP服务器上下载文件,它从InputStream类派生。<br>
|
|||
|
* 需要注意的是,这个类只能读,不能写。Position和Size也只能读不能修改<br>
|
|||
|
*/
|
|||
|
class HTTPInputStream:public io::InputStream ///HTTP流式访问类
|
|||
|
{
|
|||
|
TCPClient *tcp;
|
|||
|
|
|||
|
InputStream *tcp_is;
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
char *http_header;
|
|||
|
uint http_header_size;
|
|||
|
|
|||
|
void ParseHttpResponse();
|
|||
|
int PraseHttpHeader();
|
|||
|
|
|||
|
int ReturnError();
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
int64 pos;
|
|||
|
int64 filelength;
|
|||
|
|
|||
|
uint response_code; //HTTP响应代码
|
|||
|
UTF8String response_info; //HTTP响应信息
|
|||
|
|
|||
|
UTF8PList response_list; //响应信息
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
HTTPInputStream();
|
|||
|
~HTTPInputStream();
|
|||
|
|
|||
|
bool Open(IPAddress *,const UTF8String &,const UTF8String &); ///<打开一个网址
|
|||
|
void Close() override; ///<
|
|||
|
|
|||
|
uint GetResponseCode()const{return response_code;} ///<返回HTTP响应代码
|
|||
|
const UTF8String & GetResponseInfo()const{return response_info;} ///<返回HTTP响应信息
|
|||
|
const UTF8PList & GetResponseList()const{return response_list;} ///<返回HTTP响应信息列表
|
|||
|
|
|||
|
int64 Read(void *,int64) override; ///<读取数据
|
|||
|
int64 Peek(void *,int64) override{return 0;} ///<预览数据
|
|||
|
int64 ReadFully(void *buf,int64 buf_size)override{return Read(buf,buf_size);} ///<充分读取,保证读取到指定长度的数据(不计算超时)
|
|||
|
|
|||
|
bool CanRestart()const override{return false;} ///<是否可以复位
|
|||
|
bool CanSeek()const override{return false;} ///<是否可以定位
|
|||
|
bool CanSize()const override{return false;} ///<是否可以取得尺寸
|
|||
|
bool CanPeek()const override{return false;} ///<是否可以预览数据
|
|||
|
|
|||
|
bool Restart() override{return false;} ///<复位访问指针
|
|||
|
int64 Skip(int64) override{return 0;} ///<跳过指定字节不访问
|
|||
|
int64 Seek(int64,SeekOrigin=soBegin) override {return false;} ///<移动访问指针
|
|||
|
int64 Tell()const override{return pos;} ///<返回当前访问位置
|
|||
|
int64 GetSize()const override{return filelength;} ///<取得流长度
|
|||
|
int64 Available()const override{return filelength-pos;} ///<剩下的可以不受阻塞访问的字节数
|
|||
|
};//class HTTPInputStream
|
|||
|
}//namespace network
|
|||
|
|
|||
|
using namespace network;
|
|||
|
}//namespace hgl
|
|||
|
#endif//HGL_NETWORK_HTTP_INPUT_STREAM_INCLUDE
|