1

次のコードを使用して、Web サーバーからの応答を要求しています。サーバーは、ClientProtocolException の原因となるヘッダーなしの不正な応答を送信します。インスペクターを使用しようとしましたが、例外が発生する前に呼び出されません。サーバーを変更できません (組み込みデバイス、ALFA ルーター R36 内にあります)。この問題に対処するための提案 (ところで: サーバーの応答が整形式であれば、コードは完璧に機能します)

前もってありがとう、トン

class httpRequestTask extends AsyncTask <Integer, Integer, Integer> {

    StringBuffer respTxt = new StringBuffer("");        
    int reqCode = 0;


    protected Integer doInBackground(Integer... requestCode) {
        Integer reqStatus = 0;
        String url = "http://192.168.2.1/";
        String authString = ("admin:admin");

        switch( reqCode = requestCode[0].intValue()){
            case Constants.HTTP_GET_STATUS_INFO:    url += "/adm/status_info.asp";              break;
            case Constants.HTTP_SCAN:               url += "/goform/getUsbStaBSSIDListForm";    break;
        }

        try {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            HttpResponse response;

            request.setURI( new URI( url));           
            request.addHeader("Authorization", "Basic " + Base64.encodeToString(authString.getBytes(),Base64.NO_WRAP));

            response = client.execute(request);
            reqStatus = response.getStatusLine().getStatusCode();

            String line;
            BufferedReader in = new BufferedReader( new InputStreamReader(response.getEntity().getContent()));
            while((line = in.readLine()) != null) respTxt.append(line);
        } catch ( ClientProtocolException e){
            Log.e("ALFA", "HTTPReq:ClientProtocolException " + e.toString());
        } catch ( IOException e){
            Log.e("ALFA", "HTTPReq:IOException " + e.toString());
        } catch ( Exception e){
            Log.e("ALFA", "HTTPReq:Exception " + e.toString());
        }

        return reqStatus;
    }

    protected void onPostExecute(Integer reqStatus) {
        Intent intent = new Intent(Constants.HTTP_RESPONSE);

        intent.putExtra( "reqCode", reqCode);
        intent.putExtra( "reqStatus", reqStatus);
        intent.putExtra( "rspTxt", respTxt.toString());

        getBaseContext().sendBroadcast(intent);
}
}

4

1 に答える 1

0

問題の解決策をさらに探すために、ソケットを使用してサーバーを要求するという提案を見つけました。Fiddlerを PC のブラウザーと組み合わせて使用​​して、バグのあるサーバーとの間で送受信されるデータを調べ、Wikipedia で HTTP プロトコルを説明している記事を読みました。その情報と Socket を使用して、バグのある Web サーバーからのミス フォームの応答を処理するための非常に基本的な httpRequestHandler を作成しました。

class httpSocketRequest extends AsyncTask<Integer, Integer, Integer> {
    StringBuffer respTxt = new StringBuffer("");        
    int reqCode = 0;
    int reqStatus = 0;

    protected Integer doInBackground(Integer... requestCode) {
        String ip = "192.168.2.1";
        String path = "";
        String authString = ("admin:admin");
        Socket socket = null;

        switch( reqCode = requestCode[0].intValue()){
            case Constants.HTTP_GET_STATUS_INFO:    path = "adm/status_info.asp";               break;
            case Constants.HTTP_SCAN:               path = "goform/getUsbStaBSSIDListForm";     break;
        }

        try {
            socket = new Socket( ip, 80);

            PrintWriter out = new PrintWriter( socket.getOutputStream());
            out.println( "GET http://" + ip + "/" + path + " HTTP/1.0");
            out.println( "Authorization: Basic " + Base64.encodeToString(authString.getBytes(),Base64.NO_WRAP));
            out.println( "");
            out.flush();

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String line;
            int lineCnt = 0;

            while((line = in.readLine()) != null){
                if( lineCnt >= 0){
                    lineCnt++;
                    if(lineCnt == 1){           // first line should start with "HTTP/1.x " followed by a 3 digit status
                        if( line.length() > 12 && line.substring(0, 6).equals("HTTP/1")){
                            int p = line.indexOf(" ");
                            reqStatus = Integer.parseInt(line.substring(p+1, p+4));
                            continue;
                        } else {                // not a well formed response
                            lineCnt = -1;       // just put everything into respTxt
                            reqStatus = 200;    // and assume everything went OK
                        }
                    } else if( lineCnt > 1){    // process rest of headers
                        if( line.length() == 0){
                            lineCnt = -1;       // done with headers
                        } else {
                            // TODO insert code to process other headers
                        }
                        continue;
                    }
                }

                respTxt.append(line + "\n");
            }

        } catch (Exception e) {
            Log.e("ALFA", "HTTPReq:Exception " + e.toString());
        } finally {
            try {
                if( socket != null) socket.close();
            } catch (IOException e) {
                Log.e("ALFA", "HTTPReq:Exception closing socket" + e.toString());
            }
        }

        return reqStatus;
    }

    protected void onPostExecute(Integer reqStatus) {
        Intent intent = new Intent(Constants.HTTP_RESPONSE);

        intent.putExtra( "reqCode", reqCode);
        intent.putExtra( "reqStatus", reqStatus);
        intent.putExtra( "rspTxt", respTxt.toString());

        getBaseContext().sendBroadcast(intent);
    }
}   
于 2013-06-24T21:50:39.693 に答える