static bool yaf_route_rewrite_route(const Object& o, const Object& request)
{
    char req_uri[8192];

    auto ptr_req_uri = request->o_realProp(YAF_REQUEST_PROPERTY_NAME_URI,
                    ObjectData::RealPropUnchecked, "Yaf_Request_Abstract");

    auto ptr_req_baseuri = request->o_realProp(YAF_REQUEST_PROPERTY_NAME_BASE,
                    ObjectData::RealPropUnchecked, "Yaf_Request_Abstract");

    if (ptr_req_uri == NULL) {
        raise_warning("invalid ptr_uri:%p", ptr_req_uri);
        return false;
    }

    if (ptr_req_baseuri->isString() 
            && !strncasecmp(ptr_req_uri->toString().c_str(), 
                ptr_req_baseuri->toString().c_str(), ptr_req_baseuri->toString().length())) {

        const char* tmp_req_uri = ptr_req_uri->toString().c_str() + ptr_req_baseuri->toString().length();
        snprintf(req_uri, sizeof(req_uri), "%s", tmp_req_uri);
    } else {
        const char* tmp_req_uri = ptr_req_uri->toString().c_str();
        snprintf(req_uri, sizeof(req_uri), "%s", tmp_req_uri);
    }

    Variant ret = yaf_route_rewrite_match(o, req_uri, strlen(req_uri));
    if (ret.isNull()) {
        return false;
    }

    auto ptr_route = o->o_realProp(YAF_ROUTE_PROPETY_NAME_ROUTE,
                    ObjectData::RealPropUnchecked, "Yaf_Route_Rewrite");
    Array& route = ptr_route->toArrRef();
    if (route.exists(String("module"))) {
        auto ptr_module = request->o_realProp(YAF_REQUEST_PROPERTY_NAME_MODULE,
                    ObjectData::RealPropUnchecked, "Yaf_Request_Abstract");
        *ptr_module = route[String("module")];
    }

    if (route.exists(String("controller"))) {
        auto ptr_controller = request->o_realProp(YAF_REQUEST_PROPERTY_NAME_CONTROLLER,
                    ObjectData::RealPropUnchecked, "Yaf_Request_Abstract");
        *ptr_controller = route[String("controller")];
    }

    if (route.exists(String("action"))) {
        auto ptr_action = request->o_realProp(YAF_REQUEST_PROPERTY_NAME_ACTION,
                    ObjectData::RealPropUnchecked, "Yaf_Request_Abstract");
        *ptr_action = route[String("action")];
    }

    (void)yaf_request_set_params_multi(&request, ret.toArray());
    return true;
}
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 #3
0
void DummySandbox::run() {
  TRACE(2, "DummySandbox::run\n");
  RequestInfo *ti = RequestInfo::s_requestInfo.getNoCheck();
  while (!m_stopped) {
    try {
      CLISession hphpSession;

      DSandboxInfo sandbox = m_proxy->getSandbox();
      std::string msg;
      if (sandbox.valid()) {
        SourceRootInfo sri(sandbox.m_user, sandbox.m_name);
        if (sandbox.m_path.empty()) {
          sandbox.m_path = sri.path();
        }
        if (!sri.sandboxOn()) {
          msg = "Invalid sandbox was specified. "
            "PHP files may not be loaded properly.\n";
        } else {
          auto server = php_global_exchange(s__SERVER, init_null());
          forceToArray(server);
          Array arr = server.toArrRef();
          server.unset();
          php_global_set(s__SERVER, sri.setServerVariables(std::move(arr)));
        }
        Debugger::RegisterSandbox(sandbox);
        g_context->setSandboxId(sandbox.id());

        std::string doc = getStartupDoc(sandbox);
        if (!doc.empty()) {
          char cwd[PATH_MAX];
          getcwd(cwd, sizeof(cwd));
          Logger::Info("Start loading startup doc '%s', pwd = '%s'",
                       doc.c_str(), cwd);
          bool error; std::string errorMsg;
          bool ret = hphp_invoke(g_context.getNoCheck(), doc, false, null_array,
                                 uninit_null(), "", "", error, errorMsg, true,
                                 false, true, RuntimeOption::EvalPreludePath);
          if (!ret || error) {
            msg += "Unable to pre-load " + doc;
            if (!errorMsg.empty()) {
              msg += ": " + errorMsg;
            }
          }
          Logger::Info("Startup doc " + doc + " loaded");
        }
      } else {
        g_context->setSandboxId(m_proxy->getDummyInfo().id());
      }

      if (!DebuggerHook::attach<HphpdHook>(ti)) {
        const char* fail = "Could not attach hphpd to request: another debugger"
                           " is already attached.";
        Logger::Error("%s", fail);
        Debugger::InterruptSessionStarted(nullptr, fail);
        throw DebuggerClientAttachFailureException();
      }
      {
        DebuggerDummyEnv dde;
        // This is really the entire point of having the dummy sandbox. This
        // fires the initial session started interrupt to the client after
        // it first attaches.
        Debugger::InterruptSessionStarted(nullptr, msg.c_str());
      }

      // Blocking until Ctrl-C is issued by end user and DebuggerProxy cannot
      // find a real sandbox thread to handle it.
      {
        Lock lock(this);
        while (!m_stopped && m_signum != CmdSignal::SignalBreak) {
          wait(1);
        }
        if (m_stopped) {
          // stopped by worker thread
          break;
        }
        m_signum = CmdSignal::SignalNone;
      }
    } catch (const DebuggerClientExitException& e) {
      // stopped by the dummy sandbox thread itself
      break;
    } catch (const DebuggerException& e) {
    }
  }
}
Beispiel #4
0
void _xml_characterDataHandler(void *userData, const XML_Char *s, int len) {
  auto parser = getParserFromToken(userData);

  if (parser) {
    Variant retval;
    Array args = Array::Create();

    if (parser->characterDataHandler.toBoolean()) {
      args.append(Variant(parser));
      args.append(_xml_xmlchar_zval(s, len, parser->target_encoding));
      xml_call_handler(parser, parser->characterDataHandler, args);
    }

    if (!parser->data.isNull()) {
      int i;
      int doprint = 0;

      String decoded_value;
      int decoded_len;
      decoded_value = xml_utf8_decode(s,len,
                                          parser->target_encoding);
      decoded_len = decoded_value.size();
      for (i = 0; i < decoded_len; i++) {
        switch (decoded_value[i]) {
        case ' ':
        case '\t':
        case '\n':
        default:
          doprint = 1;
          break;
        }
        if (doprint) {
          break;
        }
      }
      if (doprint || (! parser->skipwhite)) {
        if (parser->lastwasopen) {
          String myval;
          // check if value exists, if yes append to that
          if (parser->ctag.toArrRef().exists(s_value)) {
            myval = tvCastToString(parser->ctag.toArray().rvalAt(s_value).tv());
            myval += decoded_value;
            parser->ctag.toArrRef().set(s_value, myval);
          } else {
            parser->ctag.toArrRef().set(
              s_value,
              decoded_value
            );
          }
        } else {
          Array tag;
          String myval;
          String mytype;

          auto curtag = parser->data.toArrRef().pop();
          SCOPE_EXIT {
            try {
              parser->data.toArrRef().append(curtag);
            } catch (...) {}
          };

          if (curtag.toArrRef().exists(s_type)) {
            mytype = tvCastToString(curtag.toArrRef().rvalAt(s_type).tv());
            if (!strcmp(mytype.data(), "cdata") &&
                curtag.toArrRef().exists(s_value)) {
              myval = tvCastToString(curtag.toArrRef().rvalAt(s_value).tv());
              myval += decoded_value;
              curtag.toArrRef().set(s_value, myval);
              return;
            }
          }
          if (parser->level <= XML_MAXLEVEL && parser->level > 0) {
            tag = Array::Create();
            _xml_add_to_info(parser, parser->ltags[parser->level-1] +
                             parser->toffset);
            tag.set(s_tag, String(parser->ltags[parser->level-1] +
                                  parser->toffset, CopyString));
            tag.set(s_value, decoded_value);
            tag.set(s_type, s_cdata);
            tag.set(s_level, parser->level);
            parser->data.toArrRef().append(tag);
          } else if (parser->level == (XML_MAXLEVEL + 1)) {
            raise_warning("Maximum depth exceeded - Results truncated");
          }
        }
      }
    }
  }