gecko/services/sync/modules/rest.js
Gregory Szorc d9a82c9c27 Bug 787273 - Part 3: Don't rely on Identity in SyncStorageRequest; r=rnewman
The Identity singleton is going away. This refactors SyncStorageRequest
to not use it. Behavior now works like Resource. Instances are obtained
from the Service singleton and have authentication functionality
attached.
2012-09-14 16:02:32 -07:00

91 lines
2.8 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://services-common/log4moz.js");
Cu.import("resource://services-common/rest.js");
Cu.import("resource://services-sync/util.js");
Cu.import("resource://services-sync/constants.js");
const EXPORTED_SYMBOLS = ["SyncStorageRequest"];
const STORAGE_REQUEST_TIMEOUT = 5 * 60; // 5 minutes
/**
* RESTRequest variant for use against a Sync storage server.
*/
function SyncStorageRequest(uri) {
RESTRequest.call(this, uri);
this.authenticator = null;
}
SyncStorageRequest.prototype = {
__proto__: RESTRequest.prototype,
_logName: "Sync.StorageRequest",
/**
* The string to use as the base User-Agent in Sync requests.
* These strings will look something like
*
* Firefox/4.0 FxSync/1.8.0.20100101.mobile
*
* or
*
* Firefox Aurora/5.0a1 FxSync/1.9.0.20110409.desktop
*/
userAgent:
Services.appinfo.name + "/" + Services.appinfo.version + // Product.
" FxSync/" + WEAVE_VERSION + "." + // Sync.
Services.appinfo.appBuildID + ".", // Build.
/**
* Wait 5 minutes before killing a request.
*/
timeout: STORAGE_REQUEST_TIMEOUT,
dispatch: function dispatch(method, data, onComplete, onProgress) {
// Compose a UA string fragment from the various available identifiers.
if (Svc.Prefs.get("sendVersionInfo", true)) {
let ua = this.userAgent + Svc.Prefs.get("client.type", "desktop");
this.setHeader("user-agent", ua);
}
if (this.authenticator) {
this.authenticator(this);
} else {
this._log.debug("No authenticator found.");
}
return RESTRequest.prototype.dispatch.apply(this, arguments);
},
onStartRequest: function onStartRequest(channel) {
RESTRequest.prototype.onStartRequest.call(this, channel);
if (this.status == this.ABORTED) {
return;
}
let headers = this.response.headers;
// Save the latest server timestamp when possible.
if (headers["x-weave-timestamp"]) {
SyncStorageRequest.serverTime = parseFloat(headers["x-weave-timestamp"]);
}
// This is a server-side safety valve to allow slowing down
// clients without hurting performance.
if (headers["x-weave-backoff"]) {
Svc.Obs.notify("weave:service:backoff:interval",
parseInt(headers["x-weave-backoff"], 10));
}
if (this.response.success && headers["x-weave-quota-remaining"]) {
Svc.Obs.notify("weave:service:quota:remaining",
parseInt(headers["x-weave-quota-remaining"], 10));
}
}
};