HTML5-DOM
view release on metacpan or search on metacpan
third_party/modest/source/myurl/parser_end.c view on Meta::CPAN
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Author: lex.borisov@gmail.com (Alexander Borisov)
*/
#include "myurl/url.h"
#include "myurl/parser.h"
#include "myurl/resources.h"
#include "mycore/utils/resources.h"
size_t myurl_parser_state_relative_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size)
{
if(myurl_parser_copy_attr(url, url_base, url_entry, username) != MyURL_STATUS_OK ||
myurl_parser_copy_attr(url, url_base, url_entry, password) != MyURL_STATUS_OK ||
myurl_parser_copy_attr(url, url_base, url_entry, query) != MyURL_STATUS_OK ||
myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK ||
myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK)
{
url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION;
return (data_size + 1);
}
url_entry->port = url_base->port;
url_entry->port_is_set = url_base->port_is_set;
return data_size;
}
size_t myurl_parser_state_authority_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size)
{
if((url_entry->flags & MyURL_FLAGS_AT) && (data_length - url->begin) == 0) {
// parse error
url_entry->status = MyURL_STATUS_FAILURE_AUTHORITY_HOST_AFTER_AUTH;
return (data_size + 1);
}
data_length -= (data_length - url->begin);
url->state = myurl_parser_state_host_hostname;
url->begin = 0;
return data_length;
}
size_t myurl_parser_state_host_hostname_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size)
{
/* 3.1 */
if((url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) && (data_length - url->begin) == 0) {
// parse error
url_entry->status = MyURL_STATUS_FAILURE_UNEXPECTED_ENDING;
return (data_size + 1);
}
/* 3.2 */
if(url->state_override && (data_length - url->begin) == 0 &&
(myurl_parser_is_includes_credentials(url_entry) || url_entry->port_is_set))
{
// parse error
return (data_size + 1);
}
/* 3.3 and 3.4 */
if(myurl_host_parser(url, &url_entry->host, &data[url->begin], (data_length - url->begin),
(url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL)))
{
url_entry->status = MyURL_STATUS_FAILURE_BAD_HOSTNAME;
return (data_size + 1);
}
/* 3.6 */
if(url->state_override)
return (data_size + 1);
/* 3.5 */
url->state = myurl_parser_state_port;
url->begin = 0;
return data_length;
}
size_t myurl_parser_state_port_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size)
{
/* 2.1 */
if((data_length - url->begin))
{
size_t len = url->begin;
unsigned int port = 0;
/* 2.1.1 */
while(len < data_length)
{
if(port > 65535) {
url_entry->status = MyURL_STATUS_FAILURE_BAD_PORT;
return (data_size + 1);
}
port = mycore_string_chars_num_map[ (unsigned char)data[len] ] + port * 10;
len++;
}
/* 2.1.3 */
if(url_entry->scheme.port != port) {
url_entry->port = port;
url_entry->port_is_set = true;
}
}
/* for all 2.1.4 */
url->begin = 0;
/* 2.2 */
if(url->state_override)
return (data_size + 1);
/* 2.3 */
url->state = myurl_parser_state_path_start;
( run in 0.834 second using v1.01-cache-2.11-cpan-e1769b4cff6 )