4

https://clients4.google.comにあるChrome同期サービスにPOSTリクエストを送信しようとしています。その短いコードを使用して、以前にBURP Suiteを使用してキャプチャし、ファイルに保存したリクエストを送信しています。これは、同期サービスに接続するときにChromeが送信するものです。そのコードはSSLSocketを開き、Chromeサーバーに接続して、そのファイルの内容を送信します(以下を参照)。

private void sendRequest() {
    SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
    SSLSocket socket = (SSLSocket) sslsocketfactory.createSocket("clients4.google.com", 443);
    socket.startHandshake();

    BufferedWriter out = new BufferedWriter(
            new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
    BufferedReader in = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));

    sendMessage(out, new File("request.bin"));
    readResponse(in);

    out.close();
    in.close();
}

private void sendMessage(BufferedWriter out, File request) throws IOException {
    List<String> result = getContents(request);
    for (String line : result) {
        out.write(line + "\r\n");
    }
    out.write("\r\n");
    out.flush();
}

private void readResponse(BufferedReader in) throws IOException {
    String line;
    while ((line = in.readLine()) != null) {
        System.out.println(line);
    }
}

private List getContents(File file) throws IOException {
    List<String> contents = new ArrayList<String>();
    BufferedReader input = new BufferedReader(new FileReader(file));
    String line;
    while ((line = input.readLine()) != null) {
        contents.add(line);
    }
    input.close();
    return contents;
}

request.binファイルは次のようになります(SSLを使用しないプレーンテキストのリクエストです)。

POST /chrome-sync/command/?client=Google+Chrome&client_id={VALID_CLIENT_ID} HTTP/1.1
Host: clients4.google.com
Connection: keep-alive
Content-Length: 1730
Authorization: GoogleLogin auth={MY_VALID_AUTH_DATA}
Content-Type: application/octet-stream
User-Agent: Chrome WIN 23.0.1271.97 (171054)
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

{binary data}

サーバーがHTTP/1.0 404 Not Foundを返すため、このリクエストは失敗します。しかし、なぜこれが起こるのでしょうか?Chromeが送信するのとまったく同じリクエストですね。ここで何が欠けていますか?

4

2 に答える 2

3

ここで私自身の質問に答えます:問題はエンコーディングにありました。リクエスト本文のバイナリデータがわずかに変更されたため、Googleサーバーがエラーコード404で応答しました(これはかなり混乱します)。適切なエンコーディングを使用しているので、すべてが正常に機能します。

于 2013-01-06T22:07:11.090 に答える
1

chrome://sync/Chromeのアドレスバーに入力すると、サーバーのURLが次のように表示されます。

https://clients4.google.com/chrome-sync/dev

あなたがこのリンクで見つけることができるいくつかのより多くの情報:

http://code.google.com/p/chromium/issues/detail?id=90811

そして/command?認証が必要です。いくつかの情報があなたに役立つかもしれないことがわかりました。この問題のコメントを確認してください: http ://code.google.com/p/chromium/issues/detail?id = 108186

それが役に立てば幸い

于 2013-01-05T15:17:04.383 に答える