static int check_month(char *month);
static int check_tzone(char *tzone);
+static char *pretty_key(char *key, int key_len, int uctitle, int xhyphen);
+
/* {{{ HAVE_CURL */
#ifdef HTTP_HAVE_CURL
#define http_curl_initbuf(m) _http_curl_initbuf((m) TSRMLS_CC)
/* {{{ static inline char *http_curl_getinfoname(CURLINFO) */
static inline char *_http_curl_getinfoname(CURLINFO i TSRMLS_DC)
{
-#define CASE(I) case CURLINFO_ ##I : return #I
+#define CASE(I) case CURLINFO_ ##I : return pretty_key(estrdup( #I ), strlen(#I), 0, 0)
switch (i)
{
/* CURLINFO_EFFECTIVE_URL = CURLINFO_STRING +1, */
}
/* }}} */
+/* static char *pretty_key(char *, int, int, int) */
+static char *pretty_key(char *key, int key_len, int uctitle, int xhyphen)
+{
+ if (key && key_len) {
+ int i, wasalpha;
+ if (wasalpha = isalpha(key[0])) {
+ key[0] = uctitle ? toupper(key[0]) : tolower(key[0]);
+ }
+ for (i = 1; i < key_len; i++) {
+ if (isalpha(key[i])) {
+ key[i] = ((!wasalpha) && uctitle) ? toupper(key[i]) : tolower(key[i]);
+ wasalpha = 1;
+ } else {
+ if (xhyphen && (key[i] == '_')) {
+ key[i] = '-';
+ }
+ wasalpha = 0;
+ }
+ }
+ }
+ return key;
+}
+/* }}} */
+
/* }}} internals */
/* {{{ public API */
line = header;
- while (header_len > (line - begin)) {
+ while (header_len >= (line - begin)) {
+ int value_len = 0;
+
switch (*line++)
{
case 0:
+ --value_len; /* we don't have CR so value length is one char less */
case '\n':
- if (colon && (*line != ' ') && (*line != '\t')) {
- char *key = estrndup(header, colon - header);
- while (isspace(*(++colon)));
- add_assoc_stringl(array, key, colon, line - colon - 2, 1);
- efree(key);
-
+ if (colon && ((!(*line - 1)) || ((*line != ' ') && (*line != '\t')))) {
+
+ /* skip empty key */
+ if (header != colon) {
+ char *key = estrndup(header, colon - header);
+ value_len += line - colon - 1;
+
+ /* skip leading ws */
+ while (isspace(*(++colon))) --value_len;
+ /* skip trailing ws */
+ while (isspace(colon[value_len - 1])) --value_len;
+
+ if (value_len < 1) {
+ /* hm, empty header? */
+ add_assoc_stringl(array, key, "", 0, 0);
+ } else {
+ add_assoc_stringl(array, key, colon, value_len, 1);
+ }
+ efree(key);
+ }
+
colon = NULL;
+ value_len = 0;
header += line - header;
}
break;
}
/* }}} */
+/* {{{ void http_get_request_headers(zval *) */
+PHP_HTTP_API void _http_get_request_headers(zval *array TSRMLS_DC)
+{
+ char *key;
+
+ for ( zend_hash_internal_pointer_reset(HTTP_SERVER_VARS);
+ zend_hash_get_current_key(HTTP_SERVER_VARS, &key, NULL, 0) != HASH_KEY_NON_EXISTANT;
+ zend_hash_move_forward(HTTP_SERVER_VARS)) {
+ if (!strncmp(key, "HTTP_", 5)) {
+ zval **header;
+ zend_hash_get_current_data(HTTP_SERVER_VARS, (void **) &header);
+ add_assoc_stringl(array, pretty_key(key + 5, strlen(key) - 5, 1, 1), Z_STRVAL_PP(header), Z_STRLEN_PP(header), 1);
+ }
+ }
+}
+/* }}} */
+
/* {{{ HAVE_CURL */
#ifdef HTTP_HAVE_CURL