]> git.mxchange.org Git - simgear.git/blobdiff - simgear/io/HTTPRequest.hxx
Async lookup attempt #3 - use OpenThreads instead - I'm going to kill off SGThread...
[simgear.git] / simgear / io / HTTPRequest.hxx
index 4afb1c75d8b02b856120c84e16026652576b210e..0e346419d12632abd535f99782e370120d149467 100644 (file)
@@ -18,6 +18,8 @@ class Request : public SGReferenced
 public:
     virtual ~Request();
     
+    virtual void setUrl(const std::string& url);
+    
     virtual std::string method() const
         { return _method; }
     virtual std::string url() const
@@ -25,7 +27,9 @@ public:
     
     virtual std::string scheme() const;
     virtual std::string path() const;
-    virtual std::string host() const; // host, including port
+    virtual std::string host() const;
+    virtual std::string hostAndPort() const;
+    virtual unsigned short port() const;
     
     virtual string_list requestHeaders() const;
     virtual std::string header(const std::string& name) const;
@@ -33,27 +37,57 @@ public:
     virtual int responseCode() const
         { return _responseStatus; }
         
-    virtual std::string resposeReason() const
+    virtual std::string responseReason() const
         { return _responseReason; }
         
-    virtual int contentLength() const;
-protected:
-    friend class Connection;
+    void setResponseLength(unsigned int l);    
+    virtual unsigned int responseLength() const;
+    
+    /**
+     * running total of body bytes received so far. Can be used
+     * to generate a completion percentage, if the response length is
+     * known. 
+     */
+    unsigned int responseBytesReceived() const
+        { return _receivedBodyBytes; }
+        
+    enum HTTPVersion {
+        HTTP_VERSION_UNKNOWN = 0,
+        HTTP_0_x, // 0.9 or similar
+        HTTP_1_0,
+        HTTP_1_1
+    };
+    
+    HTTPVersion responseVersion() const
+        { return _responseVersion; }
     
-    Request(const std::string& url, const std::string method = "get");
+    static HTTPVersion decodeVersion(const std::string& v);
+    
+    bool closeAfterComplete() const;
+protected:
+    Request(const std::string& url, const std::string method = "GET");
 
     virtual void responseStart(const std::string& r);
     virtual void responseHeader(const std::string& key, const std::string& value);
     virtual void responseHeadersComplete();
     virtual void responseComplete();
-    
+    virtual void failed();
     virtual void gotBodyData(const char* s, int n);
 private:
+    friend class Client;
+    friend class Connection;
+    
+    void processBodyBytes(const char* s, int n);
+    void setFailure(int code, const std::string& reason);
 
     std::string _method;
     std::string _url;
+    HTTPVersion _responseVersion;
     int _responseStatus;
     std::string _responseReason;
+    unsigned int _responseLength;
+    unsigned int _receivedBodyBytes;
+    bool _willClose;
     
     typedef std::map<std::string, std::string> HeaderDict;
     HeaderDict _responseHeaders;