- add http_parse_params()
[m6w6/ext-http] / php_http_api.h
index cbbaf6f7dd1af2a55d34fc391f5fd835dfc7e825..ac56e9a295602976d8a6fe8c86ed060d2b8e2dcf 100644 (file)
@@ -29,9 +29,6 @@ PHP_HTTP_API long _http_support(long feature);
 #define pretty_key(key, key_len, uctitle, xhyphen) _http_pretty_key(key, key_len, uctitle, xhyphen)
 extern char *_http_pretty_key(char *key, size_t key_len, zend_bool uctitle, zend_bool xhyphen);
 
-#define http_parse_cookie(l, i) _http_parse_cookie((l), (i) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_parse_cookie(const char *list, HashTable *items TSRMLS_DC);
-
 #define http_error(type, code, string) _http_error_ex(type, code, "%s", string)
 #define http_error_ex _http_error_ex
 extern void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...);
@@ -122,19 +119,35 @@ PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_
 #define http_get_request_body_stream() _http_get_request_body_stream(TSRMLS_C)
 PHP_HTTP_API php_stream *_http_get_request_body_stream(TSRMLS_D);
 
+
+typedef void (*http_parse_params_callback)(void *cb_arg, const char *key, int keylen, const char *val, int vallen TSRMLS_DC);
+
+#define http_parse_params_default_callback _http_parse_params_default_callback
+PHP_HTTP_API void _http_parse_params_default_callback(void *ht, const char *key, int keylen, const char *val, int vallen TSRMLS_DC);
+
+#define http_parse_params(s, ht) _http_parse_params_ex((s), 1, _http_parse_params_default_callback, (ht) TSRMLS_CC)
+#define http_parse_params_ex(s, comma, cb, a) _http_parse_params_ex((s), (comma), (cb), (a) TSRMLS_CC)
+PHP_HTTP_API STATUS _http_parse_params_ex(const char *params, int alloc_comma_sep, http_parse_params_callback cb, void *cb_arg TSRMLS_DC);
+
+
 #define http_locate_body _http_locate_body
 static inline const char *_http_locate_body(const char *message)
 {
-       const char *cr = strstr(message, "\r\n\r\n");
-       const char *lf = strstr(message, "\n\n");
-
-       if (lf && cr) {
-               return MIN(lf + 2, cr + 4);
-       } else if (lf || cr) {
-               return MAX(lf + 2, cr + 4);
-       } else {
-               return NULL;
+       const char *body = NULL, *msg = message;
+       
+       while (*msg) {
+               if (*msg == '\n') {
+                       if (*(msg+1) == '\n') {
+                               body = msg + 2;
+                               break;
+                       } else if (*(msg+1) == '\r' && *(msg+2) == '\n' && msg != message && *(msg-1) == '\r') {
+                               body = msg + 3;
+                               break;
+                       }
+               }
+               ++msg;
        }
+       return body;
 }
 
 #define http_locate_eol _http_locate_eol