1import httplib2, os, sys, traceback, cgi 2 3from django.http import HttpResponse, HttpResponsePermanentRedirect 4from django.http import HttpResponseServerError 5from django.template import Context, loader 6from autotest_lib.client.common_lib import utils 7from autotest_lib.frontend import views_common 8from autotest_lib.frontend.afe import models, rpc_handler, rpc_interface 9from autotest_lib.frontend.afe import rpc_utils 10 11rpc_handler_obj = rpc_handler.RpcHandler((rpc_interface, ), 12 document_module=rpc_interface) 13 14 15def handle_rpc(request): 16 """Handle the RPC request. 17 18 @param request: the RPC request. 19 """ 20 return rpc_handler_obj.handle_rpc_request(request) 21 22 23def rpc_documentation(request): 24 """Return the rpc documentation. 25 26 @param request: the RPC request. 27 """ 28 return rpc_handler_obj.get_rpc_documentation() 29 30 31def model_documentation(request): 32 """Get the model documentation. 33 34 @param request: the RPC request. 35 """ 36 model_names = ('Label', 'Host', 'Test', 'User', 'AclGroup', 'Job', 37 'AtomicGroup') 38 return views_common.model_documentation(models, model_names) 39 40 41def redirect_with_extra_data(request, url, **kwargs): 42 """Redirect according to the extra data. 43 44 @param request: the RPC request. 45 @param url: the partial redirected url. 46 @param kwargs: the parameters used in redirection. 47 """ 48 kwargs['getdata'] = request.GET.urlencode() 49 kwargs['server_name'] = request.META['SERVER_NAME'] 50 return HttpResponsePermanentRedirect(url % kwargs) 51 52 53GWT_SERVER = 'http://localhost:8888/' 54def gwt_forward(request, forward_addr): 55 """Get the response from forwarding address. 56 57 @param request: the RPC request. 58 @param forward_addr: the forwarding address. 59 """ 60 url = GWT_SERVER + forward_addr 61 if len(request.POST) == 0: 62 headers, content = httplib2.Http().request(url, 'GET') 63 else: 64 headers, content = httplib2.Http().request(url, 'POST', 65 body=request.body) 66 http_response = HttpResponse(content) 67 for header, value in headers.iteritems(): 68 if header not in ('connection',): 69 http_response[header] = value 70 return http_response 71 72 73def handler500(request): 74 """Redirect to error website page. 75 76 @param request: the RPC request. 77 """ 78 t = loader.get_template('500.html') 79 trace = traceback.format_exc() 80 context = Context({ 81 'type': sys.exc_type, 82 'value': sys.exc_value, 83 'traceback': cgi.escape(trace) 84 }) 85 return HttpResponseServerError(t.render(context)) 86 87 88def handle_file_upload(request): 89 """Handler for uploading files. 90 91 Saves the files to /tmp and returns the resulting paths on disk. 92 93 @param request: request containing the file data. 94 95 @returns HttpResponse: with the paths of the saved files. 96 """ 97 if request.method == 'POST': 98 TEMPT_DIR = '/tmp/' 99 file_paths = [] 100 for file_name, upload_file in request.FILES.iteritems(): 101 file_path = os.path.join( 102 TEMPT_DIR, '_'.join([file_name, upload_file.name])) 103 with open(file_path, 'wb+') as destination: 104 for chunk in upload_file.chunks(): 105 destination.write(chunk) 106 file_paths.append(file_path) 107 return HttpResponse(rpc_utils.prepare_for_serialization(file_paths)) 108