|
Packit Service |
a2489d |
/*
|
|
Packit Service |
a2489d |
* lftp - file transfer program
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* Copyright (c) 1996-2016 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
a2489d |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
a2489d |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit Service |
a2489d |
* (at your option) any later version.
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
a2489d |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
a2489d |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
a2489d |
* GNU General Public License for more details.
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
a2489d |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
a2489d |
*/
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#ifndef HTTP_H
|
|
Packit Service |
a2489d |
#define HTTP_H
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#include "NetAccess.h"
|
|
Packit Service |
a2489d |
#include "buffer.h"
|
|
Packit Service |
a2489d |
#include "lftp_ssl.h"
|
|
Packit Service |
a2489d |
#include "HttpHeader.h"
|
|
Packit Service |
a2489d |
#include "HttpAuth.h"
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
class Http : public NetAccess
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
enum state_t
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
DISCONNECTED,
|
|
Packit Service |
a2489d |
CONNECTING,
|
|
Packit Service |
a2489d |
CONNECTED,
|
|
Packit Service |
a2489d |
RECEIVING_HEADER,
|
|
Packit Service |
a2489d |
RECEIVING_BODY,
|
|
Packit Service |
a2489d |
DONE
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
enum tunnel_state_t {
|
|
Packit Service |
a2489d |
NO_TUNNEL,
|
|
Packit Service |
a2489d |
TUNNEL_WAITING,
|
|
Packit Service |
a2489d |
TUNNEL_ESTABLISHED
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
state_t state;
|
|
Packit Service |
a2489d |
tunnel_state_t tunnel_state;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void Init();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void Send(const xstring& str);
|
|
Packit Service |
a2489d |
void Send(const char *format,...) PRINTF_LIKE(2,3);
|
|
Packit Service |
a2489d |
void Send(const HttpHeader *hdr);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
class Connection
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
xstring_c closure;
|
|
Packit Service |
a2489d |
public:
|
|
Packit Service |
a2489d |
int sock;
|
|
Packit Service |
a2489d |
SMTaskRef<IOBuffer> send_buf;
|
|
Packit Service |
a2489d |
SMTaskRef<IOBuffer> recv_buf;
|
|
Packit Service |
a2489d |
void MakeBuffers();
|
|
Packit Service |
a2489d |
#if USE_SSL
|
|
Packit Service |
a2489d |
Ref<lftp_ssl> ssl;
|
|
Packit Service |
a2489d |
void MakeSSLBuffers();
|
|
Packit Service |
a2489d |
#endif
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void SuspendInternal()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(send_buf) send_buf->SuspendSlave();
|
|
Packit Service |
a2489d |
if(recv_buf) recv_buf->SuspendSlave();
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
void ResumeInternal()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(send_buf) send_buf->ResumeSlave();
|
|
Packit Service |
a2489d |
if(recv_buf) recv_buf->ResumeSlave();
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
Connection(int s,const char *c);
|
|
Packit Service |
a2489d |
~Connection();
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
Ref<Connection> conn;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
static void AppendHostEncoded(xstring&,const char *);
|
|
Packit Service |
a2489d |
void SendMethod(const char *,const char *);
|
|
Packit Service |
a2489d |
const char *last_method;
|
|
Packit Service |
a2489d |
xstring_c last_uri;
|
|
Packit Service |
a2489d |
xstring_c last_url; // for proxy requests
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
enum { HTTP_NONE=0, HTTP_POST, HTTP_MOVE, HTTP_COPY, HTTP_PROPFIND } special;
|
|
Packit Service |
a2489d |
xstring special_data;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void DirFile(xstring& path,const xstring& ecwd,const xstring& efile) const;
|
|
Packit Service |
a2489d |
void SendAuth();
|
|
Packit Service |
a2489d |
void SendProxyAuth();
|
|
Packit Service |
a2489d |
void SendCacheControl();
|
|
Packit Service |
a2489d |
void SendBasicAuth(const char *tag,const char *auth);
|
|
Packit Service |
a2489d |
void SendBasicAuth(const char *tag,const char *u,const char *p);
|
|
Packit Service |
a2489d |
void SendRequest(const char *connection,const char *f);
|
|
Packit Service |
a2489d |
void SendRequest(const char *connection=0)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
SendRequest(connection,file);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
int SendArrayInfoRequest(); // returns count of sent requests
|
|
Packit Service |
a2489d |
void ProceedArrayInfo();
|
|
Packit Service |
a2489d |
void SendPropfind(const xstring& efile,int depth);
|
|
Packit Service |
a2489d |
void SendPropfindBody();
|
|
Packit Service |
a2489d |
static const xstring& FormatLastModified(time_t);
|
|
Packit Service |
a2489d |
void SendProppatch(const xstring& efile);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int status_code;
|
|
Packit Service |
a2489d |
void HandleHeaderLine(const char *name,const char *value);
|
|
Packit Service |
a2489d |
static const xstring& extract_quoted_header_value(const char *value,const char **end=0);
|
|
Packit Service |
a2489d |
void HandleRedirection();
|
|
Packit Service |
a2489d |
void GetBetterConnection(int level);
|
|
Packit Service |
a2489d |
void SetCookie(const char *val);
|
|
Packit Service |
a2489d |
void MakeCookie(xstring &cookie,const char *host,const char *path);
|
|
Packit Service |
a2489d |
void CookieMerge(xstring &c,const char *add);
|
|
Packit Service |
a2489d |
bool CookieClosureMatch(const char *closure,const char *host,const char *path);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void DisconnectLL();
|
|
Packit Service |
a2489d |
void ResetRequestData();
|
|
Packit Service |
a2489d |
void MoveConnectionHere(Http *o);
|
|
Packit Service |
a2489d |
int IsConnected() const
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(!conn)
|
|
Packit Service |
a2489d |
return 0;
|
|
Packit Service |
a2489d |
if(state==CONNECTING || tunnel_state==TUNNEL_WAITING)
|
|
Packit Service |
a2489d |
return 1;
|
|
Packit Service |
a2489d |
return 2;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
void LogErrorText();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
xstring status;
|
|
Packit Service |
a2489d |
int status_consumed;
|
|
Packit Service |
a2489d |
int proto_version;
|
|
Packit Service |
a2489d |
xstring line;
|
|
Packit Service |
a2489d |
off_t body_size;
|
|
Packit Service |
a2489d |
off_t bytes_received;
|
|
Packit Service |
a2489d |
bool sent_eot;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool ModeSupported();
|
|
Packit Service |
a2489d |
bool ModeIs(open_mode m) const {
|
|
Packit Service |
a2489d |
if(m==STORE)
|
|
Packit Service |
a2489d |
return mode==m && !sending_proppatch;
|
|
Packit Service |
a2489d |
return mode==m;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int keep_alive_max;
|
|
Packit Service |
a2489d |
bool keep_alive;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int array_send;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool chunked;
|
|
Packit Service |
a2489d |
bool chunked_trailer;
|
|
Packit Service |
a2489d |
long chunk_size;
|
|
Packit Service |
a2489d |
off_t chunk_pos;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
off_t request_pos;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
Ref<DirectedBuffer> inflate;
|
|
Packit Service |
a2489d |
SMTaskRef<IOBuffer> propfind;
|
|
Packit Service |
a2489d |
xstring_c content_encoding;
|
|
Packit Service |
a2489d |
static bool IsCompressed(const char *s);
|
|
Packit Service |
a2489d |
bool CompressedContentEncoding() const;
|
|
Packit Service |
a2489d |
bool CompressedContentType() const;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool no_ranges;
|
|
Packit Service |
a2489d |
bool seen_ranges_bytes;
|
|
Packit Service |
a2489d |
bool entity_date_set;
|
|
Packit Service |
a2489d |
bool sending_proppatch;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool no_cache;
|
|
Packit Service |
a2489d |
bool no_cache_this;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
// for WWW[0] and PROXY[1]
|
|
Packit Service |
a2489d |
int auth_sent[2];
|
|
Packit Service |
a2489d |
HttpAuth::scheme_t auth_scheme[2];
|
|
Packit Service |
a2489d |
void NewAuth(const char *hdr,HttpAuth::target_t target,const char *user,const char *pass);
|
|
Packit Service |
a2489d |
void SendAuth(HttpAuth::target_t target,const char *user,const char *uri);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
xstring_c auth_user;
|
|
Packit Service |
a2489d |
xstring_c auth_pass;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool use_propfind_now;
|
|
Packit Service |
a2489d |
xstring allprop;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
long retry_after;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *user_agent;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int _Read(Buffer *,int); // does not update pos, rate_limit, retries, does not check state.
|
|
Packit Service |
a2489d |
void _Skip(int to_skip); // skip in recv_buf or inflate (unless moved), update real_pos
|
|
Packit Service |
a2489d |
void _UpdatePos(int to_skip); // update real_pos, chunk_pos etc.
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
protected:
|
|
Packit Service |
a2489d |
bool hftp; // ftp over http proxy.
|
|
Packit Service |
a2489d |
bool https; // secure http
|
|
Packit Service |
a2489d |
bool use_head;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
public:
|
|
Packit Service |
a2489d |
static void ClassInit();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
Http();
|
|
Packit Service |
a2489d |
Http(const Http *);
|
|
Packit Service |
a2489d |
~Http();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *GetProto() const { return "http"; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FileAccess *Clone() const { return new Http(this); }
|
|
Packit Service |
a2489d |
static FileAccess *New();
|
|
Packit Service |
a2489d |
FileSet *ParseLongList(const char *buf,int len,int *err=0) const;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int Do();
|
|
Packit Service |
a2489d |
int Done();
|
|
Packit Service |
a2489d |
int Read(Buffer *,int);
|
|
Packit Service |
a2489d |
int Write(const void *,int);
|
|
Packit Service |
a2489d |
int StoreStatus();
|
|
Packit Service |
a2489d |
int SendEOT();
|
|
Packit Service |
a2489d |
int Buffered();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void ResetLocationData();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void Close();
|
|
Packit Service |
a2489d |
const char *CurrentStatus();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void Reconfig(const char *name=0);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool SameSiteAs(const FileAccess *fa) const;
|
|
Packit Service |
a2489d |
bool SameLocationAs(const FileAccess *fa) const;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
DirList *MakeDirList(ArgV *a);
|
|
Packit Service |
a2489d |
Glob *MakeGlob(const char *pattern);
|
|
Packit Service |
a2489d |
ListInfo *MakeListInfo(const char *path);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void UseCache(bool use) { no_cache_this=!use; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool NeedSizeDateBeforehand() { return true; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void SuspendInternal();
|
|
Packit Service |
a2489d |
void ResumeInternal();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
static const time_t ATOTM_ERROR = -1;
|
|
Packit Service |
a2489d |
static time_t atotm (const char *time_string);
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
class HFtp : public Http
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
public:
|
|
Packit Service |
a2489d |
HFtp();
|
|
Packit Service |
a2489d |
HFtp(const HFtp *);
|
|
Packit Service |
a2489d |
~HFtp();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *GetProto() const { return "hftp"; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FileAccess *Clone() const { return new HFtp(this); }
|
|
Packit Service |
a2489d |
static FileAccess *New();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
virtual void Login(const char *,const char *);
|
|
Packit Service |
a2489d |
virtual void Reconfig(const char *);
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
class Https : public Http
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
public:
|
|
Packit Service |
a2489d |
Https();
|
|
Packit Service |
a2489d |
Https(const Https *);
|
|
Packit Service |
a2489d |
~Https();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *GetProto() const { return "https"; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FileAccess *Clone() const { return new Https(this); }
|
|
Packit Service |
a2489d |
static FileAccess *New();
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#endif//HTTP_H
|