new object $http_lib: $libraries;

var $root inited = 1;
var $http_lib version = "HTTP_lib/1.0";
var $http_lib response_phrases = #[[100, "Continue"], [101, "Switching Protocols"], [200, "OK"], [201, "Created"], [202, "Accepted"], [203, "Non-Authoritative Information"], [204, "No Content"], [205, "Reset Content"], [206, "Partial Content"], [300, "Multiple Choices"], [301, "Moved Permanently"], [302, "Moved Temporarily"], [303, "See Other"], [304, "Not Modified"], [305, "Use Proxy"], [400, "Bad Request"], [401, "Unauthorized"], [402, "Payment Required"], [403, "Forbidden"], [404, "Not Found"], [405, "Method Not Allowed"], [406, "Not Acceptable"], [407, "Proxy Authentication Required"], [408, "Request Time-out"], [409, "Conflict"], [410, "Gone"], [411, "Length Required"], [412, "Precondition Failed"], [413, "Request Entity Too Large"], [414, "Request-URI Too Large"], [415, "Unsupported Media Type"], [500, "Internal Server Error"], [501, "Not Implemented"], [502, "Bad Gateway"], [503, "Service Unavailable"], [504, "Gateway Time-out"], [505, "HTTP Version not supported"]];
var $http_lib RFC1123GMT_datestr = "%a, %d %b %Y %H:%M:%S GMT";


public method .response_phrase() {
  arg code;

  return response_phrases[code];
};

public method .error() {
  arg code, @args;
  var dict, text, phrase;

  phrase = .response_phrase(code);
  text = ["<HEAD><TITLE>" + phrase + "</TITLE></HEAD>",
	 "<BODY>",
	 "<H1>" + code + " " + phrase + "</H1>"];
  if (args) {
    text += [args.join("<P>") + "<P>"];
  }
  text += ["</BODY>"];
  return [code, #[["Content-type", "text/html"]], text];
};

public method server() {
  return version + " " + $sys.server_info('core_version_str);
};

public method RFC1123GMT() {
  arg @time;
  var tzadjust;

  if (!time) {
    time = [time()];
  }
  tzadjust = localtime()[12];
  return $time.format(RFC1123GMT_datestr, time[1] + tzadjust);
};

public method .explode_http_encoding() {
    arg args;
    var fields, field, values;
    
    fields = #[];
    for field in (args.explode("&")) {
        field = field.explode("=");
        fields = fields.add($http.decode(field[1]), (listlen(field) == 1) ? "" : ($http.decode(field[2])));
    }
    return fields;
};