Variant f_stream_context_get_options(const Resource& stream_or_context) { StreamContext* context = get_stream_context(stream_or_context); if (!context) { raise_warning("Invalid stream/context parameter"); return false; } return context->getOptions(); }
File* HttpStreamWrapper::open(const String& filename, const String& mode, int options, const Variant& context) { if (RuntimeOption::ServerHttpSafeMode) { return nullptr; } if (strncmp(filename.data(), "http://", sizeof("http://") - 1) && strncmp(filename.data(), "https://", sizeof("https://") - 1)) { return nullptr; } std::unique_ptr<UrlFile> file; StreamContext *ctx = !context.isResource() ? nullptr : context.toResource().getTyped<StreamContext>(); Array headers; String method = s_GET; String post_data = null_string; int max_redirs = 20; int timeout = -1; bool ignore_errors = false; if (ctx && !ctx->getOptions().isNull() && !ctx->getOptions()[s_http].isNull()) { Array opts = ctx->getOptions()[s_http].toArray(); if (opts.exists(s_method)) { method = opts[s_method].toString(); } if (opts.exists(s_header)) { Array lines; if (opts[s_header].isString()) { lines = StringUtil::Explode( opts[s_header].toString(), "\r\n").toArray(); } else if (opts[s_header].isArray()) { lines = opts[s_header]; } for (ArrayIter it(lines); it; ++it) { Array parts = StringUtil::Explode( it.second().toString(), ":").toArray(); headers.set(parts.rvalAt(0), parts.rvalAt(1)); } } if (opts.exists(s_user_agent) && !headers.exists(s_User_Agent)) { headers.set(s_User_Agent, opts[s_user_agent]); } if (opts.exists(s_max_redirects)) { max_redirs = opts[s_max_redirects].toInt64(); } if (opts.exists(s_timeout)) { timeout = opts[s_timeout].toInt64(); } if (opts.exists(s_ignore_errors)) { ignore_errors = opts[s_ignore_errors].toBoolean(); } post_data = opts[s_content].toString(); } if (!headers.exists(s_User_Agent)) { auto default_user_agent = ThreadInfo::s_threadInfo.getNoCheck() ->m_reqInjectionData.getUserAgent(); if (!default_user_agent.empty()) { headers.set(s_User_Agent, default_user_agent); } } file = std::unique_ptr<UrlFile>(newres<UrlFile>(method.data(), headers, post_data, max_redirs, timeout, ignore_errors)); bool ret = file->open(filename, mode); if (!ret) { raise_warning("Failed to open %s (%s)", filename.data(), file->getLastError().c_str()); return nullptr; } return file.release(); }
File* HttpStreamWrapper::open(const String& filename, const String& mode, int options, CVarRef context) { if (RuntimeOption::ServerHttpSafeMode) { return nullptr; } if (strncmp(filename.data(), "http://", sizeof("http://") - 1) && strncmp(filename.data(), "https://", sizeof("https://") - 1)) { return nullptr; } std::unique_ptr<UrlFile> file; StreamContext *ctx = !context.isResource() ? nullptr : context.toResource().getTyped<StreamContext>(); if (!ctx || ctx->getOptions().isNull() || ctx->getOptions()[s_http].isNull()) { file = std::unique_ptr<UrlFile>(NEWOBJ(UrlFile)()); } else { Array opts = ctx->getOptions()[s_http].toArray(); String method = s_GET; if (opts.exists(s_method)) { method = opts[s_method].toString(); } Array headers; if (opts.exists(s_header)) { Array lines; if (opts[s_header].isString()) { lines = StringUtil::Explode( opts[s_header].toString(), "\r\n").toArray(); } else if (opts[s_header].isArray()) { lines = opts[s_header]; } for (ArrayIter it(lines); it; ++it) { Array parts = StringUtil::Explode( it.second().toString(), ": ").toArray(); headers.set(parts.rvalAt(0), parts.rvalAt(1)); } } if (opts.exists(s_user_agent) && !headers.exists(s_User_Agent)) { headers.set(s_User_Agent, opts[s_user_agent]); } int max_redirs = 20; if (opts.exists(s_max_redirects)) { max_redirs = opts[s_max_redirects].toInt64(); } int timeout = -1; if (opts.exists(s_timeout)) { timeout = opts[s_timeout].toInt64(); } file = std::unique_ptr<UrlFile>(NEWOBJ(UrlFile)(method.data(), headers, opts[s_content].toString(), max_redirs, timeout)); } bool ret = file->open(filename, mode); if (!ret) { raise_warning("Failed to open %s (%s)", filename.data(), file->getLastError().c_str()); return nullptr; } return file.release(); }