📄 xmlhttprequest.cpp
字号:
#endif
gcProtect (this);
qObject->connect( job, SIGNAL( result( KIO::Job* ) ),
SLOT( slotFinished( KIO::Job* ) ) );
#if APPLE_CHANGES
qObject->connect( job, SIGNAL( data( KIO::Job*, const char*, int ) ),
SLOT( slotData( KIO::Job*, const char*, int ) ) );
#else
qObject->connect( job, SIGNAL( data( KIO::Job*, const QByteArray& ) ),
SLOT( slotData( KIO::Job*, const QByteArray& ) ) );
#endif
qObject->connect( job, SIGNAL(redirection(KIO::Job*, const KURL& ) ),
SLOT( slotRedirection(KIO::Job*, const KURL&) ) );
#ifdef APPLE_CHANGES
KWQServeRequest(khtml::Cache::loader(), doc->docLoader(), job);
#else
KIO::Scheduler::scheduleJob( job );
#endif
}
void XMLHttpRequest::abort()
{
if (job) {
job->kill();
job = 0;
}
if (decoder) {
decoder->deref();
decoder = 0;
}
aborted = true;
gcUnprotect (this);
}
void XMLHttpRequest::setRequestHeader(const QString& name, const QString &value)
{
if (requestHeaders.length() > 0) {
requestHeaders += "\r\n";
}
requestHeaders += name;
requestHeaders += ": ";
requestHeaders += value;
}
Value XMLHttpRequest::getAllResponseHeaders() const
{
if (responseHeaders.isEmpty()) {
return Undefined();
}
int endOfLine = responseHeaders.find("\n");
if (endOfLine == -1) {
return Undefined();
}
return String(responseHeaders.mid(endOfLine + 1) + "\n");
}
Value XMLHttpRequest::getResponseHeader(const QString& name) const
{
if (responseHeaders.isEmpty()) {
return Undefined();
}
QRegExp headerLinePattern(name + ":", false);
int matchLength;
int headerLinePos = headerLinePattern.match(responseHeaders, 0, &matchLength);
while (headerLinePos != -1) {
if (headerLinePos == 0 || responseHeaders[headerLinePos-1] == '\n') {
break;
}
headerLinePos = headerLinePattern.match(responseHeaders, headerLinePos + 1, &matchLength);
}
if (headerLinePos == -1) {
return Undefined();
}
int endOfLine = responseHeaders.find("\n", headerLinePos + matchLength);
return String(responseHeaders.mid(headerLinePos + matchLength, endOfLine - (headerLinePos + matchLength)).stripWhiteSpace());
}
Value XMLHttpRequest::getStatus() const
{
if (responseHeaders.isEmpty()) {
return Undefined();
}
int endOfLine = responseHeaders.find("\n");
QString firstLine = endOfLine == -1 ? responseHeaders : responseHeaders.left(endOfLine);
int codeStart = firstLine.find(" ");
int codeEnd = firstLine.find(" ", codeStart + 1);
if (codeStart == -1 || codeEnd == -1) {
return Undefined();
}
QString number = firstLine.mid(codeStart + 1, codeEnd - (codeStart + 1));
bool ok = false;
int code = number.toInt(&ok);
if (!ok) {
return Undefined();
}
return Number(code);
}
Value XMLHttpRequest::getStatusText() const
{
if (responseHeaders.isEmpty()) {
return Undefined();
}
int endOfLine = responseHeaders.find("\n");
QString firstLine = endOfLine == -1 ? responseHeaders : responseHeaders.left(endOfLine);
int codeStart = firstLine.find(" ");
int codeEnd = firstLine.find(" ", codeStart + 1);
if (codeStart == -1 || codeEnd == -1) {
return Undefined();
}
QString statusText = firstLine.mid(codeEnd + 1, endOfLine - (codeEnd + 1)).stripWhiteSpace();
return String(statusText);
}
#if APPLE_CHANGES
void XMLHttpRequest::processSyncLoadResults(const QByteArray &data, const KURL &finalURL, const QString &headers)
{
if (!urlMatchesDocumentDomain(finalURL)) {
abort();
return;
}
responseHeaders = headers;
changeState(Loaded);
if (aborted) {
return;
}
const char *bytes = (const char *)data.data();
int len = (int)data.size();
slotData(0, bytes, len);
if (aborted) {
return;
}
slotFinished(0);
}
#endif
void XMLHttpRequest::slotFinished(KIO::Job *)
{
if (decoder) {
response += decoder->flush();
}
job = 0;
changeState(Completed);
if (decoder) {
decoder->deref();
decoder = 0;
}
gcUnprotect (this);
}
void XMLHttpRequest::slotRedirection(KIO::Job*, const KURL& url)
{
if (!urlMatchesDocumentDomain(url)) {
abort();
}
}
#if APPLE_CHANGES
void XMLHttpRequest::slotData( KIO::Job*, const char *data, int len )
#else
void XMLHttpRequest::slotData(KIO::Job*, const QByteArray &_data)
#endif
{
if (state < Loaded) {
responseHeaders = job->queryMetaData("HTTP-Headers");
encoding = job->queryMetaData("charset");
changeState(Loaded);
}
#if !APPLE_CHANGES
const char *data = (const char *)_data.data();
int len = (int)_data.size();
#endif
if ( decoder == NULL ) {
decoder = new Decoder;
if (!encoding.isNull())
decoder->setEncoding(encoding.latin1(), Decoder::EncodingFromHTTPHeader);
else {
// FIXME: Inherit the default encoding from the parent document?
}
}
if (len == 0)
return;
if (len == -1)
len = strlen(data);
QString decoded = decoder->decode(data, len);
response += decoded;
if (!aborted) {
changeState(Interactive);
}
}
Value XMLHttpRequestProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args)
{
if (!thisObj.inherits(&XMLHttpRequest::info)) {
Object err = Error::create(exec,TypeError);
exec->setException(err);
return err;
}
XMLHttpRequest *request = static_cast<XMLHttpRequest *>(thisObj.imp());
switch (id) {
case XMLHttpRequest::Abort: {
request->abort();
return Undefined();
}
case XMLHttpRequest::GetAllResponseHeaders: {
if (args.size() != 0) {
return Undefined();
}
return request->getAllResponseHeaders();
}
case XMLHttpRequest::GetResponseHeader: {
if (args.size() != 1) {
return Undefined();
}
return request->getResponseHeader(args[0].toString(exec).qstring());
}
case XMLHttpRequest::Open:
{
if (args.size() < 2 || args.size() > 5) {
return Undefined();
}
QString method = args[0].toString(exec).qstring();
KURL url = KURL(Window::retrieveActive(exec)->part()->document().completeURL(args[1].toString(exec).qstring()).string());
bool async = true;
if (args.size() >= 3) {
async = args[2].toBoolean(exec);
}
if (args.size() >= 4) {
url.setUser(args[3].toString(exec).qstring());
}
if (args.size() >= 5) {
url.setPass(args[4].toString(exec).qstring());
}
request->open(method, url, async);
return Undefined();
}
case XMLHttpRequest::Send:
{
if (args.size() > 1) {
return Undefined();
}
if (request->state != Loading) {
return Undefined();
}
QString body;
if (args.size() >= 1) {
if (args[0].toObject(exec).inherits(&DOMDocument::info)) {
DOM::Node docNode = static_cast<KJS::DOMDocument *>(args[0].toObject(exec).imp())->toNode();
DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl *>(docNode.handle());
#if KHTML_NO_EXCEPTIONS
DOM::_exceptioncode = 0;
body = doc->toString().string();
// FIXME: also need to set content type, including encoding!
if (DOM::_exceptioncode){
Object err = Error::create(exec, GeneralError, "Exception serializing document");
exec->setException(err);
DOM::_exceptioncode = 0;
}
#else
try {
body = doc->toString().string();
// FIXME: also need to set content type, including encoding!
} catch(DOM::DOMException& e) {
Object err = Error::create(exec, GeneralError, "Exception serializing document");
exec->setException(err);
}
#endif
} else {
// converting certain values (like null) to object can set an exception
exec->clearException();
body = args[0].toString(exec).qstring();
}
}
request->send(body);
return Undefined();
}
case XMLHttpRequest::SetRequestHeader: {
if (args.size() != 2) {
return Undefined();
}
request->setRequestHeader(args[0].toString(exec).qstring(), args[1].toString(exec).qstring());
return Undefined();
}
case XMLHttpRequest::OverrideMIMEType: {
if (args.size() != 1) {
return Undefined();
}
request->MIMETypeOverride = args[0].toString(exec).qstring();
return Undefined();
}
}
return Undefined();
}
} // end namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -