|  | @@ -7,7 +7,7 @@ use hyper::Client;
 | 
	
		
			
				|  |  |  use hyper::client;
 | 
	
		
			
				|  |  |  use hyper::header::{ContentType, ETag, EntityTag, IfNoneMatch, Headers};
 | 
	
		
			
				|  |  |  use hyper::server::{Handler, Request, Response};
 | 
	
		
			
				|  |  | -use hyper::status::StatusCode::{NotFound, NotModified, Unauthorized};
 | 
	
		
			
				|  |  | +use hyper::status::StatusCode::{InternalServerError, NotFound, NotModified, Unauthorized};
 | 
	
		
			
				|  |  |  use hyper::uri::RequestUri::AbsolutePath;
 | 
	
		
			
				|  |  |  use rustc_serialize::json;
 | 
	
		
			
				|  |  |  use rustc_serialize::json::Json;
 | 
	
	
		
			
				|  | @@ -106,33 +106,40 @@ impl Handler for SiteHandler {
 | 
	
		
			
				|  |  |                      if a == "zone_load_multi" {
 | 
	
		
			
				|  |  |                          let form_data = form_urlencoded::serialize(¶ms);
 | 
	
		
			
				|  |  |                          let mut proxy_res = self.post(&form_data);
 | 
	
		
			
				|  |  | -                        let mut body = Json::from_reader(&mut proxy_res).unwrap();
 | 
	
		
			
				|  |  | -                        {
 | 
	
		
			
				|  |  | -                            let root = body.as_object_mut().unwrap();
 | 
	
		
			
				|  |  | -                            let response = root.get_mut("response")
 | 
	
		
			
				|  |  | -                                .unwrap()
 | 
	
		
			
				|  |  | -                                .as_object_mut()
 | 
	
		
			
				|  |  | -                                .unwrap();
 | 
	
		
			
				|  |  | -                            let zones = response.get_mut("zones")
 | 
	
		
			
				|  |  | -                                .unwrap()
 | 
	
		
			
				|  |  | -                                .as_object_mut()
 | 
	
		
			
				|  |  | -                                .unwrap();
 | 
	
		
			
				|  |  | -                            let count = {
 | 
	
		
			
				|  |  | -                                let objs = zones.get_mut("objs")
 | 
	
		
			
				|  |  | -                                    .unwrap()
 | 
	
		
			
				|  |  | -                                    .as_array_mut()
 | 
	
		
			
				|  |  | -                                    .unwrap();
 | 
	
		
			
				|  |  | -                                objs.retain(|zone| {
 | 
	
		
			
				|  |  | -                                    let zone_name = zone.find("zone_name").and_then(|name| name.as_string()).unwrap();
 | 
	
		
			
				|  |  | -                                    whitelist.into_iter().any(|domain| domain == zone_name)
 | 
	
		
			
				|  |  | -                                });
 | 
	
		
			
				|  |  | -                                objs.len()
 | 
	
		
			
				|  |  | -                            };
 | 
	
		
			
				|  |  | -                            zones.insert("count".to_string(), Json::U64(count as u64));
 | 
	
		
			
				|  |  | -                        };
 | 
	
		
			
				|  |  | +                        match Json::from_reader(&mut proxy_res) {
 | 
	
		
			
				|  |  | +                            Ok(mut body) => {
 | 
	
		
			
				|  |  | +                                // filter out non-whitelisted domains
 | 
	
		
			
				|  |  | +                                body.as_object_mut()
 | 
	
		
			
				|  |  | +                                    .and_then(|mut root| root.get_mut("response"))
 | 
	
		
			
				|  |  | +                                    .and_then(|mut obj| obj.as_object_mut())
 | 
	
		
			
				|  |  | +                                    .and_then(|mut resp| resp.get_mut("zones"))
 | 
	
		
			
				|  |  | +                                    .and_then(|mut obj| obj.as_object_mut())
 | 
	
		
			
				|  |  | +                                    .map(|mut zones| {
 | 
	
		
			
				|  |  | +                                        let count = {
 | 
	
		
			
				|  |  | +                                            let objs = zones.get_mut("objs")
 | 
	
		
			
				|  |  | +                                                .unwrap()
 | 
	
		
			
				|  |  | +                                                .as_array_mut()
 | 
	
		
			
				|  |  | +                                                .unwrap();
 | 
	
		
			
				|  |  | +                                            objs.retain(|zone| {
 | 
	
		
			
				|  |  | +                                                let zone_name = zone.find("zone_name").and_then(|name| name.as_string()).unwrap();
 | 
	
		
			
				|  |  | +                                                whitelist.into_iter().any(|domain| domain == zone_name)
 | 
	
		
			
				|  |  | +                                            });
 | 
	
		
			
				|  |  | +                                            objs.len()
 | 
	
		
			
				|  |  | +                                        };
 | 
	
		
			
				|  |  | +                                        zones.insert("count".to_string(), Json::U64(count as u64));
 | 
	
		
			
				|  |  | +                                    });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                        res.headers_mut().extend(proxy_res.headers.iter());
 | 
	
		
			
				|  |  | -                        res.send(json::encode(&body).unwrap().as_bytes()).unwrap();
 | 
	
		
			
				|  |  | +                                res.headers_mut().extend(proxy_res.headers.iter());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                let json = json::encode(&body).unwrap();
 | 
	
		
			
				|  |  | +                                res.send(json.as_bytes()).unwrap();
 | 
	
		
			
				|  |  | +                            },
 | 
	
		
			
				|  |  | +                            Err(error) => {
 | 
	
		
			
				|  |  | +                                println!("Error: {}", error);
 | 
	
		
			
				|  |  | +                                *res.status_mut() = InternalServerError;
 | 
	
		
			
				|  |  | +                                res.send(b"Unexpected response from CloudFlare").unwrap();
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        };
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      else if valid {
 | 
	
		
			
				|  |  |                          let form_data = form_urlencoded::serialize(¶ms);
 |