0

firefox WebExtensionからアマゾンAWSサーバーでホスティングしているレストサービスにアクセスしようとしています。XMLHttpRequestを使用してWebExtensionからレストサービスにアクセスする際のエラー

私はmanifest.jsonにバックグラウンドスクリプトを登録しています。このスクリプトは、サービスにアクセスしようとしています。

"background": { 
    "scripts": ["OwnerLangBackground.js"] 
}, 
"permissions": [ 
    "*://ec2-35-158-91-62.eu-central-1.compute.amazonaws.com:9000/*" 
] 

ただし、XMLHttpRequestはエラーを返すだけですが、何がうまくいかないかはわかりません。 、不思議なこと

// OwnerLangBackground.js 
console.log("OwnerLangBackground.js loaded"); 
var getJSON = function(url, successHandler, errorHandler) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('get', url, true); 
    xhr.onreadystatechange = function() { 
     var status; 
     var data; 
     // https://xhr.spec.whatwg.org/#dom-xmlhttprequest-readystate 
     if (xhr.readyState == 4) { // `DONE` 
      status = xhr.status; 
      if (status == 200) { 
       data = JSON.parse(xhr.responseText); 
       successHandler && successHandler(data); 
      } else { 
       errorHandler && errorHandler(status, xhr.responseText); 
      } 
     } 
    }; 
    xhr.send(); 
}; 

/* BLOCK 1: removing the comments for this block works 
getJSON('https://mathiasbynens.be/demo/ip', function(data) { 
    console.log('Your public IP address is: ' + data.ip); 
    console.log('Your response is: ', data); 
}, function(status) { 
    console.warn('Something went wrong.', status); 
}); 
*/ 

/* BLOCK 2: removing the comments for this block, does not work 
getJSON('http://ec2-35-158-91-62.eu-central-1.compute.amazonaws.com:9000/get-languages', function(data) { 
    console.log('Your response is: ', data); 
}, function(status) { 
    console.warn('Something went wrong.', status); 
}); 
*/ 

https://mathiasbynens.be/notes/xhr-responsetype-json

私が今持っている上記のリンクからコードの(ややmodifed)コピーして自分のコードの交換:この問題を調査しながら、私は以下のページを偶然見つけブロック1をアクティブにすると、期待どおりに動作します(目的に応じてIPアドレスが不明瞭になります)。

OwnerLangBackground.js loaded 
    Your public IP address is: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xx 
    Your response is: Object { ip: "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:…" } 

ブロック2をアクティブにすると、エラー応答が発生します。

OwnerLangBackground.js loaded 
    Something went wrong. 0 

私が直接curlを使用して2つのURLを呼び出す場合は、それらの両方が有効なJSONを返す:

> curl https://mathiasbynens.be/demo/ip 
    {"ip":"xxxx:xxxx:xxxx::xxx"} 

    > curl http://ec2-35-158-91-62.eu-central-1.compute.amazonaws.com:9000/get-languages 
    [{"language":"??"},{"language":"de"},{"language":"en"},{"language":"fr"},{"language":"it"}] 

私はAWSサーバー上の私のRESTサービスへのデバッグ出力を追加していると私はそれことを確認呼び出される。 WebExtensionが実行されているローカルマシンでWiresharkを使用して、残りのサービスにWebExtension呼び出しをトレースしたところ、返されるJSON文字列が表示されるので、エラーはFirefox/webextensionのどこかで発生すると推測しています総損失で。私が検討している

物事:マニフェストで

  • 権限:限り、私は私のAWS-URLのURLパターンを伝えることができるように正しく追加されます。しかし、mathiasbynens.beへの呼び出しは、URLにアクセス権を追加していなくても機能します。
  • 動作している呼び出しはhttpsを使用し、動作しない呼び出しはhttpを使用します。これが理由だろうか?

誰かが間違ったことについてより多くのフィードバックを得るために正しい方向で私を指摘できますか?私はonerrorコールバックをxhr要求に追加しようとしました。それは呼ばれているが、私が見る限り、より多くの情報を提供していない。

更新: 私はもう2つのアイデアを思いつきました。 curl -vを使用すると、ヘッダーを提供してくれまし:

> curl -v http://ec2-35-158-91-62.eu-central-1.compute.amazonaws.com:9000/get-languages 
* Hostname was NOT found in DNS cache 
* Trying 35.158.91.62... 
* Connected to ec2-35-158-91-62.eu-central-1.compute.amazonaws.com (35.158.91.62) port 9000 (#0) 
> GET /get-languages HTTP/1.1 
> User-Agent: curl/7.38.0 
> Host: ec2-35-158-91-62.eu-central-1.compute.amazonaws.com:9000 
> Accept: */* 
> 
< HTTP/1.1 200 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
< Date: Sun, 23 Apr 2017 06:43:42 GMT 
< 
* Connection #0 to host ec2-35-158-91-62.eu-central-1.compute.amazonaws.com left intact 
[{"language":"??"},{"language":"de"},{"language":"en"},{"language":"fr"},{"language":"it"}] 


> curl -v https://mathiasbynens.be/demo/ip 
* Hostname was NOT found in DNS cache 
* Trying 2a01:1b0:7999:402::144... 
* Connected to mathiasbynens.be (2a01:1b0:7999:402::144) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* SSLv3, TLS handshake, Client hello (1): 
* SSLv3, TLS handshake, Server hello (2): 
* SSLv3, TLS handshake, CERT (11): 
* SSLv3, TLS handshake, Server key exchange (12): 
* SSLv3, TLS handshake, Server finished (14): 
* SSLv3, TLS handshake, Client key exchange (16): 
* SSLv3, TLS change cipher, Client hello (1): 
* SSLv3, TLS handshake, Finished (20): 
* SSLv3, TLS change cipher, Client hello (1): 
* SSLv3, TLS handshake, Finished (20): 
* SSL connection using TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 
* Server certificate: 
*  subject: OU=Domain Control Validated; OU=PositiveSSL Wildcard; CN=*.mathiasbynens.be 
*  start date: 2015-07-28 00:00:00 GMT 
*  expire date: 2018-08-12 23:59:59 GMT 
*  subjectAltName: mathiasbynens.be matched 
*  issuer: C=GB; ST=Greater Manchester; L=Salford; O=COMODO CA Limited; CN=COMODO RSA Domain Validation Secure Server CA 
*  SSL certificate verify ok. 
> GET /demo/ip HTTP/1.1 
> User-Agent: curl/7.38.0 
> Host: mathiasbynens.be 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Date: Sun, 23 Apr 2017 06:44:16 GMT 
* Server Apache is not blacklisted 
< Server: Apache 
< Access-Control-Allow-Origin: * 
< Strict-Transport-Security: max-age=15768000; includeSubDomains 
< Vary: Accept-Encoding 
< Cache-Control: max-age=0 
< Expires: Sun, 23 Apr 2017 06:44:16 GMT 
< X-UA-Compatible: IE=edge 
< X-Content-Type-Options: nosniff 
< X-Frame-Options: DENY 
< X-XSS-Protection: 1; mode=block 
< Transfer-Encoding: chunked 
< Content-Type: application/json;charset=UTF-8 
< 
* Connection #0 to host mathiasbynens.be left intact 
{"ip":"xxxx:xxxx:xxxx::xxx"} 

突き出し1つの違いは、私のRESTサービスの応答がTransfer-EncodingAccess-Control-Allow-Origin?ヘッダを欠いていることだったので、私はそれらを追加することに見ていきます。

でも、誰かがXmlHttpRequestで何がうまくいかないのかについてより多くのエラー情報を得る方法についてヒントがあれば、私はそれを聞いてうれしいです。

答えて

0

いいえ、それは私の問題の根本だったAccess-Control-Allow-Origin?ヘッダーが見つからないようです。

別のメソッドパラメータHttpServletResponse responseを追加し、そのパラメータでsetHeader()を呼び出して、Spring RestControllerのすべてのメソッドを変更しました。

@RequestMapping("/get-languages") 
public @ResponseBody List<Language> getLanguages(HttpServletResponse response) { 
    response.setHeader("Content-Type", "application/json;charset=UTF-8"); 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    return languageRepository.findAll(); 
} 

私のWebExtensionはXmlHttpRequestを使用してこのレストサービスを正常に使用できます。

この情報(CORSヘッダーが見つからない)がFirefoxのデバッグコンソールまたはjsコンソールのどこかに表示されていた場合に役立ちます。誰かが私にこれを見てもらえると教えてもらえれば、ヒント。

関連する問題