use of com.acgist.snail.pojo.wrapper.HeaderWrapper in project snail by acgist.
the class LocalServiceDiscoveryClient method buildMessage.
/**
* <p>新建本地发现消息</p>
*
* @param infoHashs InfoHash数组
*
* @return 本地发现消息
*/
private String buildMessage(String... infoHashs) {
final String peerId = StringUtils.hex(PeerConfig.getInstance().peerId());
final HeaderWrapper builder = HeaderWrapper.newBuilder(PROTOCOL);
builder.header(LocalServiceDiscoveryMessageHandler.HEADER_HOST, SymbolConfig.Symbol.COLON.join(LocalServiceDiscoveryServer.lsdHost(), LocalServiceDiscoveryServer.LSD_PORT)).header(LocalServiceDiscoveryMessageHandler.HEADER_PORT, String.valueOf(SystemConfig.getTorrentPort())).header(LocalServiceDiscoveryMessageHandler.HEADER_COOKIE, peerId);
for (String infoHash : infoHashs) {
builder.header(LocalServiceDiscoveryMessageHandler.HEADER_INFOHASH, infoHash);
}
return builder.build();
}
use of com.acgist.snail.pojo.wrapper.HeaderWrapper in project snail by acgist.
the class UpnpMessageHandler method onMessage.
@Override
public void onMessage(String message, InetSocketAddress address) {
final HeaderWrapper headers = HeaderWrapper.newInstance(message);
// 判断是否支持UPNP设置
final boolean support = headers.allHeaders().values().stream().anyMatch(list -> list.stream().anyMatch(value -> StringUtils.startsWith(value, UpnpServer.UPNP_ROOT_DEVICE)));
if (!support) {
LOGGER.warn("UPNP设置失败(不支持的驱动):{}", message);
return;
}
final String location = headers.header(HEADER_LOCATION);
if (StringUtils.isEmpty(location)) {
LOGGER.warn("UPNP设置失败(没有描述文件地址):{}", message);
return;
}
final UpnpContext upnpContext = UpnpContext.getInstance();
try {
upnpContext.load(location);
} catch (NetException e) {
LOGGER.error("UPNP端口映射异常:{}", location, e);
} finally {
// 可用才能释放:可能收到不是UPNP消息
if (upnpContext.available()) {
NatContext.getInstance().unlock();
}
}
}
use of com.acgist.snail.pojo.wrapper.HeaderWrapper in project snail by acgist.
the class LocalServiceDiscoveryMessageHandler method onMessage.
@Override
public void onMessage(String message, InetSocketAddress address) {
final HeaderWrapper headers = HeaderWrapper.newInstance(message);
final String host = address.getHostString();
final String port = headers.header(HEADER_PORT);
final String cookie = headers.header(HEADER_COOKIE);
final List<String> list = headers.headerList(HEADER_INFOHASH);
if (StringUtils.isNumeric(port) && CollectionUtils.isNotEmpty(list)) {
final byte[] peerId = StringUtils.unhex(cookie);
if (Arrays.equals(peerId, PeerConfig.getInstance().peerId())) {
LOGGER.debug("本地发现消息处理失败:忽略本机");
} else {
list.forEach(infoHashHex -> this.doInfoHash(host, port, infoHashHex));
}
} else {
LOGGER.debug("本地发现消息处理失败:{}", message);
}
}
use of com.acgist.snail.pojo.wrapper.HeaderWrapper in project snail by acgist.
the class UpnpClient method buildMSearch.
/**
* <p>新建M-SEARCH消息</p>
*
* @return 消息
*/
private String buildMSearch() {
final HeaderWrapper builder = HeaderWrapper.newBuilder(PROTOCOL);
builder.header("HOST", SymbolConfig.Symbol.COLON.join(UpnpServer.upnpHost(), UpnpServer.UPNP_PORT)).header("ST", UpnpServer.UPNP_ROOT_DEVICE).header("MAN", "\"ssdp:discover\"").header("MX", "3");
return builder.build();
}
Aggregations