Blame src/Http.h

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