X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_request_api.c;h=b6e40344c27001aeba102f149c63ea4b164af5a2;hp=d328161e13eca231b8dd48a601290d93e695f800;hb=280b469e963c4e96a1cc8de6c500ed58aaf629b5;hpb=dcc8cebf561d1e69e77b85fcd73b6a6c56b44748 diff --git a/http_request_api.c b/http_request_api.c index d328161..b6e4034 100644 --- a/http_request_api.c +++ b/http_request_api.c @@ -615,7 +615,10 @@ PHP_HTTP_API STATUS _http_request_prepare(http_request *request, HashTable *opti TSRMLS_FETCH_FROM_CTX(request->tsrm_ls); HTTP_CHECK_CURL_INIT(request->ch, http_curl_init(request), return FAILURE); - + + if (!request->url) { + return FAILURE; + } if (!(storage = http_request_storage_get(request->ch))) { return FAILURE; } @@ -869,12 +872,29 @@ PHP_HTTP_API STATUS _http_request_prepare(http_request *request, HashTable *opti } /* etag */ if ((zoption = http_request_option(request, options, "etag", IS_STRING)) && Z_STRLEN_P(zoption)) { - zend_bool is_quoted = !((Z_STRVAL_P(zoption)[0] != '"') || (Z_STRVAL_P(zoption)[Z_STRLEN_P(zoption)-1] != '"')); + zend_bool is_quoted; phpstr header; - + phpstr_init(&header); - phpstr_appendf(&header, is_quoted?"%s: %s":"%s: \"%s\"", range_req?"If-Match":"If-None-Match", Z_STRVAL_P(zoption)); + phpstr_appendf(&header, "%s: ", range_req?"If-Match":"If-None-Match"); + if ((Z_STRVAL_P(zoption)[0] == '"') && (Z_STRVAL_P(zoption)[Z_STRLEN_P(zoption)-1] == '"')) { + /* properly quoted etag */ + phpstr_append(&header, Z_STRVAL_P(zoption), Z_STRLEN_P(zoption)); + } else if ((Z_STRVAL_P(zoption)[0] == 'W') && (Z_STRVAL_P(zoption)[1] == '/')) { + /* weak etag */ + if ((Z_STRLEN_P(zoption) > 3) && (Z_STRVAL_P(zoption)[2] == '"') && (Z_STRVAL_P(zoption)[Z_STRLEN_P(zoption)-1] == '"')) { + /* quoted */ + phpstr_append(&header, Z_STRVAL_P(zoption), Z_STRLEN_P(zoption)); + } else { + /* unquoted */ + phpstr_appendf(&header, "W/\"%s\"", Z_STRVAL_P(zoption) + 2); + } + } else { + /* assume unquoted etag */ + phpstr_appendf(&header, "\"%s\"", Z_STRVAL_P(zoption)); + } phpstr_fix(&header); + request->_cache.headers = curl_slist_append(request->_cache.headers, PHPSTR_VAL(&header)); phpstr_dtor(&header); }