Roxen.git / server / etc / modules / HTTPClient.pmod

version» Context lines:

Roxen.git/server/etc/modules/HTTPClient.pmod:143:    }    };       qr = s->async_do_method_url(http_method, uri,    args->variables,    args->data,    args->headers,    0, // headers received callback    cb, // ok callback    cb, // fail callback -  ({})); +  args->extra_args || ({}));       if (!query_has_maxtime()) { -  TRACE("No maxtime in Protocols.HTTP.Query. Set external max timeout\n"); +  TRACE("No maxtime in Protocols.HTTP.Query. Set external max timeout: %O\n", +  s->maxtime || DEFAULT_MAXTIME);    co_maxtime = call_out(lambda () {    TRACE("Timeout callback: %O\n", qr);       res = Failure(([    "status" : 504,    "status_desc" : "Gateway timeout",    "host" : qr->con->host,    "headers" : qr->con->headers,    "url" : qr->url_requested    ]));
Roxen.git/server/etc/modules/HTTPClient.pmod:234:       //! POST data    void|string|mapping data;       //! Callback to call on successful async request    function(Result:void) on_success;       //! Callback to call on failed async request    function(Result:void) on_failure;    +  //! Extra arguments that will end up in the @[Result] object +  array(mixed) extra_args; +     //! If @[args] is given the indices that match any of this object's    //! members will set those object members to the value of the    //! corresponding mapping member.    protected void create(void|mapping(string:mixed) args)    {    if (args) { -  foreach (args; string key; mixed val) { +  foreach (args; string key; mixed value) {    if (has_index(this, key)) { -  this[key] = val; +  if ((< "variables", "headers" >)[key]) { +  // Cast all values to string +  value = mkmapping(indices(value), map(values(value), +  lambda (mixed s) { +  return (string) s; +  }));    } -  +  +  this[key] = value;    } -  +  else { +  error("Unknown argument %O!\n", key);    }    }    } -  +  } + }         //! HTTP result class. Consider internal.   //!   //! @seealso   //! @[Success], @[Failure]   class Result   {    //! Internal result mapping    protected mapping result;
Roxen.git/server/etc/modules/HTTPClient.pmod:293:    {    return result->status_desc;    }       //! Returns the requested URL    public string `url()    {    return result->url;    }    +  //! Extra arguments set in the @[Arguments] object. +  public array(mixed) `extra_args() +  { +  return result->extra_args; +  } +     //! @ignore    protected void create(mapping _result)    {    //TRACE("this_program(%O)\n", _result->headers);    result = _result;    }    //! @endignore   }      
Roxen.git/server/etc/modules/HTTPClient.pmod:387:    {    if (stringp(url)) {    url = Standards.URI(url);    }       // Due to a bug in Protocols.HTTP.Session which is fixed in Pike 8.1    // but not yet in 8.0. (2016-05-20)    if (!extra_headers || !extra_headers->host || !extra_headers->Host) {    extra_headers = extra_headers || ([]);    -  if (url->scheme == "http" && url->port != 80) { -  extra_headers->host = url->host + ":" + url->port; +  TRACE("Set host in headers: %O\n", url); +  +  if (url->scheme == "http") { +  extra_headers->host = url->host; +  if (url->port != 80) { +  extra_headers->host += ":" + url->port;    } -  else if (url->scheme == "https" && url->port != 443) { -  extra_headers->host = url->host + ":" + url->port; +     } -  +  else if (url->scheme == "https") { +  extra_headers->host = url->host; +  if (url->port != 443) { +  extra_headers->host += ":" + url->port; +  } +  }       if (!sizeof(extra_headers)) {    extra_headers = 0;    }       TRACE("Host header set?: %O\n", extra_headers);    }    -  +  TRACE("Request: %O\n", url); +     return ::async_do_method_url(method, url, query_variables, data,    extra_headers, callback_headers_ok,    callback_data_ok, callback_fail,    callback_arguments);    }          class Request    {    inherit parent::Request;    -  +  protected void set_extra_args_in_result(mapping(string:mixed) r) +  { +  if (extra_callback_arguments && sizeof(extra_callback_arguments) > 1) { +  r->extra_args = extra_callback_arguments[1..]; +  } +  } +     protected void async_fail(SessionQuery q)    {    TRACE("fail q: %O -> %O\n", q, ::url_requested);       mapping ret = ([    "status" : q->status,    "status_desc" : q->status_desc,    "host" : q->host,    "headers" : copy_value(q->headers),    "url" : ::url_requested    ]);       TRACE("Ret: %O\n", ret);    -  +  set_extra_args_in_result(ret); +     // clear callbacks for possible garbation of this Request object    con->set_callbacks(0, 0);       function fc = fail_callback;    set_callbacks(0, 0, 0); // drop all references    extra_callback_arguments = 0;       if (fc) {    fc(Failure(ret));    }
Roxen.git/server/etc/modules/HTTPClient.pmod:464:    follow_redirects--;    do_async(prepare_method("GET", loc));    return;    }    }       // clear callbacks for possible garbation of this Request object    con->set_callbacks(0, 0);       if (data_callback) { -  con->timed_async_fetch(async_data, async_fail); // start data downloading +  con->async_fetch(async_data); // start data downloading    }    else {    extra_callback_arguments = 0; // to allow garb    }    }          protected void async_data()    {    mapping ret = ([    "host" : con->host,    "status" : con->status,    "status_desc" : con->status_desc,    "headers" : copy_value(con->headers),    "data" : con->data(),    "url" : ::url_requested    ]);    -  +  set_extra_args_in_result(ret); +     // clear callbacks for possible garbation of this Request object    con->set_callbacks(0, 0);       if (data_callback) {    data_callback(Success(ret));    }       extra_callback_arguments = 0;    }