Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

main.rs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. use std::net::{TcpStream, TcpListener};
  2. use std::io::prelude::*;
  3. use std::fs;
  4. // use std::thread;
  5. // use std::time::Duration;
  6. // use std::str;
  7. use std::path::Path;
  8. use hello::{ThreadPool, Response, Route};
  9. extern crate regex;
  10. use regex::Regex;
  11. fn main() {
  12. let listener = TcpListener::bind("127.0.0.1:26382").unwrap();
  13. let pool = ThreadPool::new(4);
  14. for stream in listener.incoming() {
  15. let stream = stream.unwrap();
  16. pool.execute(|| {
  17. handle_connection(stream);
  18. });
  19. }
  20. println!("Shutting down.");
  21. }
  22. fn handle_connection(mut stream: TcpStream) {
  23. let mut buffer = [0; 512];
  24. stream.read(&mut buffer).unwrap();
  25. let mut r = Response::new("","");
  26. let bf = &String::from_utf8_lossy(&buffer[..]);
  27. // let get = b"GET / HTTP/1.1\r\n";
  28. // let sleep = b"GET /sleep HTTP/1.1\r\n";
  29. if buffer.starts_with(b"GET") {
  30. let hdr = Regex::new(r"GET /([^ ]*) HTTP/1.1").unwrap();
  31. let caps = hdr.captures(&bf);
  32. match caps {
  33. Some(cap) => {
  34. let c = cap.get(1).unwrap().as_str();
  35. route(&c, &mut r);
  36. },
  37. None => {
  38. println!("This wasn't even a well-formed header");
  39. r.set_header("HTTP/1.1 404 NOT FOUND\r\n\r\n");
  40. response_add_file("404.html", &mut r);
  41. }
  42. }
  43. } else {
  44. println!("It didn't start with GET!");
  45. r.set_header("HTTP/1.1 404 NOT FOUND\r\n\r\n");
  46. response_add_file("404.html", &mut r);
  47. }
  48. // println!("Sending {}: {}", r.header, r.path);
  49. let response = format!("{}{}", r.get_header(), r.get_content());
  50. stream.write(response.as_bytes()).unwrap();
  51. stream.flush().unwrap();
  52. // println!("Request: {}", String::from_utf8_lossy(&buffer[..]));
  53. }
  54. fn response_add_file(p: &str, r: &mut Response) {
  55. r.set_content(fs::read_to_string(p).unwrap().as_str());
  56. }
  57. fn route(c: &str, mut r: &mut Response) {
  58. let mut routes = vec![];
  59. routes.push(Route::new("api/hi", hi));
  60. routes.push(Route::new("api/bye", bye));
  61. // println!("Asked to fetch {}", c);
  62. //assert!(Path::new(c).exists());
  63. if c == "" {
  64. println!("Asked to send root!");
  65. r.set_header("HTTP/1.1 200 OK\r\n\r\n");
  66. response_add_file("index.html", &mut r);
  67. } else if c.starts_with("api/") {
  68. let mut iter_routes = routes.into_iter();
  69. let valid_route = iter_routes.find(|&&x| x.get_path() == c);
  70. match valid_route {
  71. Some(rt) => {
  72. (rt.get_action())(&c, &mut r);
  73. },
  74. None => {
  75. none_api(&c, &mut r);
  76. }
  77. }
  78. } else if Path::new(c).exists() {
  79. route_basic(&c, &mut r);
  80. } else {
  81. println!("Asked to send {} and I could not find it", &c);
  82. r.set_header("HTTP/1.1 404 NOT FOUND\r\n\r\n");
  83. response_add_file("404.html", &mut r);
  84. }
  85. }
  86. fn route_basic(c: &&str, mut r: &mut Response) {
  87. if Path::new(c).is_dir() {
  88. let mut cs = c.to_string();
  89. if cs.chars().last().unwrap().to_string() != "/" {
  90. cs.push_str("/");
  91. }
  92. cs.push_str("index.html");
  93. if Path::new(&cs).exists() {
  94. println!("Asked to send {}", &cs);
  95. r.set_header("HTTP/1.1 200 OK\r\n\r\n");
  96. response_add_file(&cs, &mut r);
  97. } else {
  98. println!("Asked to send {} and I couldn't find it", &cs);
  99. r.set_header("HTTP/1.1 404 NOT FOUND\r\n\r\n");
  100. response_add_file("404.html", &mut r);
  101. }
  102. } else {
  103. println!("Asked to send {}", &c);
  104. r.set_header("HTTP/1.1 200 OK\r\n\r\n");
  105. response_add_file(&c, &mut r);
  106. }
  107. }
  108. fn none_api(_c: &&str, r: &mut Response) {
  109. r.set_header("HTTP/1.1 404 NOT FOUND\r\n\r\n");
  110. r.set_content("There is currently no API endpoint at that address.");
  111. }
  112. fn hi(_c: &&str, r: &mut Response) {
  113. r.set_header("HTTP/1.1 200 OK\r\n\r\n");
  114. r.set_content("Hello there!");
  115. }
  116. fn bye(_c: &&str, r: &mut Response) {
  117. r.set_header("HTTP/1.1 200 OK\r\n\r\n");
  118. r.set_content("Leaving so soon?");
  119. }