Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* 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/. */
"use strict";
const { ShoppingProduct } = ChromeUtils.importESModule(
"chrome://global/content/shopping/ShoppingProduct.mjs"
);
const IMAGE_URL = "http://example.com/api/image.jpg";
const server = createHttpServer({ hosts: ["example.com"] });
server.registerDirectory("/api/", do_get_file("/data"));
function BinaryHttpResponse(status, headerNames, headerValues, content) {
this.status = status;
this.headerNames = headerNames;
this.headerValues = headerValues;
this.content = content;
}
BinaryHttpResponse.prototype = {
QueryInterface: ChromeUtils.generateQI(["nsIBinaryHttpResponse"]),
};
let ohttp = Cc["@mozilla.org/network/oblivious-http;1"].getService(
Ci.nsIObliviousHttp
);
let ohttpServer = ohttp.server();
server.registerPathHandler(
new URL(API_OHTTP_CONFIG).pathname,
(request, response) => {
let bstream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(
Ci.nsIBinaryOutputStream
);
bstream.setOutputStream(response.bodyOutputStream);
bstream.writeByteArray(ohttpServer.encodedConfig);
}
);
let gExpectedOHTTPMethod = "GET";
server.registerPathHandler(
new URL(API_OHTTP_RELAY).pathname,
async (request, response) => {
let inputStream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(
Ci.nsIBinaryInputStream
);
inputStream.setInputStream(request.bodyInputStream);
let requestBody = inputStream.readByteArray(inputStream.available());
let ohttpRequest = ohttpServer.decapsulate(requestBody);
let bhttp = Cc["@mozilla.org/network/binary-http;1"].getService(
Ci.nsIBinaryHttp
);
let decodedRequest = bhttp.decodeRequest(ohttpRequest.request);
Assert.equal(
decodedRequest.method,
gExpectedOHTTPMethod,
"Should get expected HTTP method"
);
Assert.deepEqual(decodedRequest.headerNames.sort(), [
"Accept",
"Content-Type",
]);
Assert.deepEqual(decodedRequest.headerValues, ["image/jpeg", "image/jpeg"]);
response.processAsync();
let innerResponse = await fetch("http://example.com" + decodedRequest.path);
let bytes = new Uint8Array(await innerResponse.arrayBuffer());
let binaryResponse = new BinaryHttpResponse(
innerResponse.status,
["Content-Type"],
["image/jpeg"],
bytes
);
let encResponse = ohttpRequest.encapsulate(
bhttp.encodeResponse(binaryResponse)
);
response.setStatusLine(request.httpVersion, 200, "OK");
response.setHeader("Content-Type", "message/ohttp-res", false);
let bstream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(
Ci.nsIBinaryOutputStream
);
bstream.setOutputStream(response.bodyOutputStream);
bstream.writeByteArray(encResponse);
response.finish();
}
);
add_task(async function test_product_requestImageBlob() {
let uri = new URL("https://www.walmart.com/ip/926485654");
let product = new ShoppingProduct(uri, { allowValidationFailure: false });
Assert.ok(product.isProduct(), "Should recognize a valid product.");
let img = await ShoppingProduct.requestImageBlob(IMAGE_URL);
Assert.ok(Blob.isInstance(img), "Image is loaded and returned as a blob");
enableOHTTP();
img = await ShoppingProduct.requestImageBlob(IMAGE_URL);
disableOHTTP();
Assert.ok(Blob.isInstance(img), "Image is loaded and returned as a blob");
});