#include <iostream>
#include <fstream>
-//static void location_sub (MNode* arg, ustring& url, MlEnv* mlenv) {
static void location_sub (ustring& url, MNode* arg, MlEnv* mlenv) {
MNodePtr p;
MNode* a;
umatch m;
static uregex re ("^[a-z]{1,6}://[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*(:[0-9]{1,5})?/");
-// if (!arg)
-// throw (uErrorWrongNumber);
-// url = eval_text1 (arg->car (), mlenv);
if (usearch (url, m, re)) {
uiterator e = url.end ();
str = ustring (m[0].second, e);
} else {
url = urlencode (url);
}
-// nextNode (arg);
c = 0;
while (arg) {
b = str.begin ();
e = str.end ();
if (usearch (b, e, m, re)) {
- http.proto = ustring (m[1].first, m[1].second);
- http.host = ustring (m[2].first, m[2].second);
- if (m[4].matched)
- http.port = ustring (m[5].first, m[5].second);
- else
- http.port.resize (0);
- http.path = urlencode (ustring (m[0].second - 1, e));
+ if (http.useproxy) {
+ if (match (m[1].first, m[1].second, uHttps)) {
+ throw (ustring (CharConst ("proxy connection of SSL protocol not implemented.")));
+ } else {
+ http.proto = uHttp;
+ http.path = str;
+ if (http.port.empty ())
+ http.port.assign (CharConst ("80"));
+ }
+ } else {
+ http.proto = ustring (m[1].first, m[1].second);
+ http.host = ustring (m[2].first, m[2].second);
+ if (m[4].matched)
+ http.port = ustring (m[5].first, m[5].second);
+ else
+ http.port.resize (0);
+ http.path = urlencode (ustring (m[0].second - 1, e));
+ }
} else {
// throw (str + ": bad URL.");
http.proto.resize (0);
{CharConst ("pw"), false},
{CharConst ("query"), false},
{CharConst ("cookie"), false},
+ {CharConst ("proxy-host"), false},
+ {CharConst ("proxy-port"), false},
+ {CharConst ("proxy-id"), false},
+ {CharConst ("proxy-password"), false},
+ {CharConst ("proxy-pw"), false},
{NULL, 0, 0}
};
setParams (arg, 1, ¶ms, kwlist, &keywords, &rest);
url = eval_str (params[0], mlenv);
- if (keywords[0])
+ if (keywords[0]) // post
obj.http.fpost = eval_bool (keywords[0], mlenv);
- if (keywords[1])
- obj.http.id = eval_str (keywords[1], mlenv);
- if (keywords[2])
- obj.http.pw = eval_str (keywords[2], mlenv);
- if (keywords[3])
- obj.http.pw = eval_str (keywords[3], mlenv);
- if (keywords[4])
+ if (keywords[1]) // id
+ obj.http.id = omitCtrl (eval_str (keywords[1], mlenv));
+ if (keywords[2]) // password
+ obj.http.pw = omitCtrl (eval_str (keywords[2], mlenv));
+ if (keywords[3]) // pw
+ obj.http.pw = omitCtrl (eval_str (keywords[3], mlenv));
+ if (keywords[4]) // query
query = eval (keywords[4], mlenv);
- if (keywords[5])
+ if (keywords[5]) // cookie
cookie = eval (keywords[5], mlenv);
-
+ if (keywords[6]) { // proxy-host
+ obj.http.host = omitNonAsciiWord (eval_str (keywords[6], mlenv));
+ obj.http.useproxy = true;
+ }
+ if (keywords[7]) // proxy-port
+ obj.http.port = omitNonAsciiWord (eval_str (keywords[7], mlenv));
+ if (keywords[8]) // proxyid
+ obj.http.proxyid = omitCtrl (eval_str (keywords[8], mlenv));
+ if (keywords[9]) // proxypassword
+ obj.http.proxypw = omitCtrl (eval_str (keywords[9], mlenv));
+ if (keywords[10]) // proxypw
+ obj.http.proxypw = omitCtrl (eval_str (keywords[10], mlenv));
+
url_sub (url, obj.http);
if (obj.http.proto.empty ()) {
throw (obj.http.path + ": bad URL.");
wiki->errorMsg.append (cell->dump ()).append (CharConst (": link script error.\n"));
ferr = true;
}
+ } else if (wiki->paramOnFocusCheck (key)) {
+ if (! checkScript (vval, onfocus, ferr)) {
+ wiki->errorMsg.append (cell->dump ()).append (CharConst (": link script error.\n"));
+ ferr = true;
+ }
+ } else if (wiki->paramOnBlurCheck (key)) {
+ if (! checkScript (vval, onblur, ferr)) {
+ wiki->errorMsg.append (cell->dump ()).append (CharConst (": link script error.\n"));
+ ferr = true;
+ }
} else if ((selector & SEL_TARGET) && wiki->paramTargetCheck (key)) {
wiki->paramTargetBody (key, vval.textOut (wiki), target, ferr);
} else if (readAttribMore (key, vval, ferr)) {
wiki->outputID (out, id);
wiki->outputClass (out, classlist);
wiki->outputSubmitScript (out, CharConst ("onClick"), onclick);
+ wiki->outputSubmitScript (out, CharConst ("onFocus"), onfocus);
+ wiki->outputSubmitScript (out, CharConst ("onBlur"), onblur);
wiki->outputName (out, CharConst ("target"), target);
// wiki->outputName (out, CharConst ("size"), elsize);
wiki->outputFlag (out, CharConst ("multiple"), fmultiple);
return match (name, CharConst ("onclick"));
}
+bool WikiFormat::paramOnFocusCheck (const ustring& name) {
+ return match (name, CharConst ("onfocus"));
+}
+
+bool WikiFormat::paramOnBlurCheck (const ustring& name) {
+ return match (name, CharConst ("onblur"));
+}
+
void WikiFormat::outputName (MotorOutput* out, const char* name, size_t len, const ustring& val, bool cond) {
if (! cond || val.length () > 0)
out->out_raw (uSPC)
ustring id;
std::vector<ustring> classlist;
ustring onclick;
+ ustring onfocus;
+ ustring onblur;
ustring target;
// int32_t elsize;
bool fmultiple;
virtual bool paramTargetCheck (const ustring& key);
virtual void paramTargetBody (const ustring& key, const ustring& value, ustring& var, bool& ferr);
virtual bool paramOnClickCheck (const ustring& name);
+ virtual bool paramOnFocusCheck (const ustring& name);
+ virtual bool paramOnBlurCheck (const ustring& name);
virtual void outputName (MotorOutput* out, const char* name, size_t len, const ustring& val, bool cond = true);
virtual void outputName (MotorOutput* out, const char* name, size_t len, long val, bool cond = true);
virtual void outputFlag (MotorOutput* out, const char* name, size_t len, bool flag);