router.php
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:2k
源码类别:

中间件编程

开发平台:

JavaScript

  1. <?php
  2. require('config.php');
  3. class BogusAction {
  4. public $action;
  5. public $method;
  6. public $data;
  7. public $tid;
  8. }
  9. $isForm = false;
  10. $isUpload = false;
  11. if(isset($HTTP_RAW_POST_DATA)){
  12. header('Content-Type: text/javascript');
  13. $data = json_decode($HTTP_RAW_POST_DATA);
  14. }else if(isset($_POST['extAction'])){ // form post
  15. $isForm = true;
  16. $isUpload = $_POST['extUpload'] == 'true';
  17. $data = new BogusAction();
  18. $data->action = $_POST['extAction'];
  19. $data->method = $_POST['extMethod'];
  20.     $data->tid = isset($_POST['extTID']) ? $_POST['extTID'] : null; // not set for upload
  21. $data->data = array($_POST, $_FILES);
  22. }else{
  23. die('Invalid request.');
  24. }
  25. function doRpc($cdata){
  26.     global $API;
  27. try {
  28. if(!isset($API[$cdata->action])){
  29. throw new Exception('Call to undefined action: ' . $cdata->action);
  30. }
  31. $action = $cdata->action;
  32. $a = $API[$action];
  33. doAroundCalls($a['before'], $cdata);
  34. $method = $cdata->method;
  35. $mdef = $a['methods'][$method];
  36. if(!$mdef){
  37. throw new Exception("Call to undefined method: $method on action $action");
  38. }
  39. doAroundCalls($mdef['before'], $cdata);
  40. $r = array(
  41. 'type'=>'rpc',
  42. 'tid'=>$cdata->tid,
  43. 'action'=>$action,
  44. 'method'=>$method
  45. );
  46. require_once("classes/$action.php");
  47. $o = new $action();
  48. $params = isset($cdata->data) && is_array($cdata->data) ? $cdata->data : array();
  49. $r['result'] = call_user_func_array(array($o, $method), $params);
  50. doAroundCalls($mdef['after'], $cdata, $r);
  51. doAroundCalls($a['after'], $cdata, $r);
  52. }
  53. catch(Exception $e){
  54. $r['type'] = 'exception';
  55. $r['message'] = $e->getMessage();
  56. $r['where'] = $e->getTraceAsString();
  57. }
  58. return $r;
  59. }
  60. function doAroundCalls(&$fns, &$cdata, &$returnData=null){
  61. if(!$fns){
  62. return;
  63. }
  64. if(is_array($fns)){
  65. foreach($fns as $f){
  66. $f($cdata, $returnData);
  67. }
  68. }else{
  69. $fns($cdata, $returnData);
  70. }
  71. }
  72. $response = null;
  73. if(is_array($data)){
  74. $response = array();
  75. foreach($data as $d){
  76. $response[] = doRpc($d);
  77. }
  78. }else{
  79. $response = doRpc($data);
  80. }
  81. if($isForm && $isUpload){
  82. echo '<html><body><textarea>';
  83. echo json_encode($response);
  84. echo '</textarea></body></html>';
  85. }else{
  86. echo json_encode($response);
  87. }