TestDownloadServer.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Net;
  6. using System.Text;
  7. using System.Threading;
  8. using UnityEngine;
  9. namespace ZenFulcrum.EmbeddedBrowser {
  10. /**
  11. * This runs s simple HTTP server to serve downloads.
  12. * You could do this simpler by overriding WebResources except:
  13. * You can't stream data (we need to test download rates/pause/resume).
  14. * Don't want this example to override localGame either.
  15. */
  16. public class TestDownloadServer : MonoBehaviour {
  17. private HttpListener server;
  18. public int port = 8083;
  19. private volatile bool serverEnabled = true;
  20. public void OnEnable() {
  21. server = new HttpListener();
  22. server.Prefixes.Add("http://localhost:" + port + "/");
  23. server.Start();
  24. serverEnabled = true;
  25. new Thread(ListenThread).Start();
  26. }
  27. private void ListenThread() {
  28. while (serverEnabled) {
  29. var context = server.GetContext();
  30. new Thread(ResponseThread).Start(context);
  31. }
  32. }
  33. private void ResponseThread(object obj) {
  34. var context = (HttpListenerContext)obj;
  35. // Debug.Log("request for " + context.Request.Url.AbsolutePath);
  36. var res = context.Response;
  37. res.StatusCode = 200;
  38. var output = new StreamWriter(res.OutputStream);
  39. Action sendSomeData = () => {
  40. var str = "Lorem ipsum dolor sit amet.\n";
  41. var count = 1024;
  42. res.AddHeader("Content-length", (str.Length * count).ToString());
  43. res.AddHeader("Content-type", "application/octet-stream");
  44. for (int i = 0; i < count; i++) {
  45. output.Write(str);
  46. Thread.Sleep(1);
  47. }
  48. };
  49. var path = context.Request.Url.AbsolutePath;
  50. switch (path) {
  51. case "/basicFile":
  52. sendSomeData();
  53. break;
  54. case "/bigFile": {
  55. var str = "Lorem ipsum dolor sit amet.\n";
  56. long count = 1024 * 1024 * 100;
  57. res.AddHeader("Content-length", (str.Length * count).ToString());
  58. res.AddHeader("Content-type", "application/octet-stream");
  59. //For speed, prep a buffer to bulk move from.
  60. var strBytes = Encoding.ASCII.GetBytes(str);
  61. var buf = new byte[1024 * strBytes.Length];
  62. for (int i = 0; i < 1024; i++) Array.Copy(strBytes, 0, buf, i * strBytes.Length, strBytes.Length);
  63. //Send data
  64. for (int i = 0; i < count / 1024; i++) res.OutputStream.Write(buf, 0, buf.Length);
  65. break;
  66. }
  67. case "/slowFile":
  68. case "/slowPage": {
  69. var str = "Lorem ipsum dolor sit amet.\n";
  70. var count = 1024 * 1024;
  71. res.AddHeader("Content-length", (str.Length * count).ToString());
  72. res.AddHeader("Content-type", path == "/slowFile" ? "application/octet-stream" : "text/plain");
  73. for (int i = 0; i < count; i++) {
  74. output.Write(str);
  75. Thread.Sleep(1);
  76. }
  77. break;
  78. }
  79. case "/textFile": {
  80. res.AddHeader("Content-type", "text/plain");
  81. for (int i = 0; i < 100; i++) output.Write("This is some text!\n");
  82. break;
  83. }
  84. case "/textFileDownload": {
  85. res.AddHeader("Content-type", "text/plain");
  86. res.AddHeader("Content-Disposition", "attachment; filename=\"A Great Document Full of Text.txt\"");
  87. for (int i = 0; i < 100; i++) output.Write("This is some text!\n");
  88. break;
  89. }
  90. case "/ǝpoɔıun«ñämé»":
  91. case "/%C7%9Dpo%C9%94%C4%B1un%C2%AB%C3%B1%C3%A4m%C3%A9%C2%BB":
  92. sendSomeData();
  93. break;
  94. case "/redirectedFile":
  95. res.StatusCode = 302;
  96. res.AddHeader("Location", "/some/other/file/i/was/redirected/to/redirectedResult");
  97. break;
  98. case "/some/other/file/i/was/redirected/to/redirectedResult":
  99. sendSomeData();
  100. break;
  101. default:
  102. context.Response.StatusCode = 404;
  103. output.Write("Not found");
  104. break;
  105. }
  106. output.Close();
  107. }
  108. public void OnDisable() {
  109. serverEnabled = false;
  110. server.Stop();
  111. }
  112. }
  113. }