flush
[m6w6/ext-http] / http_api.c
index 5a0dd3728a8a4f655bbb609d89b0aca73b071935..da469a92b8a7d7b95b4ff5b3a3ded8a26cfcc320 100644 (file)
@@ -101,6 +101,20 @@ STATUS _http_exit_ex(int status, char *header, zend_bool free_header TSRMLS_DC)
 }
 /* }}} */
 
+/* {{{ STATUS http_check_method(char *) */
+STATUS _http_check_method_ex(const char *method, const char *methods)
+{
+       const char *found;
+
+       if (    (found = strstr(methods, method)) &&
+                       (found == method || !isalpha(found[-1])) &&
+                       (!isalpha(found[strlen(method) + 1]))) {
+               return SUCCESS;
+       }
+       return FAILURE;
+}
+/* }}} */
+
 /* {{{ zval *http_get_server_var_ex(char *, size_t) */
 PHP_HTTP_API zval *_http_get_server_var_ex(const char *key, size_t key_size, zend_bool check TSRMLS_DC)
 {
@@ -117,8 +131,8 @@ PHP_HTTP_API zval *_http_get_server_var_ex(const char *key, size_t key_size, zen
 /* }}} */
 
 
-/* {{{ STATUS http_chunked_decode(char *, size_t, char **, size_t *) */
-PHP_HTTP_API STATUS _http_chunked_decode(const char *encoded, size_t encoded_len,
+/* {{{ char *http_chunked_decode(char *, size_t, char **, size_t *) */
+PHP_HTTP_API const char *_http_chunked_decode(const char *encoded, size_t encoded_len,
        char **decoded, size_t *decoded_len TSRMLS_DC)
 {
        const char *e_ptr;
@@ -139,23 +153,11 @@ PHP_HTTP_API STATUS _http_chunked_decode(const char *encoded, size_t encoded_len
                        if (i == 9) {
                                http_error_ex(E_WARNING, HTTP_E_PARSE, "Chunk size is too long: 0x%s...", hex_len);
                                efree(*decoded);
-                               return FAILURE;
+                               return NULL;
                        }
                        hex_len[i++] = *e_ptr++;
                }
 
-               /* reached the end */
-               if (!strcmp(hex_len, "0")) {
-                       break;
-               }
-
-               /* new line */
-               if (strncmp(e_ptr, HTTP_CRLF, 2)) {
-                       http_error_ex(E_WARNING, HTTP_E_PARSE, "Invalid character (expected 0x0D 0x0A; got: %x %x)", *e_ptr, *(e_ptr + 1));
-                       efree(*decoded);
-                       return FAILURE;
-               }
-
                /* hex to long */
                {
                        char *error = NULL;
@@ -163,17 +165,30 @@ PHP_HTTP_API STATUS _http_chunked_decode(const char *encoded, size_t encoded_len
                        if (error == hex_len) {
                                http_error_ex(E_WARNING, HTTP_E_PARSE, "Invalid chunk size string: '%s'", hex_len);
                                efree(*decoded);
-                               return FAILURE;
+                               return NULL;
                        }
                }
 
+               /* reached the end */
+               if (!chunk_len) {
+                       break;
+               }
+
+               /* new line */
+               if (strncmp(e_ptr, HTTP_CRLF, 2)) {
+                       http_error_ex(E_WARNING, HTTP_E_PARSE,
+                               "Invalid character (expected 0x0D 0x0A; got: 0x%x 0x%x)", *e_ptr, *(e_ptr + 1));
+                       efree(*decoded);
+                       return NULL;
+               }
+
                memcpy(d_ptr, e_ptr += 2, chunk_len);
                d_ptr += chunk_len;
                e_ptr += chunk_len + 2;
                *decoded_len += chunk_len;
        }
 
-       return SUCCESS;
+       return e_ptr;
 }
 /* }}} */
 
@@ -209,7 +224,7 @@ PHP_HTTP_API STATUS _http_split_response_ex(char *response, size_t response_len,
                memcpy(*body, real_body, *body_len);
        }
 
-       return http_parse_headers_ex(header, real_body ? response_len - *body_len : response_len, headers, 1);
+       return http_parse_headers_ex(header, headers, 1);
 }
 /* }}} */