Blame src/Http.h

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