github github
  • Home
  • Pricing and Signup
  • Training
  • Gist
  • Blog
  • Login

diogok / restserver

  • Admin
  • Watch Unwatch
  • Fork
  • Your Fork
  • Pull Request
  • Download Source
    • 6
    • 1
  • Source
  • Commits
  • Network (1)
  • Issues (0)
  • Downloads (0)
  • Wiki (1)
  • Graphs
  • Tree: dfbccd2

click here to add a description

click here to add a homepage

  • Switch Branches (1)
    • master
  • Switch Tags (0)
  • Comments
  • Contributors
Sending Request…

RESTful resource/url mapping and MVC, featuring Request an Response objects. — Read more

  Cancel

http://www.phpclasses.org/browse/package/5080.html

  Cancel
  • HTTP
  • Git Read-Only

This URL has Read+Write access

Adding base files
Diogo SOuza da Silva (author)
Tue Feb 17 05:25:01 -0800 2009
commit  dfbccd2f0070d7a75559
tree    ad7786b4d4e2cccc6923
parent  f6144380139d62a39eda
A COPYING.txt 339 •••••
A DOC.txt 103 •••••
A GenericView.class.php 25 •••••
A RestAction.class.php 5 •••••
A RestController.class.php 13 •••••
A RestRequest.class.php 137 •••••
A RestResponse.class.php 56 •••••
A RestServer.class.php 155 •••••
A RestView.class.php 13 •••••
A example/HomeController.class.php 7 •••••
A example/UserController.class.php 25 •••••
A example/UserProfile.class.php 14 •••••
A example/home.php 6 •••••
A example/index.php 37 •••••
A example/userForm.php 9 •••••
A tests/RestServer.test.php 134 •••••
Txt COPYING.txt
  • View file @ dfbccd2
... ...
@@ -0,0 +1,339 @@
  1
+        GNU GENERAL PUBLIC LICENSE
  2
+           Version 2, June 1991
  3
+
  4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
  5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  6
+ Everyone is permitted to copy and distribute verbatim copies
  7
+ of this license document, but changing it is not allowed.
  8
+
  9
+          Preamble
  10
+
  11
+  The licenses for most software are designed to take away your
  12
+freedom to share and change it.  By contrast, the GNU General Public
  13
+License is intended to guarantee your freedom to share and change free
  14
+software--to make sure the software is free for all its users.  This
  15
+General Public License applies to most of the Free Software
  16
+Foundation's software and to any other program whose authors commit to
  17
+using it.  (Some other Free Software Foundation software is covered by
  18
+the GNU Lesser General Public License instead.)  You can apply it to
  19
+your programs, too.
  20
+
  21
+  When we speak of free software, we are referring to freedom, not
  22
+price.  Our General Public Licenses are designed to make sure that you
  23
+have the freedom to distribute copies of free software (and charge for
  24
+this service if you wish), that you receive source code or can get it
  25
+if you want it, that you can change the software or use pieces of it
  26
+in new free programs; and that you know you can do these things.
  27
+
  28
+  To protect your rights, we need to make restrictions that forbid
  29
+anyone to deny you these rights or to ask you to surrender the rights.
  30
+These restrictions translate to certain responsibilities for you if you
  31
+distribute copies of the software, or if you modify it.
  32
+
  33
+  For example, if you distribute copies of such a program, whether
  34
+gratis or for a fee, you must give the recipients all the rights that
  35
+you have.  You must make sure that they, too, receive or can get the
  36
+source code.  And you must show them these terms so they know their
  37
+rights.
  38
+
  39
+  We protect your rights with two steps: (1) copyright the software, and
  40
+(2) offer you this license which gives you legal permission to copy,
  41
+distribute and/or modify the software.
  42
+
  43
+  Also, for each author's protection and ours, we want to make certain
  44
+that everyone understands that there is no warranty for this free
  45
+software.  If the software is modified by someone else and passed on, we
  46
+want its recipients to know that what they have is not the original, so
  47
+that any problems introduced by others will not reflect on the original
  48
+authors' reputations.
  49
+
  50
+  Finally, any free program is threatened constantly by software
  51
+patents.  We wish to avoid the danger that redistributors of a free
  52
+program will individually obtain patent licenses, in effect making the
  53
+program proprietary.  To prevent this, we have made it clear that any
  54
+patent must be licensed for everyone's free use or not licensed at all.
  55
+
  56
+  The precise terms and conditions for copying, distribution and
  57
+modification follow.
  58
+
  59
+        GNU GENERAL PUBLIC LICENSE
  60
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  61
+
  62
+  0. This License applies to any program or other work which contains
  63
+a notice placed by the copyright holder saying it may be distributed
  64
+under the terms of this General Public License.  The "Program", below,
  65
+refers to any such program or work, and a "work based on the Program"
  66
+means either the Program or any derivative work under copyright law:
  67
+that is to say, a work containing the Program or a portion of it,
  68
+either verbatim or with modifications and/or translated into another
  69
+language.  (Hereinafter, translation is included without limitation in
  70
+the term "modification".)  Each licensee is addressed as "you".
  71
+
  72
+Activities other than copying, distribution and modification are not
  73
+covered by this License; they are outside its scope.  The act of
  74
+running the Program is not restricted, and the output from the Program
  75
+is covered only if its contents constitute a work based on the
  76
+Program (independent of having been made by running the Program).
  77
+Whether that is true depends on what the Program does.
  78
+
  79
+  1. You may copy and distribute verbatim copies of the Program's
  80
+source code as you receive it, in any medium, provided that you
  81
+conspicuously and appropriately publish on each copy an appropriate
  82
+copyright notice and disclaimer of warranty; keep intact all the
  83
+notices that refer to this License and to the absence of any warranty;
  84
+and give any other recipients of the Program a copy of this License
  85
+along with the Program.
  86
+
  87
+You may charge a fee for the physical act of transferring a copy, and
  88
+you may at your option offer warranty protection in exchange for a fee.
  89
+
  90
+  2. You may modify your copy or copies of the Program or any portion
  91
+of it, thus forming a work based on the Program, and copy and
  92
+distribute such modifications or work under the terms of Section 1
  93
+above, provided that you also meet all of these conditions:
  94
+
  95
+    a) You must cause the modified files to carry prominent notices
  96
+    stating that you changed the files and the date of any change.
  97
+
  98
+    b) You must cause any work that you distribute or publish, that in
  99
+    whole or in part contains or is derived from the Program or any
  100
+    part thereof, to be licensed as a whole at no charge to all third
  101
+    parties under the terms of this License.
  102
+
  103
+    c) If the modified program normally reads commands interactively
  104
+    when run, you must cause it, when started running for such
  105
+    interactive use in the most ordinary way, to print or display an
  106
+    announcement including an appropriate copyright notice and a
  107
+    notice that there is no warranty (or else, saying that you provide
  108
+    a warranty) and that users may redistribute the program under
  109
+    these conditions, and telling the user how to view a copy of this
  110
+    License.  (Exception: if the Program itself is interactive but
  111
+    does not normally print such an announcement, your work based on
  112
+    the Program is not required to print an announcement.)
  113
+
  114
+These requirements apply to the modified work as a whole.  If
  115
+identifiable sections of that work are not derived from the Program,
  116
+and can be reasonably considered independent and separate works in
  117
+themselves, then this License, and its terms, do not apply to those
  118
+sections when you distribute them as separate works.  But when you
  119
+distribute the same sections as part of a whole which is a work based
  120
+on the Program, the distribution of the whole must be on the terms of
  121
+this License, whose permissions for other licensees extend to the
  122
+entire whole, and thus to each and every part regardless of who wrote it.
  123
+
  124
+Thus, it is not the intent of this section to claim rights or contest
  125
+your rights to work written entirely by you; rather, the intent is to
  126
+exercise the right to control the distribution of derivative or
  127
+collective works based on the Program.
  128
+
  129
+In addition, mere aggregation of another work not based on the Program
  130
+with the Program (or with a work based on the Program) on a volume of
  131
+a storage or distribution medium does not bring the other work under
  132
+the scope of this License.
  133
+
  134
+  3. You may copy and distribute the Program (or a work based on it,
  135
+under Section 2) in object code or executable form under the terms of
  136
+Sections 1 and 2 above provided that you also do one of the following:
  137
+
  138
+    a) Accompany it with the complete corresponding machine-readable
  139
+    source code, which must be distributed under the terms of Sections
  140
+    1 and 2 above on a medium customarily used for software interchange; or,
  141
+
  142
+    b) Accompany it with a written offer, valid for at least three
  143
+    years, to give any third party, for a charge no more than your
  144
+    cost of physically performing source distribution, a complete
  145
+    machine-readable copy of the corresponding source code, to be
  146
+    distributed under the terms of Sections 1 and 2 above on a medium
  147
+    customarily used for software interchange; or,
  148
+
  149
+    c) Accompany it with the information you received as to the offer
  150
+    to distribute corresponding source code.  (This alternative is
  151
+    allowed only for noncommercial distribution and only if you
  152
+    received the program in object code or executable form with such
  153
+    an offer, in accord with Subsection b above.)
  154
+
  155
+The source code for a work means the preferred form of the work for
  156
+making modifications to it.  For an executable work, complete source
  157
+code means all the source code for all modules it contains, plus any
  158
+associated interface definition files, plus the scripts used to
  159
+control compilation and installation of the executable.  However, as a
  160
+special exception, the source code distributed need not include
  161
+anything that is normally distributed (in either source or binary
  162
+form) with the major components (compiler, kernel, and so on) of the
  163
+operating system on which the executable runs, unless that component
  164
+itself accompanies the executable.
  165
+
  166
+If distribution of executable or object code is made by offering
  167
+access to copy from a designated place, then offering equivalent
  168
+access to copy the source code from the same place counts as
  169
+distribution of the source code, even though third parties are not
  170
+compelled to copy the source along with the object code.
  171
+
  172
+  4. You may not copy, modify, sublicense, or distribute the Program
  173
+except as expressly provided under this License.  Any attempt
  174
+otherwise to copy, modify, sublicense or distribute the Program is
  175
+void, and will automatically terminate your rights under this License.
  176
+However, parties who have received copies, or rights, from you under
  177
+this License will not have their licenses terminated so long as such
  178
+parties remain in full compliance.
  179
+
  180
+  5. You are not required to accept this License, since you have not
  181
+signed it.  However, nothing else grants you permission to modify or
  182
+distribute the Program or its derivative works.  These actions are
  183
+prohibited by law if you do not accept this License.  Therefore, by
  184
+modifying or distributing the Program (or any work based on the
  185
+Program), you indicate your acceptance of this License to do so, and
  186
+all its terms and conditions for copying, distributing or modifying
  187
+the Program or works based on it.
  188
+
  189
+  6. Each time you redistribute the Program (or any work based on the
  190
+Program), the recipient automatically receives a license from the
  191
+original licensor to copy, distribute or modify the Program subject to
  192
+these terms and conditions.  You may not impose any further
  193
+restrictions on the recipients' exercise of the rights granted herein.
  194
+You are not responsible for enforcing compliance by third parties to
  195
+this License.
  196
+
  197
+  7. If, as a consequence of a court judgment or allegation of patent
  198
+infringement or for any other reason (not limited to patent issues),
  199
+conditions are imposed on you (whether by court order, agreement or
  200
+otherwise) that contradict the conditions of this License, they do not
  201
+excuse you from the conditions of this License.  If you cannot
  202
+distribute so as to satisfy simultaneously your obligations under this
  203
+License and any other pertinent obligations, then as a consequence you
  204
+may not distribute the Program at all.  For example, if a patent
  205
+license would not permit royalty-free redistribution of the Program by
  206
+all those who receive copies directly or indirectly through you, then
  207
+the only way you could satisfy both it and this License would be to
  208
+refrain entirely from distribution of the Program.
  209
+
  210
+If any portion of this section is held invalid or unenforceable under
  211
+any particular circumstance, the balance of the section is intended to
  212
+apply and the section as a whole is intended to apply in other
  213
+circumstances.
  214
+
  215
+It is not the purpose of this section to induce you to infringe any
  216
+patents or other property right claims or to contest validity of any
  217
+such claims; this section has the sole purpose of protecting the
  218
+integrity of the free software distribution system, which is
  219
+implemented by public license practices.  Many people have made
  220
+generous contributions to the wide range of software distributed
  221
+through that system in reliance on consistent application of that
  222
+system; it is up to the author/donor to decide if he or she is willing
  223
+to distribute software through any other system and a licensee cannot
  224
+impose that choice.
  225
+
  226
+This section is intended to make thoroughly clear what is believed to
  227
+be a consequence of the rest of this License.
  228
+
  229
+  8. If the distribution and/or use of the Program is restricted in
  230
+certain countries either by patents or by copyrighted interfaces, the
  231
+original copyright holder who places the Program under this License
  232
+may add an explicit geographical distribution limitation excluding
  233
+those countries, so that distribution is permitted only in or among
  234
+countries not thus excluded.  In such case, this License incorporates
  235
+the limitation as if written in the body of this License.
  236
+
  237
+  9. The Free Software Foundation may publish revised and/or new versions
  238
+of the General Public License from time to time.  Such new versions will
  239
+be similar in spirit to the present version, but may differ in detail to
  240
+address new problems or concerns.
  241
+
  242
+Each version is given a distinguishing version number.  If the Program
  243
+specifies a version number of this License which applies to it and "any
  244
+later version", you have the option of following the terms and conditions
  245
+either of that version or of any later version published by the Free
  246
+Software Foundation.  If the Program does not specify a version number of
  247
+this License, you may choose any version ever published by the Free Software
  248
+Foundation.
  249
+
  250
+  10. If you wish to incorporate parts of the Program into other free
  251
+programs whose distribution conditions are different, write to the author
  252
+to ask for permission.  For software which is copyrighted by the Free
  253
+Software Foundation, write to the Free Software Foundation; we sometimes
  254
+make exceptions for this.  Our decision will be guided by the two goals
  255
+of preserving the free status of all derivatives of our free software and
  256
+of promoting the sharing and reuse of software generally.
  257
+
  258
+          NO WARRANTY
  259
+
  260
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  261
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
  262
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  263
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  264
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  265
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
  266
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
  267
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  268
+REPAIR OR CORRECTION.
  269
+
  270
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  271
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  272
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
  273
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
  274
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
  275
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
  276
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
  277
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
  278
+POSSIBILITY OF SUCH DAMAGES.
  279
+
  280
+         END OF TERMS AND CONDITIONS
  281
+
  282
+      How to Apply These Terms to Your New Programs
  283
+
  284
+  If you develop a new program, and you want it to be of the greatest
  285
+possible use to the public, the best way to achieve this is to make it
  286
+free software which everyone can redistribute and change under these terms.
  287
+
  288
+  To do so, attach the following notices to the program.  It is safest
  289
+to attach them to the start of each source file to most effectively
  290
+convey the exclusion of warranty; and each file should have at least
  291
+the "copyright" line and a pointer to where the full notice is found.
  292
+
  293
+    <one line to give the program's name and a brief idea of what it does.>
  294
+    Copyright (C) <year>  <name of author>
  295
+
  296
+    This program is free software; you can redistribute it and/or modify
  297
+    it under the terms of the GNU General Public License as published by
  298
+    the Free Software Foundation; either version 2 of the License, or
  299
+    (at your option) any later version.
  300
+
  301
+    This program is distributed in the hope that it will be useful,
  302
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
  303
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  304
+    GNU General Public License for more details.
  305
+
  306
+    You should have received a copy of the GNU General Public License along
  307
+    with this program; if not, write to the Free Software Foundation, Inc.,
  308
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  309
+
  310
+Also add information on how to contact you by electronic and paper mail.
  311
+
  312
+If the program is interactive, make it output a short notice like this
  313
+when it starts in an interactive mode:
  314
+
  315
+    Gnomovision version 69, Copyright (C) year name of author
  316
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  317
+    This is free software, and you are welcome to redistribute it
  318
+    under certain conditions; type `show c' for details.
  319
+
  320
+The hypothetical commands `show w' and `show c' should show the appropriate
  321
+parts of the General Public License.  Of course, the commands you use may
  322
+be called something other than `show w' and `show c'; they could even be
  323
+mouse-clicks or menu items--whatever suits your program.
  324
+
  325
+You should also get your employer (if you work as a programmer) or your
  326
+school, if any, to sign a "copyright disclaimer" for the program, if
  327
+necessary.  Here is a sample; alter the names:
  328
+
  329
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  330
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
  331
+
  332
+  <signature of Ty Coon>, 1 April 1989
  333
+  Ty Coon, President of Vice
  334
+
  335
+This General Public License does not permit incorporating your program into
  336
+proprietary programs.  If your program is a subroutine library, you may
  337
+consider it more useful to permit linking proprietary applications with the
  338
+library.  If this is what you want to do, use the GNU Lesser General
  339
+Public License instead of this License.
Txt DOC.txt
  • View file @ dfbccd2
... ...
@@ -0,0 +1,103 @@
  1
+Explanation:
  2
+
  3
+This product is intended for RESTful webservices or websites. 
  4
+
  5
+The purpose of this class is to Map URLs to Controller classes. The main class is the RestServer, wich is responsible for holding the Request, the Response, the Url map and to make decisions about what to load. 
  6
+
  7
+You can map a URL by calling the method addMap() on a RestServer instance, as above:
  8
+
  9
+$rest = new RestServer ;
  10
+$rest->addMap("GET","/user","UserController");
  11
+
  12
+Instead of processing the requested URL, you may provide one by passing it to
  13
+the RestServer:
  14
+
  15
+$rest = new RestServer($_GET["url"]);
  16
+
  17
+The addMap() method takes three arguments, as follow:
  18
+1- The Request Method, ie:
  19
+1.1- GET, POST, PUT, DELETE, OPTION and others.
  20
+2- The URL pattern is a pearl compatible regular expression, but without delimiters.  Here are some examples:
  21
+2.1- "/","/user","/device/[a-z0-9]+","/post/[0-9]+/comments","/article/[0-9]*/photo/[0-9]*".
  22
+3- A controller/view class, that must implement RestController or RestView.  There are no naming conventions imposed by RestServer.
  23
+3.1- Can also specify a class method such as "Profile::full".  It will not be called staticly.
  24
+
  25
+The Controller(preferred) or View to receive the request must implement RestController or RestView. The RestController should implement the execute() method receiving a RestServer as a parameter, as follow:
  26
+
  27
+class Anything implements RestController {
  28
+    function execute(RestServer $rest) {
  29
+        // Logic here
  30
+        return $rest ;
  31
+    }
  32
+}
  33
+
  34
+And the RestView implementation must use show() method also receiving a RestServer, as follow:
  35
+
  36
+class Anyview implements RestView {
  37
+    function show(RestServer $rest) {
  38
+        //Logic here
  39
+        return $rest;
  40
+    }
  41
+}
  42
+
  43
+Both need to have a parameter-free public constructor(or no constructor at all). Alternative methods must also receive the RestServer as a parameter. Ideally it should always return something, but that's not mandatory. One can return the RestServer, ending the session, or a RestAction(which is any RestController or RestView) to be taken next. Example:
  44
+
  45
+class Anything implements RestController {
  46
+    function execute(RestServer $rest) {
  47
+        return new Anyview ;
  48
+    }
  49
+}
  50
+
  51
+class Anyview implements RestView {
  52
+    function show(RestServer $rest) {
  53
+        return $rest;
  54
+    }
  55
+}
  56
+
  57
+For recovering information about the request taken, the RestServer provides the RestRequest object. You can get it by calling the getRequest() method on the RestServer. There are a few methods available on the RestRequest:
  58
+
  59
+isGet() // If the request is a GET
  60
+isPost() // If the request is a POST
  61
+isPut() // If the request is a PUT
  62
+isDelete() // If the request is a Delete
  63
+getGet($k=null) // Return the $_GET
  64
+getPost($k=null) // Return the $_POST
  65
+getFiles($k=null) // Return the $_FILES
  66
+getPut($k=null) // Return the uploaded content
  67
+getAuthData() // Return the Authentication data for DIGEST auth
  68
+getUser() // Return the User for Basic authentication
  69
+getPassword() // Return the Password for Basic authentication
  70
+getMethod() // Return the Request Method(get, put, post)
  71
+setMethod($m) // Set the Request Method, for action forwarding
  72
+getRequestURI() // Get the URI
  73
+getURIpart($i) // Get Part of the URL, divided by "/"
  74
+getExtension() // Get the URI extension(html, xml, json)
  75
+acceptMime($mime) // If Request accept given MIME type
  76
+
  77
+To build up a response, the RestServer provide the Response Object.  Access it by calling the method getResponse() on the RestServer. The RestResponse gives you the following methods:
  78
+
  79
+cleanResponse() // Erase any response
  80
+addHeader($header) // Adds an HTTP Header
  81
+cleanHeader() // Erase any header
  82
+showHeader() // Show headers
  83
+headerSent() // Returns true if headers were sent
  84
+setResponse($response) // Set the response content.  It could be a string(like an HTML document) or a RestAction
  85
+addResponse($response) // Append a response, string only
  86
+getResponse() // Get the Response content(or class, if RestAction)
  87
+
  88
+Also the RestServer provides a few methods itself:
  89
+
  90
+setParameter($key,$value) // Set a RestServer class parameter
  91
+getParameter($key) // Retrieves a parameter
  92
+setQuery($value,$k=null) // Set the query(uri) to deal with, instead of the Resquest RequestURI
  93
+addMap($method,$uri,$class) // Already covered
  94
+isAuth() // Return true if the object is authenticated
  95
+setAuth($bool) // Set the RestServer authentication
  96
+getQuery($k=null) // Get part of the Query(URI)
  97
+getBaseUrl() // Get the base URL of the service
  98
+getResponse() // Get the RestResponse object
  99
+getRequest() // Get the RestRequest object
  100
+
  101
+See the example for more information.
  102
+
  103
+This was developed by Diogo Souza da Silva <manifesto@manifesto.blog.br>.
Txt GenericView.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,25 @@
  1
+<?
  2
+
  3
+/**
  4
+  * A GenericView representation
  5
+  */
  6
+class GenericView implements RestView {
  7
+
  8
+    protected $file ;
  9
+    protected $props ;
  10
+
  11
+    function __construct($file=null,$props=null) {
  12
+        if($file != null) $this->file = $file ;
  13
+        if($props != null) $this->props = $props ;
  14
+    }
  15
+
  16
+    function show(RestServer $rest) {
  17
+        ob_start();
  18
+        $params = $this->props ;
  19
+        include $this->file ;
  20
+        $content = ob_get_clean();
  21
+        $rest->getResponse()->setResponse($content);
  22
+        return $rest ;
  23
+    }
  24
+}
  25
+?>
Txt RestAction.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,5 @@
  1
+<?
  2
+interface RestAction {
  3
+
  4
+}
  5
+?>
Txt RestController.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,13 @@
  1
+<?php
  2
+
  3
+interface RestController extends RestAction {
  4
+     /**
  5
+       * Execute the Default action of this controller
  6
+       * @param RestServer $restServer
  7
+       * @return RestAction $restVieworController
  8
+       *
  9
+     * */
  10
+    function execute(RestServer $restServer) ;
  11
+}
  12
+
  13
+?>
Txt RestRequest.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,137 @@
  1
+<?
  2
+class RestRequest {
  3
+
  4
+    private $rest ;
  5
+
  6
+    private $requestURI ;
  7
+    private $URIParts ; 
  8
+        
  9
+    private $user ;
  10
+    private $pwd ;
  11
+    private $authData ;
  12
+  
  13
+  private $requestMethod ;
  14
+  private $get ;
  15
+  private $post ;
  16
+    private $files ;
  17
+  
  18
+    public function __construct($rest=null) {
  19
+
  20
+        $this->rest = $rest ;
  21
+            
  22
+    $this->requestMethod = $_SERVER["REQUEST_METHOD"];
  23
+    $this->requestURI = $_SERVER["REQUEST_URI"];
  24
+        $this->URIParts = explode("/",$this->requestURI);
  25
+                
  26
+        $this->authData = $_SERVER['PHP_AUTH_DIGEST'] ;                
  27
+        $this->user = $_SERVER["PHP_AUTH_USER"];
  28
+        $this->pwd = $_SERVER["PHP_AUTH_PW"];
  29
+    
  30
+    $this->get = $_GET ;
  31
+    $this->post = $_POST ;
  32
+        $this->files = $_FILES ;
  33
+    
  34
+    }
  35
+ 
  36
+    public function isGet() {
  37
+        if($this->requestMethod == "GET") {
  38
+            return true ;
  39
+        }
  40
+        return false;
  41
+    }
  42
+
  43
+    public function isPost() {
  44
+       if($this->requestMethod == "POST") {
  45
+           return true ;
  46
+       }
  47
+       return false;
  48
+    }
  49
+
  50
+    public function isPut() {
  51
+       if($this->requestMethod == "PUT") {
  52
+           return true ;
  53
+       }
  54
+       return false;
  55
+    }
  56
+
  57
+    public function isDelete() {
  58
+       if($this->requestMethod == "DELETE") {
  59
+           return true ;
  60
+       }
  61
+       return false;
  62
+    }
  63
+  
  64
+    public function getGet($k=null) {
  65
+        if($k==null) return $this->get ;
  66
+        else return $this->get[$k] ;
  67
+    }
  68
+
  69
+    public function getPost($k=null) {
  70
+        if($k==null) return $this->post ;
  71
+        else return $this->post[$k] ;
  72
+    }
  73
+
  74
+    public function getFiles($k=null) {
  75
+        if($k==null) return $this->files ;
  76
+        else return $this->files[$k];
  77
+    }
  78
+
  79
+    public function getPut($k=null) {
  80
+       $_PUT  = array();
  81
+       if($_SERVER['REQUEST_METHOD'] == 'PUT') {
  82
+           $putdata = file_get_contents('php://input');
  83
+           $exploded = explode('&', $putdata); 
  84
+           foreach($exploded as $pair) {
  85
+               $item = explode('=', $pair);
  86
+               if(count($item) == 2) {
  87
+                   $_PUT[urldecode($item[0])] = urldecode($item[1]);
  88
+               }
  89
+           }
  90
+      }
  91
+      if($k==null)return $_PUT ;
  92
+      else return $_PUT[$k];
  93
+    }
  94
+
  95
+   public function getAuthData() {
  96
+      return $this->authData;
  97
+   }
  98
+   
  99
+   public function getUser() {
  100
+       return $this->user;
  101
+   }
  102
+        
  103
+   public function getPassword() {
  104
+       return $this->pwd ;
  105
+   }
  106
+    
  107
+   public function getMethod() {
  108
+      return $this->requestMethod ;
  109
+   }
  110
+        
  111
+   public function setMethod($m) {
  112
+       $this->requestMethod = $m ;
  113
+   }
  114
+  
  115
+    public function getRequestURI() {
  116
+        return $this->requestURI ;
  117
+    }
  118
+
  119
+    public function getURIpart($i) {
  120
+        return $this->URIParts[$i];
  121
+    }
  122
+
  123
+    public function getExtension() {
  124
+       preg_match('@\.([a-zA-Z0-9]{1,5})$@',$this->rest->getQuery(),$reg);
  125
+       return $reg[1];
  126
+    }
  127
+  
  128
+  public function acceptMime($mime) {
  129
+        if(strpos($_SERVER["HTTP_ACCEPT"],$mime) > 0) {
  130
+            return true ;
  131
+        } else {
  132
+            return false ;
  133
+        }
  134
+  }
  135
+  
  136
+}
  137
+?>
Txt RestResponse.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,56 @@
  1
+<?
  2
+class RestResponse {
  3
+
  4
+    private $rest ; 
  5
+
  6
+    private $headers ;
  7
+    private $response ;
  8
+
  9
+    function __contruct($rest=null) {
  10
+        $this->rest = $rest ;
  11
+    }
  12
+
  13
+    public function cleanResponse() {
  14
+        $this->response = null ;
  15
+        return $this ;
  16
+    }
  17
+  
  18
+  public function addHeader($header) {
  19
+        $this->headers[] = $header;
  20
+        return $this  ;
  21
+  }
  22
+  
  23
+  public function cleanHeader() {
  24
+        $this->headers = Array();
  25
+        return $this ;
  26
+  }
  27
+  
  28
+  public function showHeader() {
  29
+        if(count($this->headers) >=1) {
  30
+            foreach($this->headers as $value) {
  31
+                header($value);
  32
+            }
  33
+        }
  34
+        return $this ;
  35
+  }
  36
+  
  37
+  public function headerSent() {
  38
+        return headers_sent();
  39
+  }
  40
+  
  41
+  public function setResponse($response) {
  42
+        $this->response = $response ;
  43
+        return $this ;
  44
+  }
  45
+  
  46
+  public function addResponse($response) {
  47
+        $this->response .= $response ;
  48
+        return $this ;
  49
+  }
  50
+
  51
+    public function getResponse() {
  52
+        return $this->response ;
  53
+    }
  54
+
  55
+}
  56
+?>
Txt RestServer.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,155 @@
  1
+<?php
  2
+            
  3
+/**
  4
+  * RestServer is the controller for mapping URL to controllers and dealing with Request/Response and Headers
  5
+  * made with Restful webservices in mind.
  6
+  * By Diogo Souza da Silva <manifesto@manifesto.blog.br>
  7
+  */
  8
+class RestServer {
  9
+  
  10
+    private $auth = true;
  11
+  
  12
+  private $response ;
  13
+    private $request ;
  14
+  private $headerOn = false ;
  15
+  
  16
+  private $baseUrl ; 
  17
+  private $query ;
  18
+  private $qPart;
  19
+  
  20
+  private $map ;
  21
+    private $params ;
  22
+  
  23
+    /** You may pass the query/URI for it to handle */
  24
+    public function __construct($query=null) {
  25
+        $this->request = new RestRequest($this);
  26
+        $this->response = new RestResponse($this);
  27
+            
  28
+    $this->baseUrl = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"]);
  29
+        
  30
+        if($query===null) $this->query = $this->getRequest()->getRequestURI() ;
  31
+        else $this->query = $query ;
  32
+
  33
+    $this->qPart = explode("/",$this->query);
  34
+    }
  35
+    
  36
+    public function setParameter($key,$value) {
  37
+        $this->params[$key] = $value ;
  38
+        return $this ;
  39
+    }
  40
+
  41
+    public function getParameter($key) {
  42
+        return $this->params[$key];
  43
+    }
  44
+    
  45
+  public function setQuery($value,$k=null) {
  46
+       if($k !== null){
  47
+           $this->qPart[$k]  = $value ;               
  48
+       } else {
  49
+         $this->query = $value ;
  50
+         $this->qPart = explode("/",$value );
  51
+       }
  52
+       return $this ;
  53
+  }
  54
+  
  55
+  public function addMap($method,$uri,$class) {
  56
+       $this->map[$method][$uri] = $class ;
  57
+       return $this ;
  58
+  }
  59
+       
  60
+    public function isAuth() {
  61
+       return $this->auth ;
  62
+    }
  63
+        
  64
+    public function setAuth($bool) {
  65
+      $this->auth = $bool;
  66
+       return $this ;
  67
+    }
  68
+    
  69
+    public function getQuery($k=null) { 
  70
+       if($k !== null){
  71
+          return $this->qPart[$k];
  72
+        }
  73
+        return $this->query ;
  74
+    }  
  75
+  
  76
+  public function getBaseUrl() {
  77
+        return $this->baseUrl ;
  78
+  }
  79
+
  80
+  public function getResponse() {
  81
+        return $this->response ;
  82
+  }
  83
+  
  84
+    public function getRequest() {
  85
+        return $this->request ;
  86
+    }
  87
+
  88
+  public function getMap($method,$uri) {
  89
+        $maps = $this->map[$method];
  90
+        if(count($maps) < 1) return false;
  91
+        foreach($maps as $map=>$class) {
  92
+            if(preg_match("%^".$map."$%",$uri) ) {
  93
+                 return $class ;
  94
+            }
  95
+        }
  96
+        return false ;
  97
+  }
  98
+  
  99
+    private function testAuth() {
  100
+         if(!$this->auth) { 
  101
+            $this->getResponse()->cleanHeader();
  102
+            $this->getResponse()->addHeader("HTTP/1.1 401 Unauthorized");
  103
+            $this->getResponse()->addHeader('WWW-Authenticate: Basic realm="Restful"');
  104
+            $this->getResponse()->setResponse("Unauthorized");                  
  105
+            return false ;
  106
+        }
  107
+        return true ;
  108
+    }
  109
+
  110
+  public function execute() {
  111
+            
  112
+        if(!$this->testAuth()) return $this->show();
  113
+           
  114
+            $responseClass = $this->getMap($this->getRequest()->getMethod(),$this->getQuery()) ;
  115
+
  116
+            if(!$responseClass) {
  117
+                $this->getResponse()->cleanHeader();
  118
+                $this->getResponse()->addHeader("HTTP/1.1 404 NOT FOUND");
  119
+                $this->getResponse()->setResponse("HTTP/1.1 404 NOT FOUND");
  120
+                return $this->show();
  121
+            }
  122
+    
  123
+            $parts = explode("::",$responseClass);
  124
+            $responseClass = $parts[0];
  125
+            $responseMethod = $parts[1];
  126
+            $this->call(new $responseClass,$responseMethod);
  127
+
  128
+            return $this->show();    
  129
+  }
  130
+        
  131
+    private function call($class,$method=null) {                  
  132
+        if($class instanceof RestView) {
  133
+            if($method==null) $method="show";
  134
+            $class = $class->$method($this) ;
  135
+        } else if($class instanceof RestController)  {
  136
+            if($method==null) $method="execute";
  137
+            $class = $class->$method($this);
  138
+        }
  139
+
  140
+        if($class instanceof RestAction) return $this->call($class);
  141
+            
  142
+        return $this ;
  143
+    }
  144
+                
  145
+  private function show() {
  146
+        $this->testAuth() ;
  147
+        if(!$this->getResponse()->headerSent()) {
  148
+            $this->getResponse()->showHeader();
  149
+        }
  150
+        return $this->getResponse()->getResponse() ;
  151
+  }
  152
+
  153
+}
  154
+
  155
+?>
Txt RestView.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,13 @@
  1
+<?php
  2
+
  3
+interface RestView extends RestAction {
  4
+    /**
  5
+       * Render this view
  6
+       * Show($restServer)
  7
+       * @param RestServer $restServer
  8
+       * @return string HTML
  9
+       *
  10
+     * */
  11
+    function show(RestServer $restServer) ;
  12
+}
  13
+?>
Txt example/HomeController.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,7 @@
  1
+<?
  2
+class HomeController implements RestController {
  3
+    
  4
+    function execute(RestServer $rest) {
  5
+        return new GenericView("home.php");
  6
+    }
  7
+}
Txt example/UserController.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,25 @@
  1
+<?
  2
+class UserController implements RestController {
  3
+    function execute(RestServer $rest) {
  4
+       return new GenericView("userForm.php") ;
  5
+    }
  6
+
  7
+    function insert($rest) {
  8
+        $post = $rest->getRequest()->getPost();
  9
+        if($post["user"] == null or $post["pwd"] == null or !preg_match("/^[a-zA-Z0-9]+$/",$post["user"])) {
  10
+            $rest->getResponse()->addHeader("HTTP/1.1 406 NOT ACCEPTABLE");
  11
+            $rest->getResponse()->addHeader("Location: ?q=/user");
  12
+            return ;
  13
+        }
  14
+
  15
+        if($rest->getRequest()->getUser() != $post["user"] or $rest->getRequest()->getPassword() != $post["pwd"]) {
  16
+            $rest->setAuth(false);
  17
+        }
  18
+        
  19
+        $rest->getResponse()->addHeader("HTTP/1.1 201 Created");
  20
+        $rest->getResponse()->setResponse("Congratulations, user <a href='?q=/user/".$post["user"]."'>".$post["user"]."</a> created!");
  21
+        return $rest ;
  22
+    }
  23
+}
  24
+
  25
+?>
Txt example/UserProfile.class.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,14 @@
  1
+<?
  2
+
  3
+class UserProfile implements RestView {
  4
+    
  5
+    function show(RestServer $rest) {
  6
+        $user = $rest->getQuery(2);        
  7
+        $rest->getResponse()->setResponse("<h1> User ".$user." </h1>");
  8
+        $rest->getResponse()->addResponse("<p> His profile </p>");
  9
+        return $rest ;
  10
+    }
  11
+}
  12
+
  13
+
  14
+?>
Txt example/home.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,6 @@
  1
+<html>
  2
+<body>
  3
+<h1>Welcome!</h1>
  4
+<p><a href="?q=/user">Make a user</a></p>
  5
+</body>
  6
+</html>
Txt example/index.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,37 @@
  1
+<?
  2
+
  3
+// These are the package classes, should be dealt in autoload
  4
+include '../RestServer.class.php';
  5
+include '../RestAction.class.php';
  6
+include '../RestView.class.php';
  7
+include '../RestController.class.php';
  8
+include '../GenericView.class.php';
  9
+include '../RestRequest.class.php';
  10
+include '../RestResponse.class.php';
  11
+
  12
+// These are the Example classes, autoLoad it
  13
+include 'HomeController.class.php';
  14
+include 'UserController.class.php';
  15
+include 'UserProfile.class.php';
  16
+
  17
+/** Sample aplication showing how to route with RestServer */
  18
+
  19
+$_GET["q"] = ($_GET["q"] != null)?$_GET["q"]:"";
  20
+
  21
+$rest = new RestServer($_GET["q"]);// Using a parameter as we won't have url rewrite here
  22
+
  23
+/**
  24
+* Follows the method addMap(METHOD,URL,CONTROLLER)
  25
+* METHOD area the http methods like GET, POST, DELETE, PUT, OPTIONS...
  26
+* URL is a regular expression pearl compatible for the url pattern
  27
+* CONTROLLER is the RestController class to deal with the url, 
  28
+* may specify the method to call, or execute will be called.
  29
+*/
  30
+$rest->addMap("GET","/?","HomeController");
  31
+$rest->addMap("GET","/user","UserController");
  32
+$rest->addMap("POST","/user","UserController::insert"); // A specific method
  33
+$rest->addMap("GET","/user/[a-zA-Z0-9]+","UserProfile");
  34
+
  35
+echo $rest->execute();
  36
+
  37
+?>
Txt example/userForm.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,9 @@
  1
+<html>
  2
+<body>
  3
+<h1> Make you user </h1>
  4
+<form method="post" action="">
  5
+    <p> Login: <input type="text" name="user" value="" /></p>
  6
+    <p> Password: <input type="password" name="pwd" value="" /><input type="submit" value="Make" /></p>
  7
+</form>
  8
+</body>
  9
+</html>
Txt tests/RestServer.test.php
  • View file @ dfbccd2
... ...
@@ -0,0 +1,134 @@
  1
+<?
  2
+
  3
+    include ("../RestServer.class.php");
  4
+    include ("../RestResponse.class.php");
  5
+    include ("../RestRequest.class.php");
  6
+    include ("../RestAction.class.php");
  7
+    include ("../RestView.class.php");
  8
+    include ("../RestController.class.php");
  9
+        
  10
+    class RC implements RestController {
  11
+        function execute(RestServer $rest) {
  12
+            $rest->getResponse()->setResponse("Yahoo");
  13
+            return $rest ;
  14
+        }
  15
+
  16
+        function rock(RestServer $rest) {
  17
+            $rest->getResponse()->setResponse("We rock!");
  18
+            return $rest ;
  19
+        }
  20
+    }
  21
+    
  22
+    class RC2 implements RestController {
  23
+        function execute(RestServer $rest) {
  24
+            return new view2();
  25
+        }
  26
+    }
  27
+    
  28
+    class view implements RestView {
  29
+      function show(RestServer $rest) {
  30
+          $rest->getResponse()->addResponse("Google");
  31
+          return $rest ;
  32
+      }
  33
+    }
  34
+    
  35
+    class view2 implements RestView {
  36
+        function show(RestServer $rest) {
  37
+            if($rest->getRequest()->getExtension() == "html") {
  38
+                $rest->getResponse()->setResponse("Its in HTML");
  39
+            } else {
  40
+              $rest->getResponse()->setResponse("Plain Text");
  41
+            }
  42
+            return $rest ;
  43
+        }
  44
+    }
  45
+    
  46
+    $rest = new RestServer();
  47
+   
  48
+    $rest->getRequest()->setMethod("GET");
  49
+    $rest->addMap("POST","/user","RC");
  50
+    $rest->addMap("POST","/rock","RC::rock");
  51
+    $rest->addMap("POST","/user/([a-zA-Z0-9]*).?[a-zA-Z]{0,5}","RC2");
  52
+    $rest->addMap("GET","/user","view");
  53
+    $rest->addMap("GET","/rock","RC::rock");
  54
+    $rest->addMap("GET","/user/([a-zA-Z0-9]*).?[a-zA-Z]{0,5}","view2");
  55
+    
  56
+    $q = "/user.html";    
  57
+    $rest->setQuery($q);    
  58
+    if($rest->getQuery() != "/user.html") {
  59
+        echo "Failed at 1";
  60
+        return ;
  61
+    }
  62
+    if($rest->getRequest()->getExtension() != "html") {
  63
+        echo "Failed at 2";
  64
+        return ;
  65
+    }
  66
+    
  67
+    $q = "/user";
  68
+    $rest->setQuery($q);        
  69
+    $response = $rest->execute() ;
  70
+    if($response != "Google") {
  71
+        echo "Failed at 75";
  72
+        return ;
  73
+    }
  74
+    
  75
+    $q = "/rock";
  76
+    $rest->setQuery($q);        
  77
+    $response = $rest->execute() ;
  78
+    if($response != "We rock!") {
  79
+        echo "Failed at 83";
  80
+        return ;
  81
+    };
  82
+    
  83
+    $q = "/user/diogo";
  84
+    $rest->setQuery($q);        
  85
+    $response = $rest->execute() ;
  86
+    if($response != "Plain Text") {
  87
+        echo "Failed at 91";
  88
+        return ;
  89
+    }
  90
+    
  91
+    
  92
+    $q = "/user/diogo.html";
  93
+    $rest->setQuery($q);        
  94
+    $response = $rest->execute() ;
  95
+    if($response != "Its in HTML") {
  96
+        echo "Failed at 100";
  97
+        return ;
  98
+    }
  99
+    
  100
+    
  101
+    $q = "/user";
  102
+    $rest->setQuery($q);  
  103
+    $rest->getRequest()->setMethod("POST");
  104
+    $response = $rest->execute() ;
  105
+    if($response != "Yahoo"){
  106
+       echo "Failed at 110";
  107
+        return ;
  108
+    }
  109
+    
  110
+    $q = "/user/diogo.html";
  111
+    $rest->setQuery($q);  
  112
+    $rest->getRequest()->setMethod("POST");
  113
+    $response = $rest->execute() ;
  114
+    if($response != "Its in HTML") {
  115
+        echo "Failed at 119";
  116
+        return ;
  117
+    }
  118
+    
  119
+    $q = "/user/diogo";
  120
+    $rest->setQuery($q);  
  121
+    $rest->getRequest()->setMethod("POST");
  122
+    $response = $rest->execute() ;
  123
+    if($response != "Plain Text") {
  124
+        echo "Failed at 128";
  125
+        return ;
  126
+    }
  127
+    
  128
+if(!function_exists("xdebug_time_index")) return ;
  129
+
  130
+echo "It took ".round(xdebug_time_index(),5)." seconds \n";
  131
+echo "Used ".round(xdebug_memory_usage()/1024,5)."Kb of Memory\n";
  132
+echo "Used at peak ".round(xdebug_peak_memory_usage()/1024,5)."Kb of Memory\n";
  133
+   
  134
+?>

0 notes on commit dfbccd2

Please log in to comment.
Dedicated Server Powered by the Dedicated Servers and
Cloud Computing of Rackspace Hosting®
  • Blog
  • Support
  • Training
  • Job Board
  • Shop
  • Contact
  • API
  • Status
  • © 2010 GitHub Inc. All rights reserved.
  • Terms of Service
  • Privacy
  • Security
  • English
  • Deutsch
  • Français
  • 日本語
  • Português (BR)
  • 中文
  • See all available languages

Your current locale selection: English. Choose another?

  • English
  • Afrikaans
  • Català
  • Čeština
  • Deutsch
  • Español
  • Français
  • Hrvatski
  • Indonesia
  • Italiano
  • 日本語
  • Nederlands
  • Norsk
  • Polski
  • Português (BR)
  • Српски
  • Svenska
  • 中文