ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE3/plugins/opOpenSocialPlugin/trunk/lib/vendor/Shindig/src/social/servlet/DataServiceServlet.php @ 8979

Last change on this file since 8979 was 8979, checked in by ShogoKawahara, 12 years ago

updated Shindig library

File size: 6.7 KB
Line 
1<?php
2/*
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 *     http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations under the License.
18 */
19
20class DataServiceServlet extends ApiServlet {
21       
22        protected static $FORMAT_PARAM = "format";
23        protected static $ATOM_FORMAT = "atom";
24        protected static $XML_FORMAT = "atom";
25       
26        public static $PEOPLE_ROUTE = "people";
27        public static $ACTIVITY_ROUTE = "activities";
28        public static $APPDATA_ROUTE = "appdata";
29        public static $MESSAGE_ROUTE = "messages";
30
31        public function doGet()
32        {
33                $this->doPost();
34        }
35
36        public function doPut()
37        {
38                $this->doPost();
39        }
40
41        public function doDelete()
42        {
43                $this->doPost();
44        }
45
46        public function doPost()
47        {
48                $xrdsLocation = Config::get('xrds_location');
49                if ($xrdsLocation) {
50                        header("X-XRDS-Location: $xrdsLocation", false);
51                }
52                try {
53                        $token = $this->getSecurityToken();
54                        if ($token == null) {
55                                $this->sendSecurityError();
56                                return;
57                        }
58                        $inputConverter = $this->getInputConverterForRequest();
59                        $outputConverter = $this->getOutputConverterForRequest();
60                        $this->handleSingleRequest($token, $inputConverter, $outputConverter);
61                } catch (Exception $e) {
62                        $code = '500 Internal Server Error';
63                        header("HTTP/1.0 $code", true);
64                        echo "<h1>$code - Internal Server Error</h1>\n" . $e->getMessage();
65                        if (Config::get('debug')) {
66                                echo "\n\n<br>\nDebug backtrace:\n<br>\n<pre>\n";
67                                echo $e->getTraceAsString();
68                                echo "\n</pre>\n";
69                        }
70                }
71        }
72
73        public function sendError(ResponseItem $responseItem)
74        {
75                $unauthorized = false;
76                $errorMessage = $responseItem->getErrorMessage();
77                switch ($responseItem->getError()) {
78                        case ResponseError::$BAD_REQUEST:
79                                $code = '400 Bad Request';
80                                break;
81                        case ResponseError::$UNAUTHORIZED:
82                                $code = '401 Unauthorized';
83                                $unauthorized = true;
84                                break;
85                        case ResponseError::$FORBIDDEN:
86                                $code = '403 Forbidden';
87                                break;
88                        case ResponseError::$FORBIDDEN:
89                                $code = '404 Not Found';
90                                break;
91                        case ResponseError::$NOT_IMPLEMENTED:
92                                $code = '501 Not Implemented';
93                                break;
94                        case ResponseError::$INTERNAL_ERROR:
95                        default:
96                                $code = '500 Internal Server Error';
97                                break;
98                }
99                header("HTTP/1.0 $code", true);
100                if ($unauthorized)
101                        header("WWW-Authenticate: OAuth realm", true);
102                echo "$code - $errorMessage";
103                die();
104        }
105
106        /**
107         * Handler for non-batch requests (REST only has non-batch requests)
108         */
109        private function handleSingleRequest(SecurityToken $token, $inputConverter, $outputConverter)
110        {
111                $servletRequest = array(
112                                'url' => substr($_SERVER["REQUEST_URI"], strlen(Config::get('web_prefix') . '/social/rest')));
113                if (isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
114                        $servletRequest['postData'] = $GLOBALS['HTTP_RAW_POST_DATA'];
115                        if (get_magic_quotes_gpc()) {
116                                $servletRequest['postData'] = stripslashes($servletRequest['postData']);
117                        }
118                }
119                $requestItem = RestRequestItem::createWithRequest($servletRequest, $token, $inputConverter, $outputConverter);
120                $responseItem = $this->getResponseItem($this->handleRequestItem($requestItem));
121                if ($responseItem->getError() == null) {
122                        $outputConverter->outputResponse($responseItem, $requestItem);
123                } else {
124                        $this->sendError($responseItem);
125                }
126        }
127
128        /**
129         * Returns the output converter to use
130         *
131         * @return OutputConverter
132         */
133        private function getOutputConverterForRequest()
134        {
135                $outputFormat = strtolower(trim(! empty($_POST[self::$FORMAT_PARAM]) ? $_POST[self::$FORMAT_PARAM] : (! empty($_GET[self::$FORMAT_PARAM]) ? $_GET[self::$FORMAT_PARAM] : 'json')));
136                switch ($outputFormat) {
137                        case 'xml':
138                                return new OutputXmlConverter();
139                        case 'atom':
140                                return new OutputAtomConverter();
141                        case 'json':
142                                return new OutputJsonConverter();
143                        default:
144                                // if no output format is set, see if we can match an input format header
145                                // if not, default to json
146                                if (isset($_SERVER['CONTENT_TYPE'])) {
147                                        switch ($_SERVER['CONTENT_TYPE']) {
148                                                case 'application/atom+xml':
149                                                        return new OutputAtomConverter();
150                                                case 'application/xml':
151                                                        return new OutputXmlConverter();
152                                                default:
153                                                case 'application/json':
154                                                        return new OutputJsonConverter();
155                                        }
156                                }
157                                break;
158                }
159                // just to satisfy the code scanner, code is actually unreachable
160                return null;
161        }
162
163        /**
164         * Returns the input converter to use
165         *
166         * @return InputConverter
167         */
168        private function getInputConverterForRequest()
169        {
170                $inputFormat = $this->getInputRequestFormat();
171                switch ($inputFormat) {
172                        case 'xml':
173                                return new InputXmlConverter();
174                        case 'atom':
175                                return new InputAtomConverter();
176                        case 'json':
177                                return new InputJsonConverter();
178                        default:
179                                throw new Exception("Unknown format param: $inputFormat");
180                }
181        }
182
183        /**
184         * Tries to guess the input format based on the Content-Type
185         * header, of if none is set, the format query param
186         *
187         * @return string request format to use
188         */
189        private function getInputRequestFormat()
190        {
191                // input format is defined by the Content-Type header
192                // if that isn't set we use the &format= param
193                // if that isn't set, we default to json
194                if (isset($_SERVER['CONTENT_TYPE'])) {
195                        switch ($_SERVER['CONTENT_TYPE']) {
196                                case 'application/atom+xml':
197                                        return 'atom';
198                                case 'application/xml':
199                                        return 'xml';
200                                case 'application/json':
201                                default:
202                                        return 'json';
203                        }
204                } else {
205                        // if no Content-Type header is set, we assume the input format will be the same as the &format=<foo> param
206                        // if that isn't set either, we assume json
207                        return strtolower(trim(! empty($_POST[self::$FORMAT_PARAM]) ? $_POST[self::$FORMAT_PARAM] : (! empty($_GET[self::$FORMAT_PARAM]) ? $_GET[self::$FORMAT_PARAM] : 'json')));
208                }
209                // just to satisfy the code scanner, code is actually unreachable
210                return null;
211        }
212
213        /**
214         * Returns the route to use (activities, people, appdata, messages)
215         *
216         * @param string $pathInfo
217         * @return string the route name
218         */
219        private function getRouteFromParameter($pathInfo)
220        {
221                $pathInfo = substr($pathInfo, 1);
222                $indexOfNextPathSeparator = strpos($pathInfo, "/");
223                return $indexOfNextPathSeparator !== false ? substr($pathInfo, 0, $indexOfNextPathSeparator) : $pathInfo;
224        }
225}
Note: See TracBrowser for help on using the repository browser.