prodis / correios-frete

Gem para cálculo de frete utilizando o Web Service dos Correios (http://www.correios.com.br/webservices).
http://prodis.blog.br/correios-frete-gem-para-calculo-de-frete-dos-correios
132 stars 54 forks source link

Net::OpenTimeout (execution expired) #19

Closed lymecca closed 8 years ago

lymecca commented 9 years ago

Olá, será que alguém consegue me ajudar, estava tudo funcionando de repente parou! Na máquina local funciona mas no servidor(máquina virtual na maxihost) não. Dá a seguinte msg de erro...

Net::OpenTimeout (execution expired): app/controllers/base_products_controller.rb:221:in `frete'

prodis commented 9 years ago

@lymecca Você verificou se seu servidor está com saída liberada na porta 80? Coloca aqui o código do seu controller onde está dando o erro.

lymecca commented 9 years ago

@prodis obrigada pelo retorno. Vou verificar com o suporte da Maxihost. Segue o método que eu criei...

  def frete  
    @base_product = BaseProduct.find(params[:id])
    comprimento = @base_product.length < 16 ? 16 : @base_product.length
    largura = @base_product.width < 18 ? 18 : @base_product.width
    altura = @base_product.height < 9 ? 9 : @base_product.height

    frete = Correios::Frete::Calculador.new :cep_origem => @base_product.endereco.cep,
                                              :cep_destino => params[:frete][:cep_destino],
                                              :peso => @base_product.weight,
                                              :comprimento => comprimento,
                                              :largura => largura,
                                              :altura => altura
    @servicos = frete.calcular :sedex, :pac

    respond_to do |format|
      format.json { render :show, status: :created, location: @servicos }
      format.js   { render :show, status: :created, location: @servicos }        
    end   
  end            
lymecca commented 9 years ago

@prodis olha a resposta que obtive do suporte da Maxihost...

No momento não temos bloqueios na porta 80, pode testar no link http://ping.eu/port-chk/ no entanto, em casos específicos, nosso anti DDoS pode interferir na conexão, para confirmarmos isso, precisa nos informar o IP externo que precisamos adicionar na whitelist para o acesso ao IP 189.1.164.103.

Qual seria esse ip externo que eles precisam?

prodis commented 9 years ago

O link que eles passaram é para testar entrada na porta 80 e não requisições externas a partir do seu servidor. Teste fazer uma requisição direta para o Web Service dos Correios: http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx. Faça também para qualquer outra URL e veja se o comportamento é o mesmo.

lymecca commented 9 years ago

@prodis desculpe minha ignorância, como eu faço esse teste, é através de wget?

prodis commented 9 years ago

Você pode usar wget ou curl:

curl -i http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx

Ou então via Ruby mesmo:

require 'net/http'
require 'uri'

uri = URI.parse('http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx')
response = Net::HTTP.get_response(uri)
lymecca commented 9 years ago

Tanto o servidor quanto a minha máquina retornaram a mesma coisa...

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 0
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=04fj2doxu4uwhrdgpwh143rg; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Wed, 01 Jul 2015 12:34:42 GMT

Lembrando que local(desenvolvimento) está funcionando normalmente, muito estranho!

Aqui vai o controller completo, se puder ajudar na análise, eu agradeço...

# -*- encoding : utf-8 -*-
class BaseProductsController < ApplicationController
  load_and_authorize_resource param_method: :base_product_params, only: [:create, :edit, :update, :destroy]

  before_action :set_base_product, only: [:edit, :update, :destroy, :delete_by_token]
  before_action :set_categories, only: [:new, :edit]
  before_action :set_maker, only: [:new, :edit]
  before_action :set_albuns, only: [:new, :edit]
  before_action :delete_by_token, only: [:edit]
  before_action :set_sizes, only: [:create, :update]
  before_action :set_array, only: [:index, :show]
  before_action :check_endereco, only: [:new]
  after_action :update_tag, only: [:create, :update]

  skip_before_filter :authenticate_user!, only: [:index, :show, :reset_filterrific, :frete]

  add_breadcrumb "Home", :root_path

  def index
    if session         
      session[:filterrific_base_products] = nil
    end      

    @filterrific = Filterrific.new(
      BaseProduct, 
      params[:filterrific] || session[:filterrific_base_products]
      )
    if params[:category_id]
      @filterrific.with_category = params[:category_id]
      @category = Category.find(params[:category_id])
    end
    if params[:album_id]
      @filterrific.with_album = params[:album_id]
      @album = Album.find(params[:album_id])
    end    
    @base_products = BaseProduct.filterrific_find(@filterrific).paginate(:page => params[:page], :per_page => 20).sorted_by('created_at_desc')
    session[:filterrific_base_products] = @filterrific.to_hash

    if @category
      add_breadcrumb "#{@category.root.name} > #{@category.name}", "/categories/#{@category.id}/base_products"     

      category = @category.root.name.downcase.split.delete_if{|x| @array.include?(x)}.join(',')
      subcategory = @category.name.downcase.split.delete_if{|x| @array.include?(x)}.join(',')

      set_meta_tags(
        title: "#{@category.name} | LiquidaKids", 
        description: "No LiquidaKids você encontra: #{@category.root.name} - #{@category.name}.",
        keywords: "#{category},#{subcategory},liquidakids"
      )
    elsif @album
      add_breadcrumb "#{@album.store.name}", store_path(@album.store)      
      add_breadcrumb "#{@album.title}", "/albuns/#{@album.id}/base_products"      
    else
      add_breadcrumb "Produtos", base_products_path unless @category || @album          

      set_meta_tags(
        title: 'Produtos | LiquidaKids', 
        description: 'Grande variedade de produtos infantil, novos e de desapegos.',
        keywords: "conjunto,vestido,body,camiseta,blusa,calça,melissa,sapatilha, 
        pelúcia,casaco,bota,sandália,tênis,andadores,berços,fantasias,saia,shorts,
        macacões,carter's,gymboree,gap,maiô,liquidakids"
      )
    end      

    respond_to do |format|
      format.html
      format.js
    end    
  end

  def reset_filterrific
    session[:filterrific_base_products] = nil
    redirect_to :back
  end

  def show
    @base_product = BaseProduct.find(params[:id])
    @category = Category.find(@base_product.category_id)
    @photos = @base_product.photos.all
    @store = @base_product.user.store
    @email_form = EmailForm.new    
    @related = BaseProduct.where(:category => @base_product.category).order('random()').limit(12)
    @related = @related.where.not(id: @base_product)

    add_breadcrumb "#{@base_product.user.store.name.downcase}", store_path(@base_product.user.store)
    if @base_product.album
      add_breadcrumb "#{@base_product.album.title.downcase}", album_base_products_path(@base_product.album)
    end
    add_breadcrumb "#{@base_product.title.downcase}", base_product_path(@base_product)

    title = @base_product.title.downcase.split.delete_if{|x| @array.include?(x)}.join(',')

    set_meta_tags(
      site: 'LiquidaKids',
      title: "#{@base_product.title}", reverse: true,
      description: "#{@base_product.description}",
      keywords: "#{title},liquidakids",
      # Just don't call html_safe here...
      og: {
        title: "#{@base_product.title} | LiquidaKids",
        type: "og:base_product",
        image: @base_product.photos.any? ? "#{@base_product.photos.first.image_url(:thumb)}" : "",
        :'image:width' =>  217,
        :'image:height' => 217,
        description: "#{@base_product.description}",
        url: request.original_url        
      }
    )
  end

  def new
    @base_product = BaseProduct.new
    @base_product.token = @base_product.generate_token
    @photos = []

    add_breadcrumb "Anunciar", :new_base_product_path    
  end

  def edit
    add_breadcrumb "#{@base_product.user.store.name.downcase}", store_path(@base_product.user.store)    
    if @base_product.album
      add_breadcrumb "#{@base_product.album.title.downcase}", album_base_products_path(@base_product.album)
    end      
    add_breadcrumb "#{@base_product.title.downcase}", base_product_path(@base_product)    
    add_breadcrumb "editar", :edit_base_product_path
  end

  def create
    @base_product = BaseProduct.new(base_product_params)
    @base_product.user_id = current_user.id
    @photos = Photo.where(:base_product_token => @base_product.token)
    @base_product.photos << @photos

    respond_to do |format|
      if @base_product.save
        add_photos unless params[:image].nil?
        format.html { redirect_to @base_product, notice: 'Produto criado com sucesso.' }
      else
        format.html { render action: 'new' }
      end
    end
  end

  def update
    @photos = Photo.where(base_product_id: nil).where(base_product_token: @base_product.token)
    @base_product.photos << @photos

    respond_to do |format|
      if params[:photo_ids]
        remove_photos      
      end        
      if @base_product.update(base_product_params)    
        format.html { redirect_to for_sale_path(@base_product.store), notice: 'Produto atualizado com sucesso.' }
        format.json { render :show, status: :ok, location: @base_product }
      else
        format.html { render :edit }
        format.json { render json: @base_product.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @base_product.destroy
    respond_to do |format|
      format.html { redirect_to :back, notice: 'Produto deletado com sucesso.' }
      format.json { head :no_content }
    end
  end

  def create_follow
    followed = BaseProduct.find(params[:follow][:followed_id])
    follower = current_user

    respond_to do |format|
      if follower.follow(followed)
        format.html { redirect_to :back, notice: 'Produto adicionado na sua lista de favoritos.' }
        format.json { render :back, status: :ok }
      else
        format.html { redirect_to :back, notice: 'Falha na comunicação, tente novamente.' }
        format.json { render :back, status: :unprocessable_entity }
      end
    end    
  end

  def delete_follow
    followed = BaseProduct.find(params[:unfollow][:followed_id])
    follower = current_user

    respond_to do |format|
      if follower.stop_following(followed)
        format.html { redirect_to :back, notice: 'Produto removido da sua lista de favoritos.' }
        format.json { render :back, status: :ok }
      else
        format.html { redirect_to :back, notice: 'Falha na comunicação, tente novamente.'  }
        format.json { render :back, status: :unprocessable_entity }
      end
    end    
  end

  def delete_by_token
    photos = Photo.where("base_product_token = ? AND base_product_id IS ?", @base_product.token, nil)
    if photos.any?
      photos.each do |p|
        p.destroy
      end
    end  
  end

  def frete  
    @base_product = BaseProduct.find(params[:id])
    comprimento = @base_product.length < 16 ? 16 : @base_product.length
    largura = @base_product.width < 18 ? 18 : @base_product.width
    altura = @base_product.height < 9 ? 9 : @base_product.height

    frete = Correios::Frete::Calculador.new :cep_origem => @base_product.endereco.cep,
                                              :cep_destino => params[:frete][:cep_destino],
                                              :peso => @base_product.weight,
                                              :comprimento => comprimento,
                                              :largura => largura,
                                              :altura => altura
    @servicos = frete.calcular :sedex, :pac

    respond_to do |format|
      format.json { render :show, status: :created, location: @servicos }
      format.js   { render :show, status: :created, location: @servicos }        
    end   
  end                                              

  private

  def update_tag
    photos = Photo.where(:base_product_token => @base_product.token)
    if photos.any?
      photos.each do |p|
        my_public_id = p.image.file.public_id
        Cloudinary::Api.update(my_public_id, :tags => "product_photo")
      end  
    end
  end

  # Use callbacks to share common setup or constraints between actions.
  def set_base_product
    @base_product = BaseProduct.find(params[:id])
    @parent = Category.find(@base_product.category_id).parent
  end

  def set_categories
    @ancestors = Category.roots  
    @descendants = Category.select_descendants        
  end

  def set_maker
    @makers = Category.select_makers
  end  

  def set_sizes 
    if params[:base_product][:sizes].size > 1
      params[:base_product][:sizes].delete("")
    end  
  end  

  def set_albuns 
    @album = Album.new
    @albuns = current_user.store.albuns
  end

  def set_array
    @array  = ["","o","a","para","de","-","3","e"]      
  end      

  def check_endereco
    if current_user.endereco.cep.blank? || current_user.endereco.estado_id.nil?
      flash[:notice] = 'Antes anúnciar, por favor, atualize os dados abaixo...'
      redirect_to edit_endereco_path(current_user.endereco)
    end  
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def base_product_params
    params.require(:base_product).permit(:title, :description, :gender, :hide_price, :cover,
      :recommended, :search_list, 
      :status, :price, :user_id, :tipo, :category_id, :maker_id, :album_id, :situation, :token,
      :width, :height, :length, :weight, sizes: [],
      photos_attributes: [:id, :image, :_destroy])
  end
end
prodis commented 9 years ago

Fez o teste via Ruby?

lymecca commented 9 years ago

Fiz via curl -i http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx. Será que é melhor fazer via Ruby? Quem gem tenho que instalar?

prodis commented 9 years ago

Usa o Rails console da sua aplicação no servidor.

lymecca commented 9 years ago

Retornou ok... Net::HTTPOK 200 OK readbody=true

prodis commented 9 years ago

Agora pelo Rails console, faça um cálculo de frete qualquer usando a gem correios-frete.

giubueno commented 8 years ago

Hey, @lymecca, acredito que isso não seja um problema dessa gem. Poderia fechar a issue por favor?