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 )