summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorpixel <pixel>2007-03-25 23:01:19 +0000
committerpixel <pixel>2007-03-25 23:01:19 +0000
commit1180579bd2ca853a937e6902ad30e4ab9776df43 (patch)
tree23fa768cead62525816f85737228d758301585d2 /lib
parentfe69588009318e303244307ae3c81a689fb8928c (diff)
Having some preliminary work on a HttpClient class.
Diffstat (limited to 'lib')
-rw-r--r--lib/HttpClient.cc95
1 files changed, 95 insertions, 0 deletions
diff --git a/lib/HttpClient.cc b/lib/HttpClient.cc
new file mode 100644
index 0000000..f95af79
--- /dev/null
+++ b/lib/HttpClient.cc
@@ -0,0 +1,95 @@
+#include <HttpClient.h>
+#include <BRegex.h>
+#include <CopyJob.h>
+#include <ReadJob.h>
+
+t_headers no_headers;
+
+HttpClient::HttpClient(const String & _url, Handle * _out, int * _http_code_p, const String & _fake_host, t_headers _headers) : url(_url), out(_out), http_code_p(_http_code_p), fake_host(_fake_host), headers(_headers), host(""), uri("") {
+ DecodeURL();
+
+ Client.SetNonBlock();
+ Client.Connect(host, 80);
+
+ if (Client.IsConnected()) {
+ SetBurst();
+ } else {
+ WaitFor(&Client, W4_WRITING);
+ }
+}
+
+HttpClient::~HttpClient() {
+}
+
+int HttpClient::Do() throw (GeneralException) {
+ t_headers::iterator i;
+ String t;
+
+ switch (current) {
+ case 0:
+ if (Client.IsConnecting()) {
+ Client.FinalizeConnect();
+ }
+ if (!Client.IsConnected()) {
+ return TASK_DONE;
+ }
+ current = 1;
+
+ case 1:
+ b << "GET " + uri + " HTTP/1.1\r\n"
+ "Host: " + (fake_host == "" ? host : fake_host) + "\r\n"
+ "Connection: close\r\n";
+
+ for (i = headers.begin(); i != headers.end(); i++) {
+ b << *i + "\r\n";
+ }
+
+ b << "\r\n";
+
+ c = new CopyJob(&b, &Client);
+ WaitFor(c);
+ current = 2;
+ Suspend(TASK_ON_HOLD);
+
+ case 2:
+ delete c;
+
+ c = new ReadJob(&Client, &b);
+ WaitFor(c);
+ current = 3;
+ Suspend(TASK_ON_HOLD);
+
+ case 3:
+ delete c;
+
+ do {
+ b >> t;
+ printm(M_INFO, "Got response: " + t + "\n");
+ } while (t.strlen());
+
+ }
+}
+
+String HttpClient::GetStatus() {
+ return "";
+}
+
+void HttpClient::DecodeURL() throw (GeneralException) {
+ int p;
+
+ static const Regex isURLValid("^http://[^/]");
+
+ if (!isURLValid.Match(url))
+ throw GeneralException("Invalid URL.");
+
+ String tmp = url.extract(7);
+ p = tmp.strchr('/');
+
+ if (p < 0) {
+ host = tmp;
+ return;
+ }
+
+ host = tmp.extract(0, p - 1);
+ uri = tmp.extract(p);
+}