Line data Source code
1 : /*
2 : +--------------------------------------------------------------------+
3 : | PECL :: http |
4 : +--------------------------------------------------------------------+
5 : | Redistribution and use in source and binary forms, with or without |
6 : | modification, are permitted provided that the conditions mentioned |
7 : | in the accompanying LICENSE file are met. |
8 : +--------------------------------------------------------------------+
9 : | Copyright (c) 2004-2014, Michael Wallner <mike@php.net> |
10 : +--------------------------------------------------------------------+
11 : */
12 :
13 : #include "php_http_api.h"
14 :
15 152 : php_http_version_t *php_http_version_init(php_http_version_t *v, unsigned major, unsigned minor TSRMLS_DC)
16 : {
17 152 : if (!v) {
18 0 : v = emalloc(sizeof(*v));
19 : }
20 :
21 152 : v->major = major;
22 152 : v->minor = minor;
23 :
24 152 : return v;
25 : }
26 :
27 145 : php_http_version_t *php_http_version_parse(php_http_version_t *v, const char *str TSRMLS_DC)
28 : {
29 : php_http_version_t tmp;
30 145 : char separator = 0, *stop = NULL;
31 145 : register const char *ptr = str;
32 :
33 145 : switch (*ptr) {
34 : case 'h':
35 : case 'H':
36 125 : ++ptr; if (*ptr != 't' && *ptr != 'T') break;
37 125 : ++ptr; if (*ptr != 't' && *ptr != 'T') break;
38 125 : ++ptr; if (*ptr != 'p' && *ptr != 'P') break;
39 125 : ++ptr; if (*ptr != '/') break;
40 125 : ++ptr;
41 : /* no break */
42 : default:
43 145 : tmp.major = strtol(ptr, &stop, 10);
44 145 : if (stop && stop != ptr && tmp.major != LONG_MIN && tmp.major != LONG_MAX) {
45 144 : separator = *stop;
46 144 : if (separator) {
47 144 : if (separator != '.' && separator != ',') {
48 1 : php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Non-standard version separator '%c' in HTTP protocol version '%s'", separator, ptr);
49 : }
50 144 : ptr = stop + 1;
51 144 : tmp.minor = strtol(ptr, &stop, 10);
52 : if (tmp.minor != LONG_MIN && tmp.minor != LONG_MAX) {
53 144 : return php_http_version_init(v, tmp.major, tmp.minor TSRMLS_CC);
54 : }
55 : }
56 : }
57 : }
58 :
59 1 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not parse HTTP protocol version '%s'", str);
60 1 : return NULL;
61 : }
62 :
63 34 : void php_http_version_to_string(php_http_version_t *v, char **str, size_t *len, const char *pre, const char *post TSRMLS_DC)
64 : {
65 34 : *len = spprintf(str, 0, "%s%u.%u%s", pre ? pre : "", v->major, v->minor, post ? post : "");
66 34 : }
67 :
68 16 : void php_http_version_dtor(php_http_version_t *v)
69 : {
70 : (void) v;
71 16 : }
72 :
73 0 : void php_http_version_free(php_http_version_t **v)
74 : {
75 0 : if (*v) {
76 0 : php_http_version_dtor(*v);
77 0 : efree(*v);
78 0 : *v = NULL;
79 : }
80 0 : }
81 :
82 : /*
83 : * Local variables:
84 : * tab-width: 4
85 : * c-basic-offset: 4
86 : * End:
87 : * vim600: noet sw=4 ts=4 fdm=marker
88 : * vim<600: noet sw=4 ts=4
89 : */
90 :
|