public async Task SendMSearchResponseAsync(IMSearchResponse mSearchResponse, IMSearchRequest mSearchRequest) { var wait = new Random(); await Task.Delay(TimeSpan.FromMilliseconds(wait.Next(50, (int)mSearchRequest.MX.TotalMilliseconds))); if (mSearchResponse.ResponseCastMethod != CastMethod.Unicast) { await _httpListener.SendOnMulticast(ComposeMSearchResponseDatagram(mSearchResponse)); } if (int.TryParse(mSearchRequest.TCPPORT, out int tcpSpecifiedRemotePort)) { await SendOnTcp(mSearchRequest.HostIp, tcpSpecifiedRemotePort, ComposeMSearchResponseDatagram(mSearchResponse)); } else { await SendOnTcp(mSearchRequest.HostIp, mSearchRequest.HostPort, ComposeMSearchResponseDatagram(mSearchResponse)); } }
private static byte[] ComposeMSearchResponseDatagram(IMSearchResponse response) { var stringBuilder = new StringBuilder(); stringBuilder.Append($"HTTP/1.1 {response.StatusCode} {response.ResponseReason}\r\n"); stringBuilder.Append($"CACHE-CONTROL: max-age = {response.CacheControl.TotalSeconds}\r\n"); stringBuilder.Append($"DATE: {DateTime.Now:r}\r\n"); stringBuilder.Append($"EXT:\r\n"); stringBuilder.Append($"LOCATION: {response.Location}\r\n"); stringBuilder.Append($"SERVER: " + $"{response.Server.OperatingSystem}/{response.Server.OperatingSystemVersion}/" + $" " + $"UPnP/{response.Server.UpnpMajorVersion}.{response.Server.UpnpMinorVersion}" + $" " + $"{response.Server.ProductName}/{response.Server.ProductVersion}\r\n"); stringBuilder.Append($"ST: {response.ST}\r\n"); stringBuilder.Append($"USN: {response.USN}\r\n"); stringBuilder.Append($"BOOTID.UPNP.ORG: {response.BOOTID}\r\n"); HeaderHelper.AddOptionalHeader(stringBuilder, "CONFIGID.UPNP.ORG", response.CONFIGID); HeaderHelper.AddOptionalHeader(stringBuilder, "SEARCHPORT.UPNP.ORG", response.SEARCHPORT); HeaderHelper.AddOptionalHeader(stringBuilder, "SECURELOCATION.UPNP.ORG", response.SECURELOCATION); // Adding additional vendor specific headers if they exist. if (response.Headers?.Any() ?? false) { foreach (var header in response.Headers) { stringBuilder.Append($"{header.Key}: {header.Value}\r\n"); } } stringBuilder.Append("\r\n"); stringBuilder.Append("\r\n"); return(Encoding.UTF8.GetBytes(stringBuilder.ToString())); }
public async Task MSearchResponse(IMSearchResponse mSearchResponse, IMSearchRequest mSearchRequest) { await SendMSearchResponseAsync(mSearchResponse, mSearchRequest); }