blob: aba09c1816a3679f1c20257b0fbc0018d8a31cd4 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.alibaba.weex.commons.util;
import android.support.annotation.Nullable;
import android.util.Pair;
import com.taobao.weex.devtools.inspector.network.NetworkEventReporter;
import com.taobao.weex.devtools.inspector.network.NetworkEventReporterManager;
import com.taobao.weex.devtools.inspector.network.SimpleBinaryInspectorWebSocketFrame;
import com.taobao.weex.devtools.inspector.network.SimpleTextInspectorWebSocketFrame;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by moxun on 17/4/20.
*/
public class WSEventReporter {
private String requestId;
private NetworkEventReporter reporter;
private WSRequest request;
public static WSEventReporter newInstance() {
return new WSEventReporter();
}
private WSEventReporter() {
requestId = String.valueOf(RequestIdGenerator.nextRequestId());
reporter = NetworkEventReporterManager.get();
}
public void created(String url) {
if (reporter != null) {
reporter.webSocketCreated(requestId, url);
}
}
public void closed() {
if (reporter != null) {
reporter.webSocketClosed(requestId);
}
}
public void willSendHandshakeRequest(Map<String, String> headers, @Nullable String friendlyName) {
if (reporter != null) {
request = new WSRequest(requestId, friendlyName, headers);
reporter.webSocketWillSendHandshakeRequest(request);
}
}
public void handshakeResponseReceived(int code, String phrase, Map<String, String> responseHeaders) {
if (reporter != null) {
reporter.webSocketHandshakeResponseReceived(new WSResponse(requestId, code, phrase, responseHeaders, request));
}
}
public void frameSent(String frame) {
if (reporter != null) {
reporter.webSocketFrameSent(new SimpleTextInspectorWebSocketFrame(requestId, frame));
}
}
public void frameSent(byte[] frame) {
if (reporter != null) {
reporter.webSocketFrameSent(new SimpleBinaryInspectorWebSocketFrame(requestId, frame));
}
}
public void frameReceived(String frame) {
if (reporter != null) {
reporter.webSocketFrameReceived(new SimpleTextInspectorWebSocketFrame(requestId, frame));
}
}
public void frameReceived(byte[] frame) {
if (reporter != null) {
reporter.webSocketFrameReceived(new SimpleBinaryInspectorWebSocketFrame(requestId, frame));
}
}
public void frameError(String msg) {
if (reporter != null) {
reporter.webSocketFrameError(requestId, msg);
}
}
private static class WSRequest extends WSHeaderCommon implements NetworkEventReporter.InspectorWebSocketRequest {
private String id;
private String name;
public WSRequest(String id, String name, Map<String, String> headers) {
attachHeaders(headers);
this.id = id;
this.name = name;
if (this.name == null) {
this.name = "WS Connection " + id;
}
}
@Override
public String id() {
return id;
}
@Override
public String friendlyName() {
return name;
}
}
private static class WSResponse extends WSHeaderCommon implements NetworkEventReporter.InspectorWebSocketResponse {
private String id;
private int code;
private String phrase;
private WSHeaderCommon headers;
public WSResponse(String id, int code, String phrase, Map<String, String> responseHeaders, WSHeaderCommon headers) {
attachHeaders(responseHeaders);
this.id = id;
this.code = code;
this.phrase = phrase;
this.headers = headers;
}
@Override
public String requestId() {
return id;
}
@Override
public int statusCode() {
return code;
}
@Override
public String reasonPhrase() {
return phrase;
}
@Nullable
@Override
public NetworkEventReporter.InspectorHeaders requestHeaders() {
return headers;
}
}
private static class WSHeaderCommon implements NetworkEventReporter.InspectorHeaders {
private List<Pair<String, String>> headerList = new ArrayList<>();
public void attachHeaders(Map<String, String> headers) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
headerList.add(new Pair<>(entry.getKey(), entry.getValue()));
}
}
public void addHeader(String key, String value) {
headerList.add(new Pair<>(key, value));
}
@Override
public int headerCount() {
return headerList.size();
}
@Override
public String headerName(int index) {
return headerList.get(index).first;
}
@Override
public String headerValue(int index) {
return headerList.get(index).second;
}
@Nullable
@Override
public String firstHeaderValue(String name) {
for (Pair<String, String> pair : headerList) {
if (pair.first.equals(name)) {
return pair.second;
}
}
return null;
}
}
}