• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeioslave/http
 

tdeioslave/http

http.h

00001 /*
00002    Copyright (C) 2000,2001 Dawit Alemayehu <adawit@kde.org>
00003    Copyright (C) 2000,2001 Waldo Bastian <bastian@kde.org>
00004    Copyright (C) 2000,2001 George Staikos <staikos@kde.org>
00005    Copyright (C) 2001,2002 Hamish Rodda <rodda@kde.org>
00006 
00007    This library is free software; you can redistribute it and/or
00008    modify it under the terms of the GNU Library General Public
00009    License as published by the Free Software Foundation; either
00010    version 2 of the License, or (at your option) any later version.
00011 
00012    This library is distributed in the hope that it will be useful,
00013    but WITHOUT ANY WARRANTY; without even the implied warranty of
00014    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015    Library General Public License for more details.
00016 
00017    You should have received a copy of the GNU Library General Public License
00018    along with this library; see the file COPYING.LIB.  If not, write to
00019    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00020    Boston, MA 02110-1301, USA.
00021 */
00022 
00023 #ifndef HTTP_H_
00024 #define HTTP_H_
00025 
00026 
00027 #include <netinet/in.h>
00028 #include <arpa/inet.h>
00029 #include <string.h>
00030 #include <stdio.h>
00031 #include <time.h>
00032 
00033 #include <tqptrlist.h>
00034 #include <tqstrlist.h>
00035 #include <tqstringlist.h>
00036 
00037 #include <kurl.h>
00038 #include "tdeio/tcpslavebase.h"
00039 #include "tdeio/http.h"
00040 
00041 class DCOPClient;
00042 class TQDomElement;
00043 class TQDomNodeList;
00044 
00045 namespace TDEIO {
00046     class AuthInfo;
00047 }
00048 
00049 class HTTPProtocol : public TQObject, public TDEIO::TCPSlaveBase
00050 {
00051   Q_OBJECT
00052 public:
00053   HTTPProtocol( const TQCString &protocol, const TQCString &pool,
00054                 const TQCString &app );
00055   virtual ~HTTPProtocol();
00056 
00058   enum HTTP_REV    {HTTP_None, HTTP_Unknown, HTTP_10, HTTP_11, SHOUTCAST};
00059 
00061   enum HTTP_AUTH   {AUTH_None, AUTH_Basic, AUTH_NTLM, AUTH_Digest, AUTH_Negotiate};
00062 
00064   // Removed to interfaces/tdeio/http.h
00065   //enum HTTP_METHOD {HTTP_GET, HTTP_PUT, HTTP_POST, HTTP_HEAD, HTTP_DELETE,
00066   //                  HTTP_OPTIONS, DAV_PROPFIND, DAV_PROPPATCH, DAV_MKCOL,
00067   //                  DAV_COPY, DAV_MOVE, DAV_LOCK, DAV_UNLOCK, DAV_SEARCH };
00068 
00070   struct HTTPState
00071   {
00072     HTTPState ()
00073     {
00074       port = 0;
00075       doProxy = false;
00076     }
00077 
00078     TQString hostname;
00079     TQString encoded_hostname;
00080     short unsigned int port;
00081     TQString user;
00082     TQString passwd;
00083     bool  doProxy;
00084   };
00085 
00087   struct DAVRequest
00088   {
00089     DAVRequest ()
00090     {
00091       overwrite = false;
00092       depth = 0;
00093     }
00094 
00095     TQString desturl;
00096     bool overwrite;
00097     int depth;
00098   };
00099 
00101   struct HTTPRequest
00102   {
00103     HTTPRequest ()
00104     {
00105       port = 0;
00106       method = TDEIO::HTTP_UNKNOWN;
00107       offset = 0;
00108       doProxy = false;
00109       allowCompressedPage = false;
00110       disablePassDlg = false;
00111       bNoAuth = false;
00112       bUseCache = false;
00113       bCachedRead = false;
00114       bCachedWrite = false;
00115       fcache = 0;
00116       bMustRevalidate = false;
00117       cacheExpireDateOffset = 0;
00118       bErrorPage = false;
00119       bUseCookiejar = false;
00120       expireDate = 0;
00121       creationDate = 0;
00122     }
00123 
00124     TQString hostname;
00125     TQString encoded_hostname;
00126     short unsigned int port;
00127     TQString user;
00128     TQString passwd;
00129     TQString path;
00130     TQString query;
00131     TDEIO::HTTP_METHOD method;
00132     TDEIO::CacheControl cache;
00133     TDEIO::filesize_t offset;
00134     bool doProxy;
00135     KURL url;
00136     TQString window;                 // Window Id this request is related to.
00137     TQString referrer;
00138     TQString charsets;
00139     TQString languages;
00140     bool allowCompressedPage;
00141     bool disablePassDlg;
00142     TQString userAgent;
00143     TQString id;
00144     DAVRequest davData;
00145 
00146     bool bNoAuth; // Do not authenticate
00147 
00148     // Cache related
00149     TQString cef; // Cache Entry File belonging to this URL.
00150     bool bUseCache; // Whether the cache is active
00151     bool bCachedRead; // Whether the file is to be read from m_fcache.
00152     bool bCachedWrite; // Whether the file is to be written to m_fcache.
00153     FILE* fcache; // File stream of a cache entry
00154     TQString etag; // ETag header.
00155     TQString lastModified; // Last modified.
00156     bool bMustRevalidate; // Cache entry is expired.
00157     long cacheExpireDateOffset; // Position in the cache entry where the
00158                                   // 16 byte expire date is stored.
00159     time_t expireDate; // Date when the cache entry will expire
00160     time_t creationDate; // Date when the cache entry was created
00161     TQString strCharset; // Charset
00162 
00163     // Indicates whether an error-page or error-msg should is preferred.
00164     bool bErrorPage;
00165 
00166     // Cookie flags
00167     bool bUseCookiejar;
00168     enum { CookiesAuto, CookiesManual, CookiesNone } cookieMode;
00169   };
00170 
00171   struct DigestAuthInfo
00172   {
00173     TQCString nc;
00174     TQCString qop;
00175     TQCString realm;
00176     TQCString nonce;
00177     TQCString method;
00178     TQCString cnonce;
00179     TQCString username;
00180     TQCString password;
00181     TQStrList digestURI;
00182     TQCString algorithm;
00183     TQCString entityBody;
00184   };
00185 
00186 //---------------------- Re-implemented methods ----------------
00187   virtual void setHost(const TQString& host, int port, const TQString& user,
00188                        const TQString& pass);
00189 
00190   virtual void slave_status();
00191 
00192   virtual void get( const KURL& url );
00193   virtual void put( const KURL& url, int permissions, bool overwrite,
00194                     bool resume );
00195 
00196 //----------------- Re-implemented methods for WebDAV -----------
00197   virtual void listDir( const KURL& url );
00198   virtual void mkdir( const KURL& url, int permissions );
00199 
00200   virtual void rename( const KURL& src, const KURL& dest, bool overwrite );
00201   virtual void copy( const KURL& src, const KURL& dest, int permissions, bool overwrite );
00202   virtual void del( const KURL& url, bool isfile );
00203 
00204   // ask the host whether it supports WebDAV & cache this info
00205   bool davHostOk();
00206 
00207   // send generic DAV request
00208   void davGeneric( const KURL& url, TDEIO::HTTP_METHOD method );
00209 
00210   // Send requests to lock and unlock resources
00211   void davLock( const KURL& url, const TQString& scope,
00212                 const TQString& type, const TQString& owner );
00213   void davUnlock( const KURL& url );
00214 
00215   // Calls httpClose() and finished()
00216   void davFinished();
00217 
00218   // Handle error conditions
00219   TQString davError( int code = -1, TQString url = TQString::null );
00220 //---------------------------- End WebDAV -----------------------
00221 
00231   virtual void special( const TQByteArray &data );
00232 
00233   virtual void mimetype( const KURL& url);
00234 
00235   virtual void stat( const KURL& url );
00236 
00237   virtual void reparseConfiguration();
00238 
00239   virtual void closeConnection(); // Forced close of connection
00240 
00241   void post( const KURL& url );
00242   void multiGet(const TQByteArray &data);
00243   bool checkRequestURL( const KURL& );
00244   void cacheUpdate( const KURL &url, bool nocache, time_t expireDate);
00245 
00246   void httpError(); // Generate error message based on response code
00247 
00248   bool isOffline(const KURL &url); // Check network status
00249 
00250 protected slots:
00251   void slotData(const TQByteArray &);
00252   void error( int _errid, const TQString &_text );
00253 
00254 protected:
00255   int readChunked();    // Read a chunk
00256   int readLimited();    // Read maximum m_iSize bytes.
00257   int readUnlimited();  // Read as much as possible.
00258 
00265   ssize_t write(const void *buf, size_t nbytes);
00266 
00272   ssize_t read (void *b, size_t nbytes);
00273 
00274   char *gets (char *str, int size);
00275 
00276   void setRewindMarker();
00277   void rewind();
00278 
00284   void addEncoding(TQString, TQStringList &);
00285 
00286   void configAuth( char *, bool );
00287 
00288   bool httpOpen();             // Open transfer
00289   void httpClose(bool keepAlive);  // Close transfer
00290 
00291   bool httpOpenConnection();   // Open connection
00292   void httpCloseConnection();  // Close connection
00293   void httpCheckConnection();  // Check whether to keep connection.
00294 
00295   void forwardHttpResponseHeader();
00296 
00297   bool readHeader();
00298 
00299   bool sendBody();
00300 
00301   // where dataInternal == true, the content is to be made available
00302   // to an internal function.
00303   bool readBody( bool dataInternal = false );
00304 
00308   void davSetRequest( const TQCString& requestXML );
00309   void davStatList( const KURL& url, bool stat = true );
00310   void davParsePropstats( const TQDomNodeList& propstats, TDEIO::UDSEntry& entry );
00311   void davParseActiveLocks( const TQDomNodeList& activeLocks,
00312                             uint& lockCount );
00313 
00317   long parseDateTime( const TQString& input, const TQString& type );
00318 
00322   int codeFromResponse( const TQString& response );
00323 
00328   TQString davProcessLocks();
00329 
00333   void addCookies( const TQString &url, const TQCString &cookieHeader);
00334 
00338   TQString findCookies( const TQString &url);
00339 
00351   FILE *checkCacheEntry(bool readWrite = false);
00352 
00358   void createCacheEntry(const TQString &mimetype, time_t expireDate);
00359 
00365   void writeCacheEntry( const char *buffer, int nbytes);
00366 
00370   void closeCacheEntry();
00371 
00375   void updateExpireDate(time_t expireDate, bool updateCreationDate=false);
00376 
00380   void cleanCache();
00381 
00385   // where dataInternal == true, the content is to be made available
00386   // to an internal function.
00387   void retrieveContent( bool dataInternal = false );
00388 
00392   bool retrieveHeader(bool close_connection = true);
00393 
00397   void resetSessionSettings();
00398 
00402   void resetResponseSettings();
00403 
00410   void resetConnectionSettings();
00411 
00416   TQString proxyAuthenticationHeader();
00417 
00421   bool getAuthorization();
00422 
00426   void saveAuthorization();
00427 
00431   TQString createBasicAuth( bool isForProxy = false );
00432 
00436   TQString createDigestAuth( bool isForProxy = false );
00437 
00441   TQString createNTLMAuth( bool isForProxy = false );
00442 
00446   TQString createNegotiateAuth();
00447 
00451   TQCString gssError( int major_status, int minor_status );
00452 
00456   void calculateResponse( DigestAuthInfo &info, TQCString &Response );
00457 
00461   bool retryPrompt();
00462 
00466   void promptInfo( TDEIO::AuthInfo& info );
00467 
00468 protected:
00469   HTTPState m_state;
00470   HTTPRequest m_request;
00471   TQPtrList<HTTPRequest> m_requestQueue;
00472 
00473   bool m_bBusy; // Busy handling request queue.
00474   bool m_bEOF;
00475   bool m_bEOD;
00476 
00477 //--- Settings related to a single response only
00478   TQStringList m_responseHeader; // All headers
00479   KURL m_redirectLocation;
00480   bool m_bRedirect; // Indicates current request is a redirection
00481 
00482   // Processing related
00483   bool m_bChunked; // Chunked tranfer encoding
00484   TDEIO::filesize_t m_iSize; // Expected size of message
00485   TDEIO::filesize_t m_iBytesLeft; // # of bytes left to receive in this message.
00486   TDEIO::filesize_t m_iContentLeft; // # of content bytes left
00487   TQByteArray m_bufReceive; // Receive buffer
00488   bool m_dataInternal; // Data is for internal consumption
00489   char m_lineBuf[1024];
00490   char m_rewindBuf[8192];
00491   size_t m_rewindCount;
00492   char *m_linePtr;
00493   size_t m_lineCount;
00494   char *m_lineBufUnget;
00495   char *m_linePtrUnget;
00496   size_t m_lineCountUnget;
00497 
00498   // Mimetype determination
00499   bool m_cpMimeBuffer;
00500   TQByteArray m_mimeTypeBuffer;
00501 
00502   // Language/Encoding related
00503   TQStringList m_qTransferEncodings;
00504   TQStringList m_qContentEncodings;
00505   TQString m_sContentMD5;
00506   TQString m_strMimeType;
00507 
00508 
00509 //--- WebDAV
00510   // Data structure to hold data which will be passed to an internal func.
00511   TQByteArray m_bufWebDavData;
00512   TQStringList m_davCapabilities;
00513 
00514   bool m_davHostOk;
00515   bool m_davHostUnsupported;
00516 //----------
00517 
00518   // Holds the POST data so it won't get lost on if we
00519   // happend to get a 401/407 response when submitting,
00520   // a form.
00521   TQByteArray m_bufPOST;
00522 
00523   // Cache related
00524   int m_maxCacheAge; // Maximum age of a cache entry.
00525   long m_maxCacheSize; // Maximum cache size in Kb.
00526   TQString m_strCacheDir; // Location of the cache.
00527 
00528 
00529 
00530 //--- Proxy related members
00531   bool m_bUseProxy;
00532   bool m_bNeedTunnel; // Whether we need to make a SSL tunnel
00533   bool m_bIsTunneled; // Whether we have an active SSL tunnel
00534   bool m_bProxyAuthValid;
00535   int m_iProxyPort;
00536   KURL m_proxyURL;
00537   TQString m_strProxyRealm;
00538 
00539   // Operation mode
00540   TQCString m_protocol;
00541 
00542   // Authentication
00543   TQString m_strRealm;
00544   TQString m_strAuthorization;
00545   TQString m_strProxyAuthorization;
00546   HTTP_AUTH Authentication;
00547   HTTP_AUTH ProxyAuthentication;
00548   bool m_bUnauthorized;
00549   short unsigned int m_iProxyAuthCount;
00550   short unsigned int m_iWWWAuthCount;
00551 
00552   // First request on a connection
00553   bool m_bFirstRequest;
00554 
00555   // Persistent connections
00556   bool m_bKeepAlive;
00557   int m_keepAliveTimeout; // Timeout in seconds.
00558 
00559   // Persistent proxy connections
00560   bool m_bPersistentProxyConnection;
00561 
00562 
00563   // Indicates whether there was some connection error.
00564   bool m_bError;
00565 
00566   // Previous and current response codes
00567   unsigned int m_responseCode;
00568   unsigned int m_prevResponseCode;
00569 
00570   // Values that determine the remote connection timeouts.
00571   int m_proxyConnTimeout;
00572   int m_remoteConnTimeout;
00573   int m_remoteRespTimeout;
00574 
00575   int m_pid;
00576 };
00577 #endif

tdeioslave/http

Skip menu "tdeioslave/http"
  • Main Page
  • Alphabetical List
  • Class List
  • File List

tdeioslave/http

Skip menu "tdeioslave/http"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeioslave/http by doxygen 1.6.3
This website is maintained by Timothy Pearson.