Beispiel #1
0
 void requestInit() override {
   // This doesn't copy them yet, but will do COW if they are modified
   m_GET    = php_global(s_GET).toArray();
   m_POST   = php_global(s_POST).toArray();
   m_COOKIE = php_global(s_COOKIE).toArray();
   m_SERVER = php_global(s_SERVER).toArray();
   m_ENV    = php_global(s_ENV).toArray();
 }
static Variant HHVM_METHOD(Yaf_Request_Http, getFiles, const Variant& name,
        const Variant& def) 
{
    if (name.isNull()) {
        return def;
    }

    if (!php_global(S_FILES).toArray().exists(name)) {
        return def;
    }

    return php_global(S_FILES).toArray()[name];
}
static bool HHVM_METHOD(Yaf_Request_Http, isXmlHttpRequest)
{
    if (!php_global(S_SERVER).toArray().exists(String("HTTP_X_REQUESTED_WITH"))) {
        return false;
    }

    Variant header = php_global(S_SERVER).toArray()[String("HTTP_X_REQUESTED_WITH")];
    if (!header.isString()) {
        return false;
    }

    std::string str_header = header.toString().toCppString();
    if (strncasecmp(str_header.c_str(), "XMLHttpRequest", str_header.length())) {
        return false;
    } 

    return true;
}
Beispiel #4
0
std::string& SourceRootInfo::initPhpRoot() {
  auto v = php_global(s_SERVER).toArray().rvalAt(s_PHP_ROOT);
  if (v.isString()) {
    *s_phproot.getCheck() = std::string(v.asCStrRef().data()) + "/";
  } else {
    // Our best guess at the source root.
    *s_phproot.getCheck() = GetCurrentSourceRoot();
  }
  return *s_phproot.getCheck();
}
Beispiel #5
0
std::string& SourceRootInfo::initPhpRoot() {
  auto const v = php_global(s_SERVER).toArray().rvalAt(s_PHP_ROOT).unboxed();
  if (isStringType(v.type())) {
    *s_phproot.getCheck() = std::string(v.val().pstr->data()) + "/";
  } else {
    // Our best guess at the source root.
    *s_phproot.getCheck() = GetCurrentSourceRoot();
  }
  return *s_phproot.getCheck();
}
static Variant HHVM_METHOD(Yaf_Request_Http, get, const Variant& name,
        const Variant& def) 
{
    if (name.isNull()) {
        return def;
    }

    auto paramsTmp = this_->o_realProp(YAF_REQUEST_PROPERTY_NAME_PARAMS, 
            ObjectData::RealPropUnchecked, "Yaf_Request_Http");

    if (paramsTmp->isNull()) {
        return def;
    }

    Array& params = paramsTmp->toArrRef();
    if (params.exists(name)) {
        return params[name];
    }

    if (php_global(S_POST).toArray().exists(name)) {
        return php_global(S_POST).toArray()[name];
    }

    if (php_global(S_GET).toArray().exists(name)) {
        return php_global(S_GET).toArray()[name];
    }

    if (php_global(S_COOKIE).toArray().exists(name)) {
        return php_global(S_COOKIE).toArray()[name];
    }

    if (php_global(S_SERVER).toArray().exists(name)) {
        return php_global(S_SERVER).toArray()[name];
    }

    return def;
}
Beispiel #7
0
static Array HHVM_FUNCTION(getopt, const String& options,
                                   const Variant& longopts /*=null */) {
  opt_struct *opts, *orig_opts;
  int len = parse_opts(options.data(), options.size(), &opts);

  if (!longopts.isNull()) {
    Array arropts = longopts.toArray();
    int count = arropts.size();

    /* the first <len> slots are filled by the one short ops
     * we now extend our array and jump to the new added structs */
    opts = (opt_struct *)smart_realloc(
      opts, sizeof(opt_struct) * (len + count + 1));
    orig_opts = opts;
    opts += len;

    memset(opts, 0, count * sizeof(opt_struct));

    for (ArrayIter iter(arropts); iter; ++iter) {
      String entry = iter.second().toString();

      opts->need_param = 0;
      opts->opt_name = strdup(entry.data());
      len = strlen(opts->opt_name);
      if ((len > 0) && (opts->opt_name[len - 1] == ':')) {
        opts->need_param++;
        opts->opt_name[len - 1] = '\0';
        if ((len > 1) && (opts->opt_name[len - 2] == ':')) {
          opts->need_param++;
          opts->opt_name[len - 2] = '\0';
        }
      }
      opts->opt_char = 0;
      opts++;
    }
  } else {
    opts = (opt_struct*) smart_realloc(opts, sizeof(opt_struct) * (len + 1));
    orig_opts = opts;
    opts += len;
  }

  /* php_getopt want to identify the last param */
  opts->opt_char   = '-';
  opts->need_param = 0;
  opts->opt_name   = NULL;

  static const StaticString s_argv("argv");
  Array vargv = php_global(s_argv).toArray();
  int argc = vargv.size();
  char **argv = (char **)smart_malloc((argc+1) * sizeof(char*));
  std::vector<String> holders;
  int index = 0;
  for (ArrayIter iter(vargv); iter; ++iter) {
    String arg = iter.second().toString();
    holders.push_back(arg);
    argv[index++] = (char*)arg.data();
  }
  argv[index] = NULL;

  /* after our pointer arithmetic jump back to the first element */
  opts = orig_opts;

  int o;
  char *php_optarg = NULL;
  int php_optind = 1;

  SCOPE_EXIT {
    free_longopts(orig_opts);
    smart_free(orig_opts);
    smart_free(argv);
  };

  Array ret = Array::Create();

  Variant val;
  int optchr = 0;
  int dash = 0; /* have already seen the - */
  char opt[2] = { '\0' };
  char *optname;
  int optname_len = 0;
  int php_optidx;
  while ((o = php_getopt(argc, argv, opts, &php_optarg, &php_optind, 0, 1,
                         optchr, dash, php_optidx))
         != -1) {
    /* Skip unknown arguments. */
    if (o == '?') {
      continue;
    }

    /* Prepare the option character and the argument string. */
    if (o == 0) {
      optname = opts[php_optidx].opt_name;
    } else {
      if (o == 1) {
        o = '-';
      }
      opt[0] = o;
      optname = opt;
    }

    if (php_optarg != NULL) {
      /* keep the arg as binary, since the encoding is not known */
      val = String(php_optarg, CopyString);
    } else {
      val = false;
    }

    /* Add this option / argument pair to the result hash. */
    optname_len = strlen(optname);
    if (!(optname_len > 1 && optname[0] == '0') &&
        is_numeric_string(optname, optname_len, NULL, NULL, 0) ==
        KindOfInt64) {
      /* numeric string */
      int optname_int = atoi(optname);
      if (ret.exists(optname_int)) {
        Variant &e = ret.lvalAt(optname_int);
        if (!e.isArray()) {
          ret.set(optname_int, make_packed_array(e, val));
        } else {
          e.toArrRef().append(val);
        }
      } else {
        ret.set(optname_int, val);
      }
    } else {
      /* other strings */
      String key(optname, strlen(optname), CopyString);
      if (ret.exists(key)) {
        Variant &e = ret.lvalAt(key);
        if (!e.isArray()) {
          ret.set(key, make_packed_array(e, val));
        } else {
          e.toArrRef().append(val);
        }
      } else {
        ret.set(key, val);
      }
    }

    php_optarg = NULL;
  }

  return ret;
}
Variant yaf_request_http_instance(const Object& object, 
        const Variant& request_uri, const Variant& var_base_uri)
{
    Object o;
    if (object.isNull()) {
        Array arr = Array::Create();
        arr.append(request_uri);
        arr.append(var_base_uri);

        o = createObject("Yaf_Request_Http", arr) ;
    } else {
        o = object;
    }

    const char* base_uri = NULL;
    if (var_base_uri.isString() && var_base_uri.toString().length()) {
        base_uri = var_base_uri.toString().c_str();
    }

    auto tmp = o->o_realProp(YAF_REQUEST_PROPERTY_NAME_METHOD, 
        ObjectData::RealPropUnchecked, "Yaf_Request_Http");

    if (php_global(S_SERVER).toArray().exists(String("REQUEST_METHOD"))) {
        Variant request_method = php_global(S_SERVER).toArray()[String("REQUEST_METHOD")];
        *tmp = request_method;
    } else if (strncmp(RuntimeOption::ExecutionMode, "cli", 3) == 0) {
        *tmp = String("Cli");
    } else {
        *tmp = String("Unknown");
    }

    std::string uri;
    if (request_uri.isString()) {
        uri = request_uri.toString().toCppString();
    } else {
        Variant tmp;
        if (php_global(S_SERVER).toArray().exists(String("PATH_INFO"))) {
            uri = php_global(S_SERVER).toArray()[String("PATH_INFO")].toString().toCppString();
            goto done;
        }

        if (php_global(S_SERVER).toArray().exists(String("REQUEST_URI"))) {
            tmp = php_global(S_SERVER).toArray()[String("REQUEST_URI")];
            if (tmp.isString()) {
                std::string str_tmp = tmp.toString().toCppString();
                if (strncasecmp(str_tmp.c_str(), "http", 4) == 0) {
                    //TODO use php_url_parse to get path
                    php_url* url_info = php_url_parse(str_tmp.c_str());
                    if (url_info && url_info->path) {
                        uri = std::string(url_info->path);
                    }
                    php_url_free(url_info);
                } else {
                    const char* tmp_str_tmp = str_tmp.c_str();
                    const char* pos = strstr(tmp_str_tmp, "?");
                    if (pos) {
                        uri = std::string(str_tmp.c_str(), pos - tmp_str_tmp);
                    } else {
                        uri = str_tmp;
                    }
                }
            }

            goto done;
        }

        if (php_global(S_SERVER).toArray().exists(String("ORIG_PATH_INFO"))) {
            uri = php_global(S_SERVER).toArray()[String("ORIG_PATH_INFO")].toString().toCppString();
            goto done;
        } 
    }

done:
    if (uri.length()) {
        const char* p = uri.c_str();
        while (*p == '/' && *(p+1) == '/') {
            p++;
        }

        uri = std::string(p);
        auto ptr_uri = o->o_realProp(YAF_REQUEST_PROPERTY_NAME_URI, 
                ObjectData::RealPropUnchecked, "Yaf_Request_Http");

        *ptr_uri = String(uri);
        yaf_request_set_base_uri(o, base_uri, uri.c_str());
    }

    auto ptr_params = o->o_realProp(YAF_REQUEST_PROPERTY_NAME_PARAMS, 
            ObjectData::RealPropUnchecked, "Yaf_Request_Http");
    *ptr_params = Array::Create();

    return o;
}